/* My Sprint My Preferences Pages
----------------------------------------------------*/

	
// basic configuration
(function($) {

	$(function() {

		var originalFormData; //Variable to store form data, it'll be checked by the intercept function to make sure things haven't changed.
		var originalDataObject; //Object version of the original form data (will be populated later)

		var updateMessageAnimation; //To store a timeout that fires the update message fade-out		
		
		var preferencesChangedAndSaved = false; //Variable to determine whether or not any changes to a user's preferences have been saved. If so, the page will reload (making sure the page uses their updated preferences).
				
		//Create a variable to store the form fields that will be validated
		var preferencesFormFields;
		
		//these variables have to be cached due to thw dynamic nature of the form
		var communicationSettingsShortFields;
		var communicationSettingsGranularFields;
		
		//Create a variable to store the current value of the Preferences Header Navigation Drop-down box and account change drop-down box
		var currentPrefsNavSelectValue;
		var currentAccountNavSelectValue;
		
	
		
		function closeIntercept() {
			var returnValue = true; //Do not prevent the close function
			var frmPreferences = $("#frmPreferences");
			if(frmPreferences.hasClass("emailSettings")){
				if($("#manageUserRequests td.myDeviceColumn:visible").hasClass("active")){
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
				}
				
			} 
			else if(frmPreferences.hasClass("communicationEmailSettings")){
				var currentFormData = frmPreferences.serialize();
				
				if(currentFormData.match(/_DARGS/)){
					currentFormData = currentFormData.substring(0, currentFormData.lastIndexOf("&_DARGS"));
				}
				var accountVal = $("#selfrmPrefSelectAccount").serialize();
				if (accountVal != "") {
					currentFormData = currentFormData.replace("&" + accountVal,"");
				}
				
				if(currentFormData != originalFormData){
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
				}
			} 
			else if(frmPreferences.hasClass("airaveDetails")){
				if ($("#manageAiraveDetails #tabsDetails div.selected form input:not(#chk911Terms),#manageAiraveDetails #tabsDetails div.selected form select ").serialize() != originalFormData) {
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
					if (returnValue){
						// trigger omniture tracking
						if(typeof(omniture_Tabs_Discard_alert) != "undefined"){
							omniture_Tabs_Discard_alert();
						}
					}
				}
			} 
			else if(frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("bulkBlockTexts")){
				if ($("#manageUserRequests td.myDeviceColumn:visible").hasClass("active")) { 
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
					//returnValue = true;
				}
			}
			else if(frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockVoice")) {
				if($("#manageUserRequests td.myDeviceColumn:visible").hasClass("active")){
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
				}
			} else if(frmPreferences.hasClass("subscriberStatus")) {
				if(($("#subscriberListWrapper input[type='checkbox']:checked").length > 0) && ($("div.headerWrapperPrimary .updateMessage img[alt='Success']").length == 0)){
					returnValue =  confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
				}
				
			}
			else if(frmPreferences.hasClass("oneTouchSettings")) {
				returnValue = true;
			}
			else if ($("#addDeviceMyPhoneMedia").length > 0) {
				// Do nothing, it should be true
			} 
			else if(frmPreferences.hasClass("myDevice")){
				if ($("#radMyDeviceAttachedOption4:checked").length == 0) {
					$("#txtPhoneEsn").val("");
				}
				if (frmPreferences.serialize() != originalFormData) { 
					returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
				}
			} 
			else if (frmPreferences.serialize() != originalFormData) { 
				returnValue = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
			}
			
			if (returnValue) {
				//remove the onbeforeunload function if it has been defined
				window.onbeforeunload = null;
			}
			
			return returnValue;
		}
		
		function setupPreferencesFormFields(frmPreferences) {
			if (frmPreferences.hasClass("profileSettings")) {
				//Setup fields for the Profile Settings modal
				preferencesFormFields = {
					txtPreferencesUserName: {
						name: "txtPreferencesUserName",
						type: "username",
						required: true,
						mustNotMatch: "txtPreferencesPassword",
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.usernameEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.usernameInvalid"),
						existsErrorMessage: Sprint.fn.getContentString("formFieldErrors.usernameExists"),
						customValidationRule: function(field) {
							
							var fieldValue = field.val();
							var validUsername = "";
							var notMatchesPassword = true;
							
							//First, make sure the value follows the correct format
							if (!Sprint.formFieldTypes.username(field)) {
								//Reset the invalid error message if it's been overwritten
								if (this.temporaryErrorMessage) {
									this.invalidErrorMessage = this.temporaryErrorMessage;
								}
								return false;
							}
							else {
								//Run an ajax request to check and see that this Username is available
								$.ajax({
									data: "validateUsername=true&txtPreferencesUserName="+fieldValue,
									type: "POST",
									url: "/mysprint/pages/secure/BaseAjaxServlet?pageContext=profileSettings", //by sujeeth
									async: false,
									success: function(data) {
										validUsername = parseInt(data);
									},
									error: function(event) {
										validUsername = false;
									}
								});								
							}
							//This conditon changed for PJ005533 card : added by Venkat
							if($("#txtPreferencesDisplayName").length > 0) {
								if (fieldValue.toLowerCase() == frmPreferences.find("[name='txtPreferencesDisplayName']").val().toLowerCase()) {
									notMatchesPassword = false;
								}
							}else {
								if (fieldValue.toLowerCase() == frmPreferences.find("[name='txtPreferencesPassword']").val().toLowerCase()) {
									notMatchesPassword = false;
								}
							}	
							
							if (!validUsername) {
								//re-set the invalid username message to the User Exists message (store the invalid message for use later)
								this.temporaryErrorMessage = this.invalidErrorMessage;
								this.invalidErrorMessage = this.existsErrorMessage;
							}
							//This conditon changed for PJ005533 card : added by Venkat
							if($("#txtPreferencesDisplayName").length > 0){
								if (!notMatchesPassword) {
									validUsername = false;
									this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.usernameMatchesDisplayname");
								};
							} else {
								if (!notMatchesPassword) {
									validUsername = false;
									this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.usernameMatchesPassword");
								};
							}
							
							return validUsername;
						}						
					},
					txtPreferencesPassword: {
						name: "txtPreferencesPassword",
						type: "password_11_3",
						required: true,
						mustNotMatch: "txtPreferencesUserName",
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordInvalid_11_3")
					},
					txtPreferencesPasswordConfirm: {
						name: "txtPreferencesPasswordConfirm",
						type: "match",
						required: true,
						mustMatch: "txtPreferencesPassword",
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordConfirmEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordConfirmInvalid")
					},
					txtPreferencesDisplayName: {
						name: "txtPreferencesDisplayName",
						type: "displayName",
						required: true,
						mustNotMatch: "txtPreferencesUserName",
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.displayNameEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.displayNameInvalid"),
						existsErrorMessage: Sprint.fn.getContentString("formFieldErrors.displayNameExists"),
						customValidationRule: function(field) {
							var fieldValue = field.val();
							var validDisplayName = "";
							
							//First, make sure the value follows the correct format
							if (!Sprint.formFieldTypes.displayName.test(fieldValue)) {
								//Reset the invalid error message if it's been overwritten
								if (preferencesFormFields.txtPreferencesDisplayName.temporaryErrorMessage) {
									preferencesFormFields.txtPreferencesDisplayName.invalidErrorMessage = preferencesFormFields.txtPreferencesDisplayName.temporaryErrorMessage;
								}
								return false;
							}
							else {
								//Run an ajax request to check and see that this Username is available
								$.ajax({
									data: "validateDisplayName=true&txtPreferencesDisplayName="+fieldValue,
									type: "POST",
									url: "/mysprint/pages/secure/BaseAjaxServlet?pageContext=profileSettings", //by sujeeth
									async: false,
									success: function(data) {
										validDisplayName = parseInt(data);
									},
									error: function(event) {
										validDisplayName = false;
									}
								});								
							}
	
							if (!validDisplayName) {
								//re-set the invalid username message to the User Exists message (store the invalid message for use later)
								preferencesFormFields.txtPreferencesDisplayName.temporaryErrorMessage = preferencesFormFields.txtPreferencesDisplayName.invalidErrorMessage;
								preferencesFormFields.txtPreferencesDisplayName.invalidErrorMessage = preferencesFormFields.txtPreferencesDisplayName.existsErrorMessage;
							}
							
							return validDisplayName;
						}						
					}
				};
				
				var currentPasswordValue = frmPreferences.find("#txtPreferencesPassword").val();
				
				//When the user changes the value of the password field, enable the password confirm field.
				frmPreferences.find("#txtPreferencesPassword").bind("keyup", function() {
					if ($.trim($(this).val()) != "" && $(this).val() != currentPasswordValue) {
						frmPreferences.find("#txtPreferencesPasswordConfirm").attr("disabled", "");
					}
					else {
						frmPreferences.find("#txtPreferencesPasswordConfirm").attr("disabled", "disabled");
					}
				});
			}

			// GT: 2.3g Anniversary Gift in Loyalty Offers modal
			else if (frmPreferences.hasClass("anniversaryGift")) {
				// This needs to be done since the radio button is selected by default and submit needs to work
				// even if nothing has changed.
				originalFormData = "";
				preferencesFormFields = {
					txtAnniversaryPhoneNumber: {
						name: "txtAnniversaryPhoneNumber",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid")
					}
				};
				
				// Hide/unhide phone number field depending on the radio button chosen
				var checkAnniversaryGiftRadios = function () {
					if (frmPreferences.find("#rad25Bonus").is(":checked")) {
						preferencesFormFields.txtAnniversaryPhoneNumber.required = true;
						preferencesFormFields.txtAnniversaryPhoneNumber.modified = true;
						
						frmPreferences.find("#anniversary25PhoneNumber").slideDown("fast");
					}
					else {
						//Clear existing errors
						frmPreferences.prev().find("ul.formErrors").remove();
						frmPreferences.find("label.error").remove();
						frmPreferences.find(".error").removeClass("error");
						
						preferencesFormFields.txtAnniversaryPhoneNumber.required = false;
						preferencesFormFields.txtAnniversaryPhoneNumber.modified = false;
						
						frmPreferences.find("#txtAnniversaryPhoneNumber").val("");
						frmPreferences.find("#anniversary25PhoneNumber").slideUp("fast");
					}
				}
				
				frmPreferences.find("input#rad25Bonus, input#rad5Credit").bind("click", checkAnniversaryGiftRadios);
				checkAnniversaryGiftRadios();
			}
			else if (frmPreferences.hasClass("moreAboutMe")) {

				//Setup fields for the More About Me modal
				preferencesFormFields = {
					selPreferencesMonth: {
						name: "selPreferencesMonth",
						type: "select",
						required: false,
						invalidErrorMessage: "Please select your Month of Birth"
					},
					selPreferencesDay: {
						name: "selPreferencesDay",
						type: "select",
						required: false,
						invalidErrorMessage: "Please select your Day of Birth"
					},
					selPreferencesYear: {
						name: "selPreferencesYear",
						type: "select",
						required: false,
						invalidErrorMessage: "Please select your Year of Birth"
					}
				};
				
				//Store the Day options
				var originalDayOptions = frmPreferences.find("#selPreferencesDay").children().clone();
				var originalMonthOptions = frmPreferences.find("#selPreferencesMonth").children().clone();
				
				var checkDateFields = function () {
					var monthList = frmPreferences.find("#selPreferencesMonth");
					var dayList = frmPreferences.find("#selPreferencesDay");
					var yearList = frmPreferences.find("#selPreferencesYear");
				
					var currentMonthValue = monthList.val();
					var currentDayValue = dayList.val();
					var currentYearValue = yearList.val();
					
					var newDayOptions = originalDayOptions.clone();
					var newMonthOptions = originalMonthOptions.clone();

					dayList.empty().append(newDayOptions);
					monthList.empty().append(newMonthOptions);

					if (currentMonthValue == "4" || currentMonthValue == "6" || currentMonthValue == "9" || currentMonthValue == "11") {
						//April, June, September and November have 30 days.
						dayList.children(":last").remove(); //Removes the last item (31)
					}
					else if (currentMonthValue == "2") {
						//Filter the Days list for February
						dayList.children("[value='30'], [value='31']").remove(); //Removes days 31 and 30
						
						//Check to see if the currently selected year is a leap year
						if (!isNaN(parseInt(currentYearValue)) && (parseInt(currentYearValue) - 2008) % 4 != 0) {
							//It's not a leap year, remove day 29
							dayList.children("[value='29']").remove();
						}
					}
					
					//Check to see that the date is not in the future
					var todaysMonth = new Date().getMonth()+1;
					var todaysDay = new Date().getDate();
					var todaysYear = new Date().getFullYear();
					
					if (todaysMonth == currentMonthValue && todaysYear == currentYearValue) {
						//Remove future days
						dayList.children().each(function(i) {
							if (i > todaysDay) {
								$(this).remove();
							}
						});
					}
					
					if (todaysYear == currentYearValue) {
						//Remove future months
						monthList.children().each(function(i) {
							if (i > todaysMonth) {
								$(this).remove();
							}
						});
					}
					//Try and reset the field values - this makes sure that if the user already selected a value (and that day didn't get removed by the above filtering) the lists still "retain" those value
					dayList.val(currentDayValue);
					monthList.val(currentMonthValue);
				}
				
				//Bind event handlers to the date of birth drop-downs to make sure that the values are valid (ie, months that don't have 31 days aren't allowed to select 31, account for leap years, etc.)				
				frmPreferences.find("#selPreferencesMonth, #selPreferencesDay, #selPreferencesYear").bind("change", checkDateFields);
				
			}
			else if (frmPreferences.hasClass("accountsOnMyProfile")) {
				//Setup fields for the Accounts on My Profile modal
				preferencesFormFields = {
				};			
			}
			else if (frmPreferences.hasClass("accountPIN")) {
			
				//Setup functionality for the hide/reveal swap for the PIN field (changes field from a password field with masked input to a plain text field with readable input)
				frmPreferences.find("#revealAccountPIN a").bind("click", function() {
				
					var pinField = frmPreferences.find("#txtPreferencesAccountPIN");
					var newField = $("<input />");
					
					if (pinField.attr("type").toLowerCase() == "password") {
						//Change the type to a regular text field
						newField.attr("type", "text");
						$(this).text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.hidePinMessage"));
					}
					else {
						//Change the type to a password field
						newField.attr("type", "password");
						$(this).text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.revealPinMessage"));
					}

					newField.attr("id", pinField.attr("id"));
					newField.attr("name", pinField.attr("name"));
					newField.attr("class", pinField.attr("class"));
					newField.attr("style", pinField.attr("style"));
					newField.attr("maxlength", pinField.attr("maxlength"));
					newField.attr("value", pinField.val());
					newField.bind("blur", singleFieldValidation);
					
					newField.insertBefore(pinField);
					pinField.remove();
					
					return false;
				});

				//Setup fields for the Account PIN form on Account & Billing modal
				preferencesFormFields = {
					txtPreferencesAccountPIN: {
						name: "txtPreferencesAccountPIN",
						type: "PIN",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.pinEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.pinInvalid"),
						customValidationRule: function(field) {
							/*
								Because the rules for PIN are so complex, we'll need to validate this field on the server-side.
								
								Rules:
								1. PIN must be a 6-10 digit number
								2. PIN cannot contain letters or special characters
								3. PIN cannot match username
								4. PIN cannot contain any substantial part (4 or more consecutive numbers) of your phone number  
								5. PIN cannot contain any substantial part (4 or more consecutive numbers) of your account number
								6. PIN cannot contain any substantial part (4 or more consecutive numbers) of your Tax ID
								7. PIN cannot contain any substantial part (4 or more consecutive numbers) of your Social Security number

								Rule #1 can be handled client-side (Rules #2 & 3 are taken care of by the 6-10 digit number requirement since Usernames must start with a letter)
								
								Rule # 4-7 have to be validated server-side as it's a security risk to pass a user's Tax ID & Social Security number to the HTML page where anyone could see it simply by viewing the source.
							*/

							var fieldValue = field.val();
							var validPIN = "";
							
							//First, make sure the value follows the correct format
							if (!Sprint.formFieldTypes.PIN.test(fieldValue)) {
								return false;
							}
							else {
								//Run an ajax request to check and see that this PIN doesn't violate any of the more complex rules is available
								$.ajax({
									data: "validatePIN=true&"+field.attr("name")+"="+fieldValue+"&hidUserAccountID="+frmPreferences.find("#hidUserAccountID").val(),
									type: "POST",
									url: frmPreferences.find("#hidAccountHandler").val(), //by sujeeth
									async: false,
									dataType: "json",
									success: function(data) {
										validPIN = parseInt(data);
										if (!validPIN) {
											//preferencesFormFields.txtPreferencesAccountPIN.temporaryErrorMessage = preferencesFormFields.txtPreferencesAccountPIN.invalidErrorMessage;
											preferencesFormFields.txtPreferencesAccountPIN.invalidErrorMessage = data.errorMessage;
										}
									},
									error: function(event) {
										validPIN = false;
									}
								});								
							}
	
							return validPIN;						
						}
					},
					txtPreferencesSecurityAnswer: {
						name: "txtPreferencesSecurityAnswer",
						type: "securityAnswer",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.securityHintAnswerEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.securityHintAnswerInvalid")
					}
				};
				
				// toggle security link drawer
				var securityLink = $("#securityLink");
				var securityDetails = $("#securityDetails");
				
				securityLink.bind("click", function(e){
					e.preventDefault();
					if (securityLink.is(".open")) {
						securityDetails.slideUp("normal", function(){
							securityLink.removeClass("open");
						}).removeClass("open");
					} else {
						securityDetails.slideDown("normal", function(){
							securityLink.addClass("open");
						}).addClass("open");
					}
				});
			}
			else if (frmPreferences.hasClass("accountContactInformation")) {
			
				//Setup fields for the Account Contact Information on Account & Billing modal
				preferencesFormFields = {
					txtPreferencesContactFirstName: {
						name: "txtPreferencesContactFirstName",
						type: "firstName",
						required: false,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.firstNameInvalid")
					},
					txtPreferencesContactInitial: {
						name: "txtPreferencesContactInitial",
						type: "initial",
						required: false,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.initialInvalid")
					},
					txtPreferencesContactLastName: {
						name: "txtPreferencesContactLastName",
						type: "lastName",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.lastNameEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.lastNameInvalid")
					},
					txtPreferencesContactPhoneNumber: {
						name: "txtPreferencesContactPhoneNumber",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.contactPhoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid")
					},
					txtPreferencesContactPhoneExtension: {
						name: "txtPreferencesContactPhoneExtension",
						type: "phoneExtension",
						required: false,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneExtensionEmpty")
					},
					txtPreferencesOrderNumber: {
						name: "txtPreferencesOrderNumber",
						type: "addressOrderNumber",
						required: false,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.addressOrderNumberInvalid")
					},
					txtPreferencesStreetAddress: {
						name: "txtPreferencesStreetAddress",
						type: "streetAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.streetAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.streetAddressInvalid")
					},
					txtPreferencesStreetAddressApartment: {
						name: "txtPreferencesStreetAddressApartment",
						type: "text",
						required: false,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.streetApartmentDepartmentInvalid")
					},
					txtPreferencesUrbanization: {
						name: "txtPreferencesUrbanization",
						type: "text",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.addressUrbanizationEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.addressUrbanizationInvalid")
					},
					txtPreferencesCity: {
						name: "txtPreferencesCity",
						type: "city",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.cityEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.cityInvalid")
					},
					txtPreferencesZipCode: {
						name: "txtPreferencesZipCode",
						type: "zipCode",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeInvalid")
					}
				};
				
				var selPreferencesState = frmPreferences.find("#selPreferencesState");
				
				//Make sure that the urbanization field only appears if the state value is set to PR (Peurto Rico)
				var checkForUrbanization = function () {
					$('label.suggestion[for="selPreferencesState"]').remove();
					
					var field = frmPreferences.find("#txtPreferencesUrbanization");
				
					if (selPreferencesState.val() == "PR") {
						//Show urbanization field and set it to be a required field. Also, set the modified flag so that this field will be checked during validation regardless of it's value change
						field.parent().show();

						preferencesFormFields.txtPreferencesUrbanization.required = true;
						preferencesFormFields.txtPreferencesUrbanization.modified = true;
					}
					else {
						//Hide urbanization field, turn off the required field check, set the field as 'not modified', and empty out the value
						field.parent().hide();
						
						preferencesFormFields.txtPreferencesUrbanization.required = false;
						preferencesFormFields.txtPreferencesUrbanization.modified = false;
						
						field.val("");
					}
				}
				
				selPreferencesState.bind("change", checkForUrbanization);
				
				//Check State value right away to determine whether or not the urbanization section should be visible
				checkForUrbanization();
			}
			else if (frmPreferences.hasClass("accountBillSettings")) {
				
				//Setup fields for the Account Bill Settings on Account & Billing modal
				preferencesFormFields = {
					radPreferencesBillDelivery: {
						name: "radPreferencesBillDelivery",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.billDeliveryMethodInvalid")
					},
					radPreferencesBillLanguage: {
						name: "radPreferencesBillLanguage",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.billLanguageInvalid")
					},
					chkPreferencesSpanishAgree: {
						name: "chkPreferencesSpanishAgree",
						type: "checkbox",
						required: false,
						//both error messages will be the same here:						
						emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.spanishAgreeInvalid"),
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.spanishAgreeInvalid")
					}
				};

				//Hide the I agree label if English is selected
				if (frmPreferences.find("#radPreferencesBillLanguageEnglish:checked").length > 0) {
					frmPreferences.find("#lblPreferencesSpanishAgree").hide();
				}
				else {
					//Set the Spanish checkbox to be a required field, but only if the label is visible.
					if ($("#lblPreferencesSpanishAgree").is(":visible")) {
						preferencesFormFields.chkPreferencesSpanishAgree.required = true;
					}
				}
				
				//Make sure it appears if needed
				frmPreferences.find("#radPreferencesBillLanguageEnglish, #radPreferencesBillLanguageSpanish").bind("click", function() {
					if (frmPreferences.find("#radPreferencesBillLanguageEnglish:checked").length > 0) {
						frmPreferences.find("#lblPreferencesSpanishAgree").slideUp("fast");
						
						//Clear any errors related to this field
						frmPreferences.find("label.error").each(function() {
							if ($(this).attr("for") == "chkPreferencesSpanishAgree") {
								$(this).remove();
							}
						});
						
						frmPreferences.find("#chkPreferencesSpanishAgree").removeClass("error");
						
						//Remove the error list if the only error is for the spanish agreement check
						if ($("#preferencesModal ul.formErrors a").length == 1 && $("#preferencesModal ul.formErrors a").attr("href").indexOf("#lblPreferencesSpanishAgree") > -1) {
							$("#preferencesModal ul.formErrors").remove();
						}
						
						//Field is no longer required...
						preferencesFormFields.chkPreferencesSpanishAgree.required = false;
						
						//Unselect the checkbox...
						frmPreferences.find("#chkPreferencesSpanishAgree").attr("checked", "");
					}
					else if (frmPreferences.find("#radPreferencesBillLanguageSpanish:checked").length > 0) {
						frmPreferences.find("#lblPreferencesSpanishAgree").slideDown("fast");
						
						//field is now required
						preferencesFormFields.chkPreferencesSpanishAgree.required = true;
					}
				});
		
				/* Show or hide bill display section based on users choice for bill delivery section */
				if($("#radPreferencesBillDeliveryPost:checked").length <= 0){
					frmPreferences.find("#fieldsetBillDisplay").hide(); //Hide the bill display field by default
				}
				
				//show the bill display field if user selects "Post"
				frmPreferences.find("fieldset.billDelivery label").bind("click", function() {
		
					var selectedRadio = $("#"+$(this).attr("for"));
					
					if (selectedRadio.hasClass(".toggleBillDisplay")) {
						$("#fieldsetBillDisplay").slideDown("medium");
					}
					else {
						$("#fieldsetBillDisplay").slideUp("medium");
					}
				});
				/* START modified for SD 9415569*/
				if(!$('#radPreferencesBillDeliveryEBill').is(":checked") && !$('#radPreferencesBillDeliveryPost').is(":checked")){
				 originalFormData += "&" + "modified=true"; 
				}
				/* END modified for SD 9415569*/
			}
			else if (frmPreferences.hasClass("manageAccounts")) {
			
				preferencesFormFields = { };
				
				var dataChanged = false; //This flag will determine whether or not form fields have changed before the user re-sorts the results table. It's used to keep track of changes in case the user tries to close the modal before saving.				
				var manageUserRequests = frmPreferences.find("#manageUserRequests");
				
				// A sample validation object which will be used to duplicate for all the table fields
				var sampleFieldCheck = {
					name: "",
					type: "",
					required: false,
					invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.nicknameInvalid"),
					customValidationRule: function(field) {
						var nicknameRule = /^[a-zA-Z0-9\.\-_\s\']+$/;
						return nicknameRule.test(field.val());
					}
				};
				
				// For each row in the table, create a new validation object and add it to preferencesFormFields
				manageUserRequests.find("tbody").find("tr").each(function() {
					var newObject = jQuery.extend(true, {}, sampleFieldCheck);
					newObject["name"] = "name_" + $(this).attr("id");
					preferencesFormFields["name_" + $(this).attr("id")] = newObject;
				});
				
				/* Custom string sort function that will sort a string normally, but have empty values appear last (instead of first with the normal array.sort() function) */
				var customStringSort = function (a, b) {
					if (a[0] == "" && b[0] == "") {
						//If both elements are equal
						return 0;
					}
					else if (a[0] != "" && b[0] == "") {
						//a[0] has characters, and b[0] does not. A should come first...
						return -1;
					}
					else if (a[0] == "" && b[0] != "") {
						//b[0] has characters, and a[0] does not. B should come first...
						return 1;
					}
					else {
						//both a[0] and b[0] have characters and are not equal, do a normal sort.
						return (a[0] > b[0])?1:(a[0] < b[0])?-1:0;
					}
				}
				
				
				var manageUserRequestsExcludeColumns = [3, 4];
				
				if (manageUserRequests.find("th.subAccount").length < 1) {
					manageUserRequestsExcludeColumns = [2, 3];
				}
			
				manageUserRequests.sortableTable({
					reverseSort: true,
					pagination: true,
					paginationBelow: false,
					rowsPerPage: 8,
					excludeColumns: manageUserRequestsExcludeColumns,
					columnValueFunctions: [
						function(cell) {
							return cell.find("input").val();
						},
						function(cell) {
							return cell.text();
						},
						function(cell) {
							return cell.text();
						}
					],
					customSortFunctions: [
						customStringSort,
						customStringSort,
						customStringSort					
					],
					beforeSort: function() {
					
						//Check to see if changes have been made to the form data already, if so, reset the dataChanged variable to true
						if (originalFormData != frmPreferences.serialize()) {
							dataChanged = true;
						}
					},
					afterSort: function() {
					
						//If the data didn't change at all before the table got re-sorted, re-set the originalFormData variable to reflect the new sort order.
						if (!dataChanged) {
							originalFormData = frmPreferences.serialize();
						}
					}
				});
				
				// Remove the sort arrow on the selected column
				manageUserRequests.find("th.signIn > a > span").addClass("unsortable");
	
				// Add blur events to the fields
				manageUserRequests.find("input[type='text']").bind("blur", singleFieldValidation).bind("blur", function() {
					// Move the error label for the field to above the field, instead of the default
					// behaviour of coming after the field.
					var errorCellParent = $(this).parent();
					var errorLabel = errorCellParent.find("label.error");
					
					if (errorLabel.length > 0) {
						errorLabel.each(function() {
							$(this).remove();
							$(this).addClass("cellError");
							errorCellParent.prepend($(this));
							
							// This allows for the inline error messages to appear in the sortable table
							// and the alignment of the sibling TDs to maintain the same vertical alignment.
							errorCellParent.siblings().each(function() {
								$(this).addClass("cellErrorPadding");
							});
						});
					} else {
						errorCellParent.siblings().each(function() {
							$(this).removeClass("cellErrorPadding");
						});
					}
				});
				
				if ($.browser.msie) {
					$(document).bind("keydown", function(event) {
						if (event.keyCode == 13) {
							sourceElement = $(event.srcElement);
							parentForm = sourceElement.parents("form");
						
							if (parentForm.length > 0) {
								event.preventDefault();
								parentForm.trigger("submit");
							}
						}
					});	
				}
			}
			else if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
				
				preferencesFormFields = {
					txtDeviceNumber: {
						name: "txtDeviceNumber",
						type: "phoneNumber,ESN,MEID,BAN,DAC,MAC",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberInvalid")
					},
					txtZip: {
						name: "txtZip",
						type: "zipCode",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeInvalid")
					},
					txtPin: {
						name: "txtPin",
						type: "PIN",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.pinEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.pinInvalid")
					},
					txtNickname: {
						name: "txtNickname",
						type: "",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.nicknameEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.nicknameInvalid"),
						customValidationRule: function(field) {
							var nicknameRule = /^[a-zA-Z0-9\.\-_\s\']+$/;
							return nicknameRule.test(field.val());
						}
					},

					txtTaxIdNumber: {
						name: "txtTaxIdNumber",
						type: "taxId",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.taxIdEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.taxIdInvalid"),
						customValidationRule: function(field){
								
							var fieldValue = field.val();
							var $txtTaxIdNumber2 = $("#txtTaxIdNumber2");
							var $txtTaxIdNumber4 = $("#txtTaxIdNumber4");
							
							//First, make sure the value follows the correct format
							if (Sprint.formFieldTypes.taxId.test(fieldValue)) {
								
								//validate on the server side if the client side is valid
								var isServerValid = $.fn.pinWizard.helpers.testTaxIdAndZip(field);
								
								if (isServerValid.isValid){
									$txtTaxIdNumber2.removeClass("error");
									$txtTaxIdNumber4.removeClass("error");
									return true;
								} else {
									$txtTaxIdNumber2.addClass("error");
									$txtTaxIdNumber4.addClass("error");
									
									this.invalidErrorMessage = isServerValid.taxIdErrorMessage;
									return false;
								}
								
							} else {
								this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.taxIdInvalid");
								$txtTaxIdNumber2.addClass("error");
								$txtTaxIdNumber4.addClass("error");
								return false;
							}
						}
					},
					txtZipCode: {
						name: "txtZipCode",
						type: "zipCode",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeInvalid"),
						customValidationRule: function(field){
							var fieldValue = field.val();
							
							if (Sprint.formFieldTypes.zipCode.test(fieldValue)) {
								//validate on the server side if the client side is valid
								var isServerValid = $.fn.pinWizard.helpers.testTaxIdAndZip(field);
								if(isServerValid.isValid){
									return true;
								} else {
									this.invalidErrorMessage = isServerValid.zipCodeErrorMessage;
									return false;
								}
							} else {
								this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.zipCodeInvalid");
								return false;
							}
						}
					}
				};
				
				var pinWizardOptions = {
					frmRegistration: frmPreferences,
					scrollToErrors: true
				};
				
				var pinWizardValidationObj = {
					txtDeviceNumber: {
						name: "txtDeviceNumber",
						type: "phoneNumber,ESN,MEID,BAN,DAC,MAC",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberInvalid"),
						customValidationRule: function(field){
							
							var fieldValue = field.val();
							var validDevice = "";
							
							if (Sprint.formFieldTypes.phoneNumber.test(fieldValue)) {
								validDevice = true;
							}
							else if (Sprint.formFieldTypes.ESN.test(fieldValue)){
								validDevice = true;
							}
							else if (Sprint.formFieldTypes.MEID.test(fieldValue)){
								validDevice = true;
							}
							else if (Sprint.formFieldTypes.BAN.test(fieldValue)){
								validDevice = true;
							}
							else if (Sprint.formFieldTypes.MAC.test(fieldValue)){
								validDevice = true;
							}
							else if (Sprint.formFieldTypes.DAC.test(fieldValue)){
								
								//add in leading 0's for DAC
								var banDacArray = fieldValue.replace(/\(|\)|\s|\./g, '').split("-");
								for (var i=0; banDacArray[1].length < 10; i++) {
									banDacArray[1] = "0"+banDacArray[1];
								}
								var newDac = banDacArray[0] + "-" +banDacArray[1];
								field.val(newDac);
								validDevice = true;
							} else {
								validDevice = false;
							}
							
							return validDevice;
						}
					}
				};
				
				frmPreferences.pinWizard(pinWizardOptions,pinWizardValidationObj);
				
				// PIN Wizard causes the result of frmPreferences.serialize() to change, so the script thinks
				// there has been a change when there really hasn't been. Thus, reinitialize originalFormData.
				originalFormData = frmPreferences.serialize();
				
				// Snare configuration
				// ---------------------------------------------------- //
				//var enablee = ($("#enableSnare").val() == "true")?true:false;
				var enableSnare = true;
				
					if (enableSnare) {
						// load iframe which will execute snare function
					 if($("#snareIframe").length <= 0){
						//$("body").append('<iframe id="snareIframe" src="/mysprint/pages/sl/common/snare.jsp" width="0" height="0" scrolling="no" frameborder="no"></iframe>');
						
						Sprint.getBBdata = function(){
						
							var bbData = document.getElementById('snareIframe').contentWindow['bb_data'];
							
							if((typeof(bbData) != "undefined") && (typeof(bbData) != "false")){
								// if snare has completed then submit
								return bbData;
							} else {
								// snare is enabled but bb_data in the iframe is undefined
								return {blackbox:"undefined"}
							}
						}
					}
				}
				
				$("#txtDeviceNumber").bind("blur",function(event){
					
					var $field = $(this);
					var fieldValue = $field.val();
					
					// If valid BAN-DAC format, then PIN is disabled. 
					if (Sprint.formFieldTypes.DAC.test(fieldValue)){
						frmPreferences.find("#txtZip").attr("disabled", "disabled").val("");
						frmPreferences.find("#txtPin").attr("disabled", "disabled").val("");
					} else {
						frmPreferences.find("#txtZip").removeAttr("disabled");
						frmPreferences.find("#txtPin").removeAttr("disabled");
					}
					
					//If this field already has an error, clear the error first
					if ($field.hasClass("error")) {
						$field.removeClass("error");
						frmPreferences.find("label.error[for='" + $field.attr("id") + "']").remove();
					}
					
					//run client side validation
					var isDeviceValid = Sprint.fn.validateForm(frmPreferences,pinWizardValidationObj);
					
					if(isDeviceValid === true){
						
						
						var deviceValidationPath;
						var deviceQuery;
						
						//create different data querystring for landing page'
						if (frmPreferences.hasClass("unlockAccount")){
							deviceValidationPath = $("#hidDeviceValidationPath").val();
							//Dont change this - Sujeeth
							deviceQuery = "validateAccountNum=true&txtDeviceNumber="+fieldValue; //by Sujeeth
						} else {
							deviceValidationPath = frmPreferences.attr("action");
							//Dont change this - Sujeeth
							deviceQuery = "validateAccountNum=true&txtDeviceNumber="+fieldValue; //by Sujeeth
						}
						
						$.ajax({
							data: deviceQuery,
							dataType: "json",
							type: "POST",
							url: "/mysprint/pages/secure/BaseAjaxServlet?pageContext=addNewAccount&action=attachAccount", // by sujeeth
							async: false,
							success: function(result) {
								
								//if device number is already registered to this user then create error object
								if (result.validated == false) {
									isDeviceValid = {
										txtDeviceNumber: {
											errorMessage: result.errorMessage,
											name: "txtDeviceNumber"
										}
									}
								} else{
									isDeviceValid = true;
								}
							},
							error: Sprint.fn.ajaxError
						});
					}
					
					//check if device is still valid after ajax call
					if(isDeviceValid != true){
						//show error message
						frmPreferences.showFormErrors({
							errorData: isDeviceValid,
							summaryAnchor: frmPreferences.prev(),
							showSummary: false,
							scrollToSummary: false
						});
					}
				});
			}
			else if (frmPreferences.hasClass("allowOtherPeopleBusiness")) {
			
				preferencesFormFields = {};
				
				//This flag will determine whether or not form fields have changed before the user re-sorts the results table. It's used to keep track of changes in case the user tries to close the modal before saving.				
				var dataChanged = false; 
				
				var manageUserRequests = frmPreferences.find("#manageUserRequests");
				
				/* Custom string sort function that will sort a string normally, but have empty values appear last (instead of first with the normal array.sort() function) */
				var customStringSort = function (a, b) {
					if (a[0] == "" && b[0] == "") {
						//If both elements are equal
						return 0;
					}
					else if (a[0] != "" && b[0] == "") {
						//a[0] has characters, and b[0] does not. A should come first...
						return -1;
					}
					else if (a[0] == "" && b[0] != "") {
						//b[0] has characters, and a[0] does not. B should come first...
						return 1;
					}
					else {
						//both a[0] and b[0] have characters and are not equal, do a normal sort.
						return (a[0] > b[0])?1:(a[0] < b[0])?-1:0;
					}
				}
			
				manageUserRequests.sortableTable({
					excludeColumns: [5],
					columnValueFunctions: [
						function(cell) {
							if (cell.find("a").length > 0) {
								return "A";
							}
							else {
								return "Z";
							}							
						},
						function(cell) {
							return cell.find("a:first").text();
						},
						function(cell) {
							return cell.find("a:first").text();
						},
						function(cell) {
							return cell.find("a:first").text();
						},
						function(cell) {
							if (cell.find("select").length > 0) {
								//return the label of the selected option
								return cell.find("option[value='"+cell.find("select").val()+"']").text();
							}
							else {
								return cell.text();
							}
						}
					],
					customSortFunctions: [
						,
						,
						customStringSort,
						customStringSort					
					],
					pagination: true,
					beforeSort: function() {
					
						//Check to see if changes have been made to the form data already, if so, reset the dataChanged variable to true
						if (originalFormData != frmPreferences.serialize()) {
							dataChanged = true;
						}
					},
					afterSort: function() {
					
						//If the data didn't change at all before the table got re-sorted, re-set the originalFormData variable to reflect the new sort order.
						if (!dataChanged) {
							originalFormData = frmPreferences.serialize();
						}
					}
				});
				
				/* START: Added for : search for business users but not on hierarchy */
                function forManageUsers(){
                    preferencesFormFields = {};
                    var dataChanged = false;
                    function customStringSort(a, b) {
                        if (a[0] == "" && b[0] == "") {
                            return 0;
                        }
                        else if (a[0] != "" && b[0] == "") {
                            return -1;
                        }
                        else if (a[0] == "" && b[0] != "") {
                            return 1;
                        }
                        else {
                            return (a[0] > b[0])?1:(a[0] < b[0])?-1:0;
                        }
                    }
                    manageUserRequests.sortableTable({
                        excludeColumns: [5],
                        columnValueFunctions: [
                        function(cell) {
                            if (cell.find("a").length > 0) {
                                return "A";
                            }
                            else {
                                return "Z";
                            }
                        },
                        function(cell) {
                            return cell.find("a:first").text();
                        },
                        function(cell) {
                            return cell.find("a:first").text();
                        },
                        function(cell) {
                            return cell.find("a:first").text();
                        },
                        function(cell) {
                            if (cell.find("select").length > 0) {
                                return cell.find("option[value='"+cell.find("select").val()+"']").text();
                            }
                            else {
                                return cell.text();
                            }
                        }
                        ],
                        customSortFunctions: [
                        ,
                        ,
                        customStringSort,
                        customStringSort
                        ],
                        pagination: true,
                        beforeSort: function() {
                            if (originalFormData != frmPreferences.serialize()) {
                                dataChanged = true;
                            }
                        },
                        afterSort: function() {
                            if (!dataChanged) {
                                originalFormData = frmPreferences.serialize();
                            }
                        }
                    });
                }
                forManageUsers();
				/* START: Added for : search for business users but not on hierarchy */
				
				//Event handling for the View Request Details links
				manageUserRequests.bind("click", function(event) {
					var target = $(event.target);
					
					if (target.is("a.viewRequest")) {
						event.preventDefault();
						
						//Get the request details via ajax, then hide the form and show request details
						$.ajax({
							data: "ajax=true",
							type: "GET",
							url: target.attr("href"),
							async: false,
							success: function(data) {
								var newContent = $(data);
								var requestsContent = frmPreferences.parent();
								newContent.insertBefore(requestsContent);
								requestsContent.hide();
								
								//Fake the sub-nav item in the left nav...
								var fakeSubNav = $("<ul class=\"subNav\"><li class=\"selected\"><a href=\"#\" onclick=\"return false;\">"+newContent.find(".headerWrapperPrimary h3").text()+"</a></li></ul>");
								
								//Find the selected item in the left nav and add this subMenu to it...
								var selectedLeftNavItem = $("#prefsNav li.selected");
								var selectedLeftNavAnchor = selectedLeftNavItem.find("a");
								
								//Wrap the anchor with an accordion heading
								selectedLeftNavAnchor.wrap("<div class=\"header\"></div>");
								
								var newItem = selectedLeftNavAnchor.clone();
								selectedLeftNavAnchor.hide();
								newItem.appendTo(selectedLeftNavItem);
								selectedLeftNavItem.addClass("hasSubNav").addClass("accordionItem").addClass("accordionItemSelected").removeClass("selected");
								selectedLeftNavItem.append(fakeSubNav);
								
								newItem.bind("click", function() {
									newContent.find("#btnUserDetailsBack").trigger("click");
									return false;
								});
								
								//Setup buttons, tooltips, sifrHeadings & help shades for this content
								newContent.setupComponents({
									buttons:               true,
									tooltips:              true,
									modals:                false,
									shades:                true,
									accordions:            false,
									horizontalAccordions:  false,
									tabbedContent:         false,
									disclosures:           false,
									roundedCorners:        false,
									dropShadows:           false,
									sifrHeadings:          true,
									starRaters:            false
								});
								
								//Bind the click handler for the back button
								newContent.find("#btnUserDetailsBack").unbind("click").bind("click", function(event) {
									event.preventDefault();
									requestsContent.show();
									newContent.remove();
									
									//Reset the left nav modifications...
									fakeSubNav.remove();
									delete fakeSubNav;
									
									newItem.remove();
									delete newItem;
									
									selectedLeftNavItem.addClass("selected").removeClass("hasSubNav").removeClass("accordionItem").removeClass("accordionItemSelected");
									selectedLeftNavAnchor.show().insertBefore(selectedLeftNavItem.find("div.header"));
									selectedLeftNavItem.find("div.header").remove();
								});
							},
							error: Sprint.fn.ajaxError
						});
					}
				});
				
				//Event handling for the Flags
				//If the request is flagged, then checkbox should be unchecked
				frmPreferences.find("a.flagged").unbind("click").bind("click", function(event) {
					event.preventDefault();
					
					//Check/uncheck target checkbox
					var targetCheck = $("#"+$(this).parent("label").attr("for"));
					if (targetCheck.is(":checked")) {
						// If the checkbox is checked, that means the flag is deselected.
						// Therefore, on click we need to uncheck the checkbox and enable the flag.
						targetCheck.attr("checked", false);
						$(this).addClass("flagged").removeClass("unflagged");
						targetCheck.parents("tr").addClass("requiresAttention").removeClass("ignored");
					}
					else {
						// If the checkbox is unchecked, that means the flag is selected.
						// Therefore, on click we need to check the checkbox and disable the flag.
						targetCheck.attr("checked", true);
						$(this).addClass("unflagged").removeClass("flagged");
						targetCheck.parents("tr").removeClass("requiresAttention").addClass("ignored");
					}
				});
				
				/* START: Added for : search for business users but not on hierarchy */
                searchBoxInitVal = $('#txtSearchTerm').val();
                orginalData = $('#manageUserRequests').html();
                manageAccessAcnt = $('#manageUserRequests');

                $("#searchKeyWord").bind('keypress', function(e) {
                    if (e.keyCode == 13) {
                        $("#btnSearchSubscribers").trigger('click');
                        return false;
                    }
                });

                $('#clearSearch').bind('click', function(e){
                    e.preventDefault();
                    clearErrMsg();
                    manageAccessAcnt.html(orginalData);
                    $('#txtSearchTerm').val(searchBoxInitVal);
                    $('#txtSearchTerm').css('color', '#999');
                    forManageUsers();
                    manageAccessAcnt.setupComponents();
                });

                $('#clearSearch2').bind('click', function(e){
                    e.preventDefault();
                    clearErrMsg();
                    manageAccessAcnt.html(orginalData);
                    $('#searchKeyWord').val("");
                    forManageUsers();
                    manageAccessAcnt.setupComponents();
                });
                $('#btnViewAll').bind('click', function(){
                    var dataToSend = "";
                    if($('#btnSearchSubscribers').length > 0){
                        dataToSend = "searchManageDeviceSubscribers=true";
                    } else {
                        dataToSend = "searchManageAccesssAccounts=true";
                    }
                    $.ajax({
                        data: dataToSend+"&viewAllUsers=true",
                        dataType: "html",
                        type: "POST",
                        url: $('#searchAction').val(),
                        async: false,
                        cache: false,
                        success: function(data) {

                            if (manageAccessAcnt.empty().html(data).find("tbody tr").length == 0) {
                                var msg = Sprint.fn.getContentString("pSearchEmailErrors.noSearchResults");
                                updateErrMsg(msg);
                            }

                            if (manageAccessAcnt.find("tbody tr").length == 1) {
                                manageAccessAcnt.attr("id","manageUserRequests"); // Remove sorting arrows
                                var pagination = frmPreferences.find(".modulePlain");
                                pagination.find(".tablePagination").remove();
                            }
                        },
                        error: Sprint.fn.ajaxError
                    });
                    forManageUsers();
                    manageAccessAcnt.setupComponents();
                });

				var header = $("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary");
				var fieldToValidateForSearch = {
					searchKeyWord: {
						name: "searchKeyWord",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid")
					}
				};
				$("#searchType").unbind('change').bind('change', function(){
					var searchTypeVal = $(this).val();
					if(searchTypeVal == 'userId') {
						fieldToValidateForSearch.searchKeyWord.type = 'displayName';
						fieldToValidateForSearch.searchKeyWord.emptyErrorMessage = 'User Id cannot be empty';
						fieldToValidateForSearch.searchKeyWord.invalidErrorMessage = 'Invalid user id, no spaces or special characters';
					} else {
						fieldToValidateForSearch.searchKeyWord.type = 'phoneNumber';
						fieldToValidateForSearch.searchKeyWord.emptyErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty");
						fieldToValidateForSearch.searchKeyWord.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
					}
				});

                $('#btnSearchSubscribers').bind('click', function(){
                    clearErrMsg();
					var validSearchString = Sprint.fn.validateForm(frmPreferences, fieldToValidateForSearch);
                    var searchKeyWord2   = $.trim($("#searchKeyWord").val());
                    var searchType = $("#searchType").val();
					var banId = $("#banIdForSearch").val();

                    if (validSearchString == true) {
                        $.ajax({
							data: "searchManageDeviceSubscribers=true&searchKeyWord="+searchKeyWord2+"&searchType="+searchType+"&BANid="+banId,
                            dataType: "html",
                            type: "POST",
                            url: $('#searchAction').val(),
                            async: false,
                            cache: false,
                            success: function(data) {

                                if (manageAccessAcnt.empty().html(data).find("tbody tr").length == 0) {
                                    var msg = Sprint.fn.getContentString("pSearchEmailErrors.noSearchResults");
                                    updateErrMsg(msg);
                                }

                                if (manageAccessAcnt.find("tbody tr").length == 1) {
                                    manageAccessAcnt.attr("id","manageUserRequests"); // Remove sorting arrows
                                    var pagination = frmPreferences.find(".modulePlain");
                                    pagination.find(".tablePagination").remove();
                                }
                            },
                            error: Sprint.fn.ajaxError
                        });
                    }
                    else {
						frmPreferences.showFormErrors({
							errorData: validSearchString,
							showSummary: true,
							showInline: false,
							summaryAnchor: header
						});
                        manageAccessAcnt.html(orginalData).find("tbody tr:gt(49)").remove();
                    }
                    forManageUsers();
                    manageAccessAcnt.setupComponents();
                });

                var header = $("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary");
                function clearErrMsg() {
                    header.find(".updateMessage, ul.formErrors").remove();
                }
				
                function updateErrMsg(msg) {
                    clearErrMsg();
                    var updateMessage = $("<ul class=\"formErrors\"><li><a href=\"#txtSearchTerm\">"+msg+"</a></li></ul>");
                    updateMessage.appendTo(header);
                }
				/* END: Added for : search for business users but not on hierarchy */
				
				
			}
			else if (frmPreferences.hasClass("allowOtherPeople")) {
				preferencesFormFields = {};
				
				//This flag will determine whether or not form fields have changed before the user re-sorts the results table. It's used to keep track of changes in case the user tries to close the modal before saving.
				var dataChanged = false; 
				var manageRequests = frmPreferences.find("#manageRequests");
				
				/* Custom string sort function that will sort a string normally, but have empty values appear last (instead of first with the normal array.sort() function) */
				var customStringSort = function (a, b) {
					if (a[0] == "" && b[0] == "") {
						//If both elements are equal
						return 0;
					}
					else if (a[0] != "" && b[0] == "") {
						//a[0] has characters, and b[0] does not. A should come first...
						return -1;
					}
					else if (a[0] == "" && b[0] != "") {
						//b[0] has characters, and a[0] does not. B should come first...
						return 1;
					}
					else {
						//both a[0] and b[0] have characters and are not equal, do a normal sort.
						return (a[0] > b[0])?1:(a[0] < b[0])?-1:0;
					}
				}
			
				manageRequests.sortableTable({
					excludeColumns: [3],
					columnValueFunctions: [
						function(cell) {
							if (cell.find("a").length > 0) {
								return "A";
							}
							else {
								return "Z";
							}							
						},
						function(cell) {
							return cell.find("dt").text();
						},
						function(cell) {
							if (cell.find("select").length > 0) {
								//return the label of the selected option
								return cell.find("option[value='"+cell.find("select").val()+"']").text();
							}
							else {
								return cell.find("p:first").text();
							}
						}
					],
					pagination: true,
					rowsPerPage: 4,
					reverseSort: true,
					beforeSort: function() {
					
						//Check to see if changes have been made to the form data already, if so, reset the dataChanged variable to true
						if (originalFormData != frmPreferences.serialize()) {
							dataChanged = true;
						}
					},
					afterSort: function() {
					
						//If the data didn't change at all before the table got re-sorted, re-set the originalFormData variable to reflect the new sort order.
						if (!dataChanged) {
							originalFormData = frmPreferences.serialize();
						}
					}
				});
				
				manageRequests.find("input[type='checkbox']").bind("click", function() {
					var check = $(this);
					if (check.is(":checked")) {
						check.parents("tr").removeClass("requiresAttention").addClass("ignored").find(".flagged").addClass("unflagged").removeClass("flagged");
					}
					else {
						check.parents("tr").addClass("requiresAttention").removeClass("ignored").find(".unflagged").addClass("flagged").removeClass("unflagged");
					}
				});
			
				//setup dropdowns to swap descriptions
				manageRequests.find("td.role select").bind("change", function() {
					var roleSelect = $(this);
					var roleValue = $(roleSelect[0]).val();
					var descArea = roleSelect.parent(".role").find(".roleDescription");
					
					var roleDescs = $("#roleDescStore .roleDesc."+roleValue);
					var html = $(roleDescs[0]).html();
					
					descArea.html(html);
				});
				
			}
			else if (frmPreferences.hasClass("communicationEmailSettings")) {
				//trim _DARGS value from originalFormData
				if(originalFormData.match(/_DARGS/)){
					originalFormData = originalFormData.substring(0, originalFormData.lastIndexOf("&_DARGS"));
				}
				
				//trim account value from originalFormData
				var currentAccount = $("#selfrmPrefSelectAccount").serialize();
				if(currentAccount != null && currentAccount != ""){ // change by Pankaj Gupta
					originalFormData = originalFormData.replace("&" + currentAccount,"");
				}
				
				$("#frmPreferences div.disclosureCommPreferences").disclosure({
					startClosed:true,
					titleClickable:true,
					openCallback: function(){
						var disclosureContent = $("#frmPreferences div.disclosureCommPreferences div.disclosureContent");
						// check if contents have been loaded. if not then do ajax call
						if (disclosureContent.find("img.imgLoading").length > 0){
							
							$.ajax({
								type: "POST",
								url: $("#disclosureCommPreferencesAjaxURL").val(),
								dataType: "html",
								async: false,
								success: function(data) {
									disclosureContent.html(data);
									
									//add the ajax form elements to the original form data
									originalFormData += "&" + disclosureContent.find("select").serialize();
								},
								error: Sprint.fn.ajaxError
							});
						}
						
					}
				}).addClass("disclosure");
				
				//Setup fields for the Account Bill Settings on Account & Billing modal
				communicationSettingsShortFields = {
					txtCommunicationEmail: {
						name: "txtCommunicationEmail",
						type: "enterpriseEmailAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					txtSubscriberEmail: {
						name: "txtSubscriberEmail",
						type: "enterpriseEmailAddress",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					radCommunicationSendEmail: {
						name: "radCommunicationSendEmail",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.emailNotificationInvalid")
					}
				};
				
				communicationSettingsGranularFields = {
					txtCommunicationServicesEmail: {
						name: "txtCommunicationServicesEmail",
						type: "enterpriseEmailAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					radCommunicationSecurity: {
						name: "radCommunicationSecurity",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.emailNotificationInvalid")
					},
					txtCommunicationSecurityEmail: {
						name: "txtCommunicationSecurityEmail",
						type: "enterpriseEmailAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					txtCommunicationSecurityText: {
						name: "txtCommunicationSecurityText",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field) {

							var fieldValue = field.val();
							var validNumber = true;	
							
							//Reset the invalidErrorMessage if there is a temporaryMessage set
							if (communicationSettingsGranularFields.txtCommunicationSecurityText.temporaryErrorMessage) {
								communicationSettingsGranularFields.txtCommunicationSecurityText.invalidErrorMessage = communicationSettingsGranularFields.txtCommunicationSecurityText.temporaryErrorMessage;
							}

							//First, make sure the value follows the correct format	
							if (Sprint.formFieldTypes["phoneNumber"].test(fieldValue)==false) {
								return false;
							}
							else {
								//Run an ajax request to check and see that this phone number is textable
								$.ajax({
									data: "validateTextable=true&txtDeviceNumber="+frmPreferences.find("#txtCommunicationSecurityText").val()+"&userAccountId="+$("#hidUserAccountID").val(),
									type: "POST",
									url: "/mysprint/pages/secure/BaseAjaxServlet?pageContext=communicationPref",
									dataType: "json",
									async: false,
									success: function(data) {
										validNumber = data.validated;
										if (!data.validated) {
											//Set a temporary error message
											communicationSettingsGranularFields.txtCommunicationSecurityText.temporaryErrorMessage = communicationSettingsGranularFields.txtCommunicationSecurityText.invalidErrorMessage;
											communicationSettingsGranularFields.txtCommunicationSecurityText.invalidErrorMessage = data.errorMessage;
										}
									},
									error: function(event) {
										validNumber = false;
									}
								});								
							}
							return validNumber;
						}
					},
					txtCommunicationEbillEmail: {
						name: "txtCommunicationEbillEmail",
						type: "enterpriseEmailAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					radPromotionalEmail: {
						name: "radPromotionalEmail",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.emailNotificationInvalid")
					},
					txtPromotionalEmailYes: {
						name: "txtPromotionalEmailYes",
						type: "enterpriseEmailAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					}
				};
				
				var setPrefFormFields = function (){
					preferencesFormFields = communicationSettingsGranularFields;
					for( i in communicationSettingsShortFields){
						preferencesFormFields[i] = communicationSettingsShortFields[i];
					}
				}
				
				setPrefFormFields();
				
				//below this line we set up all the scripts the modal needs
				
				//bind the validate email link (if it exists)
				$("#communicationValidateEmail").live("click", function(event){
					event.preventDefault();
					return validateEmail();
				});

				$("#txtCommunicationSecurityText").autocomplete(String($("#hidCommunicationAccountDeviceNumbers").val()).split(","), {
					minChars: 0,
					autoFill: true,
					max: 10,
					mustMatch: false,
					scrollHeight: 200
				});
				
				//show/hide the granular email settings based on which radios are clicked				
				$("#radCommunicationSendEmailYes").bind("click", function(event) {
					$("#granularEmailSettings").slideUp("medium");
				});
				
				$("#radCommunicationSendEmailNo").bind("click", function(event) {
					$("#granularEmailSettings").slideDown("medium");
					
					//Check to see if the email address field values in this section have been set, if not, default them to whatever's in the [other] email address field
					var txtCommunicationEmailValue = $("#txtCommunicationEmail").val();
					
					if ($.trim($("#txtCommunicationServicesEmail").val()) == "") {
						$("#txtCommunicationServicesEmail").val(txtCommunicationEmailValue);
					}
					
					if ($.trim($("#txtCommunicationSecurityEmail").val()) == "") {
						$("#txtCommunicationSecurityEmail").val(txtCommunicationEmailValue);
					}
					
					if ($.trim($("#txtCommunicationEbillEmail").val()) == "") {
						$("#txtCommunicationEbillEmail").val(txtCommunicationEmailValue);
					}
					
					if ($.trim($("#txtPromotionalEmailYes").val()) == "") {
						$("#txtPromotionalEmailYes").val(txtCommunicationEmailValue);
					}
				});
				
				//show/hide the security email settings based on which radios are clicked	
				$("#radCommunicationSecurityEmail").bind("click", function(event) {
					
					$("#txtCommunicationSecurityText").hide();
					$("label[for='txtCommunicationSecurityText']").hide();
					$("#txtCommunicationSecurityEmail").show();
					$("label[for='txtCommunicationSecurityEmail']").show();
					
					//now make the corresponding text field required and the other not required
					preferencesFormFields["txtCommunicationSecurityEmail"]["required"] = true;
					preferencesFormFields["txtCommunicationSecurityText"]["required"] = false;
					
					//change the "original form data" so it doesn't skip validation of this element
					originalDataObject["txtCommunicationSecurityEmail"] = "xxx";
				});
				
				$("#radCommunicationSecurityText").bind("click", function(event) {
					
					$("#txtCommunicationSecurityEmail").hide();
					$("label[for='txtCommunicationSecurityEmail']").hide();
					$("#txtCommunicationSecurityText").show();
					$("label[for='txtCommunicationSecurityText']").show();
					
					//now make the corresponding text field required and the other not required
					preferencesFormFields["txtCommunicationSecurityEmail"]["required"] = false;
					preferencesFormFields["txtCommunicationSecurityText"]["required"] = true;
					
					//change the "original form data" so it doesn't skip validation of this element
					originalDataObject["txtCommunicationSecurityText"] = "xxx";
				});
				
				//select default security email setting
				$("input:radio[name=radCommunicationSecurity]:checked").trigger("click");
				
				//show/hide the promotional email settings based on which radios are clicked	
				$("#radPromotionalEmailYes").bind( "click", function(event) {
					$("#txtPromotionalEmailYes").show();
					$("label[for='txtPromotionalEmailYes']").show();
					preferencesFormFields["txtPromotionalEmailYes"]["required"] = true;
					originalDataObject["txtPromotionalEmailYes"] = "xxx";
				});
				
				$("#radPromotionalEmailNo").bind( "click", function(event){
					$("#txtPromotionalEmailYes").hide();
					$("label[for='txtPromotionalEmailYes']").hide();
					preferencesFormFields["txtPromotionalEmailYes"]["required"] = false;
					
					$("#txtPromotionalEmailYes").val("");
				});

				$("#chkCommunicationPromotional").bind("click", function(event) {
					if ($(this).is(":checked")) {
						preferencesFormFields["txtCommunicationServicesEmail"]["required"] = true;
					}
					else {
						preferencesFormFields["txtCommunicationServicesEmail"]["required"] = false;
					}
				});								

				//rebind the button event for custom form validation
				$("#btnSubmitPreferencesModal").unbind("click").bind("click", function(event) {
					event.preventDefault();
					
					//if we don't have the granular e-mail settings, clear them
					if( $("#radCommunicationSendEmailYes:checked").length > 0 ) {
						preferencesFormFields = communicationSettingsShortFields;
						processPreferencesForm(event);
						setPrefFormFields();
					
					//if we DO have granular e-mail settings, we have some extra validation to do
					}
					else {
						
						//populate preferencesFormFields
						setPrefFormFields();
						
						//clear hidden multi-inputs and set to not required
					/*	$("#frmPreferences input.text:hidden").each( function(i){
							var element = $(this);
							var myId = element.attr("id");
							element.val("");
							preferencesFormFields[myId]["required"] = false;
						});*/
						
						//set visible multi-inputs to required
						/*$("#frmPreferences input.text:visible").each( function(i){
							var myId = $(this).attr("id");
							//alert(myId);
							preferencesFormFields[myId]["required"] = true;
						});*/
						
						//submit the form
						processPreferencesForm(event);
					}
				});
				
				
				//below this line we have helper functions for the script setup
			
				var validateEmail = function () {
					//send the e-mail validation
					var emailAddy = $("#txtCommunicationEmail").val();
					var serviceURL = $("#communicationValidateEmail").attr("href");
					
					if( $("#txtCommunicationEmail").hasClass("error") ){
						//do some error handling here 
						alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.emailValidateEmailError"));
						return false;
					}
					
					$.ajax({
				   		type: "POST",
				   		url: serviceURL,
				   		data: "email="+emailAddy,
						dataType: "json",
				   		success: function(json){
							if(json.response.status == "success"){
				     			//refresh the update module
								$("div.updateMessage").html(
									"<img alt=\"Success\" src=\"/global/images/icons/ico_confirmation_med.gif\" class=\"messageIcon\"/>"+
									"<div class=\"updateText\">"+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.communicationValidateEmailMessage")+"</div>"
								);
							}
							else {
								//do some error handling
								$("div.updateMessage").html(
									"<img alt=\"Failure\" src=\"/global/images/icons/ico_error_med.gif\" class=\"messageIcon\"/>"+
									"<div class=\"updateText\">"+json.response.errorMessage+" <a href=\""+serviceURL+"\" id=\"communicationValidateEmail\">Try again</a>. </div>"
								);
								
								return false;
							}
				   		}
				 	});
				}//end of validateEmail

				//A little initialization for the fields
				if ($("#chkCommunicationPromotional").is(":checked")) {
					preferencesFormFields["txtCommunicationServicesEmail"]["required"] = true;
				}
				else {
					preferencesFormFields["txtCommunicationServicesEmail"]["required"] = false;
				}
				
				if ($("#radPromotionalEmailYes").is(":checked")) {
					preferencesFormFields["txtPromotionalEmailYes"]["required"] = true;
				}
				else {
					preferencesFormFields["txtPromotionalEmailYes"]["required"] = false;
				}

				if ($("#radCommunicationSecurityEmail").is(":checked")) {
					preferencesFormFields["txtCommunicationSecurityEmail"]["required"] = true;
					preferencesFormFields["txtCommunicationSecurityText"]["required"] = false;
				}
				else if ($("#radCommunicationSecurityText").is(":checked")) {
					preferencesFormFields["txtCommunicationSecurityEmail"]["required"] = false;
					preferencesFormFields["txtCommunicationSecurityText"]["required"] = true;
				} else {
					// CS364539
					preferencesFormFields["txtCommunicationSecurityEmail"]["required"] = false;
					preferencesFormFields["txtCommunicationSecurityText"]["required"] = false;
					preferencesFormFields["radCommunicationSecurity"]["required"] = false;
					$("#txtCommunicationSecurityText").hide();
					$("label[for='txtCommunicationSecurityText']").hide();
					$("#txtCommunicationSecurityEmail").hide();
					$("label[for='txtCommunicationSecurityEmail']").hide();
				}		
			}
			else if (frmPreferences.hasClass("myDevice")) {
				var myDeviceAddEdit = $("#myDeviceAddEdit");
				var myDeviceDynamic3 = $("#myDeviceDynamic3");
				
				// The txtPhoneEsn and txtNewDevice fields need to retain the values, even while the user switches
				// between the various radio button options. Therefore, to prevent validation during the other radio
				// button choices, we add and remove the validation for those fields as necessary.
				var txtNewDevice = {
					name: "txtNewDevice",
					type: "",
					required: true,
					emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.newDeviceEmpty"),
					invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.newDeviceInvalid"),
					customValidationRule: function(field) {
						return true;
					},
					modified: true
				};
				
				var txtPhoneEsn = {
					name: "txtPhoneEsn",
					type: "phoneNumber,ESN,MEID,MAC",
					required: $("#addDeviceMyPhoneMedia").length > 0 ? true : false,
					emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneEsnEmpty"),
					invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneEsnInvalid"),
					customValidationRule: function(field) {
						var fieldValue = field.val();

						// First, make sure the value follows the correct format
						if (!Sprint.formFieldTypes.phoneNumber.test(fieldValue) && !Sprint.formFieldTypes.ESN.test(fieldValue) && !Sprint.formFieldTypes.MEID.test(fieldValue) && !Sprint.formFieldTypes.MAC.test(fieldValue)) {
							// If it doesn't follow the required format, make sure the dynamic content div is empty
							// and ensure the Save button doesn't validate the form.
							preventDynamicFieldValidation();
							return false;
						}
						else if (originalDataObject["txtPhoneEsn"] != fieldValue) {
							// If the content has changed from the previous validated phone/ESN then reset screen
							preventDynamicFieldValidation();
							return true;
						}
						else {
							return true;
						}							
					}
				};
				
				// Setup the validation rules for all the fields in the form.
				preferencesFormFields = {
					txtValidationCode: {
						name: "txtValidationCode",
						type: "validationCode",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.validationCodeEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.validationCodeInvalid"),
						summaryMessage: Sprint.fn.getContentString("formFieldErrors.validationCodeMatchError"),
						modified: true
					},
					txtSimNumber: {
						name: "txtSimNumber",
						type: "SIM",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.simEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.simInvalid"),
						modified: true
					},
					txtEsn: {
						name: "txtEsn",
						type: "ESN,MEID,MAC",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.esnEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.esnInvalid"),
						modified: true
					},
					txtPhoneNumber: {
						name: "txtPhoneNumber",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						modified: true
					},
					radMyDeviceAttachedOption: {
						name: "radMyDeviceAttachedOption",
						type: "radioButton",
						required: true,
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.esnInvalid"),
						customValidationRule: function(field) {
							var fieldValue = frmPreferences.find("input[name='radMyDeviceAttachedOption']:checked").val();
							
							var myDeviceDynamic1 = frmPreferences.find("#myDeviceDynamic1");
							var myDeviceDynamic2 = frmPreferences.find("#myDeviceDynamic2");
							
							if (fieldValue == "1" || fieldValue == "2") {
								// If the user chose the first radio button, they want to leave things the same.
								// Therefore, make sure the dynamic fields are hidden, and no form validation
								// occurs. Also, remove any previously shown success/error messages.
								// If the user chose the second radio button, they want to remove the currently
								// active device. Therefore, make sure the dynamic fields are hidden, and no form
								// validation occurs. Also, remove any previously shown success/error messages.
								
								myDeviceDynamic1.hide();
								myDeviceDynamic2.hide();
								
								preventDynamicFieldValidation();
								delete preferencesFormFields["txtPhoneEsn"];
								delete preferencesFormFields["txtNewDevice"];
								
								$("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary").find(".updateMessage, .formErrors").remove();
							}
							else if (fieldValue == "3") {
								// If the user chose the third radio button, they want to see devices from their
								// account, and be able to choose one of them. Therefore, make sure the dynamic
								// field pertaining to this radio button shows, and loads the necessary content.
								// Then enable pagination by using the sortable table plugin, and setup a method
								// to change devices.
								
								myDeviceDynamic1.show();
								myDeviceDynamic2.hide();
								
								preventDynamicFieldValidation();
								delete preferencesFormFields["txtPhoneEsn"];
								
								preferencesFormFields["txtNewDevice"] = txtNewDevice;
								$("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary").find(".updateMessage, .formErrors").remove();

								// Check if the div is empty, if so load the data
								if (frmPreferences.find("#myDeviceDynamic1 > div:first").html().length == 0) {
									// By default we don't specify which account to load, the php should decide
									frmPreferences.find("#myDeviceDynamic1 > div:first").empty().load("/mysprint/pages/secure/mypreferences/modals/myprofile_my_device_all_devices_on_account.jsp", function() {
										bindDeviceTableActions();
										bindAccountChange();
									});
								}
							}
							else if (fieldValue == "4") {
								// If the user chose the fourth radio button, they want to see a new device.
								// Therefore, make sure the dynamic field pertaining to this radio button shows
								// with the necessary fields. Also, add the new field to the original data object
								// and allow for single field validation.
								
								myDeviceDynamic1.hide();
								myDeviceDynamic2.show();
								
								delete preferencesFormFields["txtNewDevice"];
								preferencesFormFields["txtPhoneEsn"] = txtPhoneEsn;
								preferencesFormFields.txtPhoneEsn.modified = true;
								preferencesFormFields.txtPhoneEsn.required = true;
								
								$("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary").find(".updateMessage, .formErrors").remove();
							}
							
							return true;
						}
					}
				};
				
								
				// Check if a device is attached to the profile, if so show the attached device. Otherwise,
				// allow the user to attach a device.
				$.ajax({
					data: "hidPreferencesFormID=myDevice&deviceAttachedCheck=true",
					type: "GET",
					url: frmPreferences.attr("action"),
					async: false,
					cache: false,  // by sujeeth
					dataType: "json",
					success: function(data) {
						if (data.validated) {
							// If there is a device already attached to the user profile, then show the
							// attached device and give the user options to change it.
							myDeviceAddEdit.load(data.responseUrl, function() {
								preferencesFormFields["txtPhoneEsn"] = txtPhoneEsn;
								
								$("#myDeviceDynamic1").hide();
								$("#myDeviceDynamic2").hide();
								myDeviceAddEdit.setupComponents();
								
								// Hide the third radio button if the user is not an account owner
								if (!data.accountOwner) {
									$(this).find("#lblMyDeviceAttachedOption3").parent().hide();
								}
								
								// Do some validation on the form fields on tab-out
								myDeviceAddEdit.find("input[type='radio']").bind("click", singleFieldValidation);
								
								$("#myDeviceDynamic2").find("input").each(function () {
									$(this).bind("blur", singleFieldValidation);
								});
								
								// Change the location of the 3rd dynamic content div
								myDeviceDynamic3.remove();
								$("#myDeviceDynamic2").append(myDeviceDynamic3.addClass("deviceValidationWrapperInside"));
								originalFormData = frmPreferences.serialize();
							});
							// Fixed as a part of PJ005417 #CS Defect 461716
							$("#modalHolder a.closeModal").unbind("click").bind("click", function(event) {
								if (closeIntercept()) {

									//Close the current modal
									Sprint.modal.elem.closeModal();
								}
								return false;
							});
						}
						else {
							// If there is no attached devices to this profile, then ask the user to
							// attach a device.
							myDeviceAddEdit.load(data.responseUrl, function() {
								preferencesFormFields["txtPhoneEsn"] = txtPhoneEsn;

								// Do some validation on the form fields on tab-out
								myDeviceAddEdit.find("input.text, select").bind("blur", singleFieldValidation);
								frmPreferences.find(".buttons").removeClass("buttons").addClass("deviceButtons");
								myDeviceAddEdit.setupComponents();
								originalFormData = frmPreferences.serialize();
								if ($("#addDeviceMyPhoneMedia").length > 0) {
									originalFormData = originalFormData.replace('txtPhoneEsn=&', '');
								}
								
								if (data.redirectUrl) {
									$("#modalHolder a.closeModal").unbind("click").bind("click", function(event) {										
										// Start tealeaf function for tracking model close : Ashish
										if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
											TeaLeaf.Client.tlAddEvent(event);
										}
										// End tealeaf function for tracking model close : Ashish
										if (closeIntercept()) {
											//Close the current modal
											Sprint.modal.elem.closeModal();
											window.location = data.redirectUrl;
										}
										return false;
									});
								}
							});
						}
					},
					error: Sprint.fn.ajaxError
				});
				
				if ($.browser.msie) {
					$(document).bind("keydown", function(event) {
						if (event.keyCode == 13) {
							sourceElement = $(event.srcElement);
							parentForm = sourceElement.parents("form");
							if (parentForm.length > 0) {
								event.preventDefault();
								parentForm.trigger("submit");
							}
						}
					});	
				}
				
				// Hide the dynamic content divs since we don't need it on load
				myDeviceDynamic3.empty().hide();
				
				// Prevent validation of dynamic field where new content is loaded
				var preventDynamicFieldValidation = function () {
					myDeviceDynamic3.find("input,select").each(function () {
						delete originalDataObject[this.id];
					});
					myDeviceDynamic3.empty().hide();
					$("#hidMyDeviceFormValidate").val("false");
				}
				
				// Bind the select field to change the content in the div. This also involves moving the select box into
				// the correct table and making the table sortable once again.
				var bindAccountChange = function () {
					frmPreferences.find("#selSelectAccount").unbind("change").bind("change", function(event) {
						var label = frmPreferences.find("#lblSelectAccount");
						
						// First device is selected on change of the account drop down
						$("#myDeviceDynamic1").find("td.myDeviceColumn:first").trigger("click");
						
						label.remove();
						$(this).remove();
						
						$(".myDeviceTableWrapper").find(".tablePagination").remove();
						
						//Omniture code for account flip tracking in attach device Start : Ashish
						if (typeof(Analytics) !== "undefined") {
							if(disableOmnitureTrnxnTrac ==  'false'){
								var omniture_accountNumber = $(this).val();
								Analytics.eCareATG.trackTransactions("About Device","Complete","",omniture_accountNumber);
							}
						}
						
						frmPreferences.find("#myDeviceDynamic1 > div:first").empty().load("/mysprint/pages/secure/mypreferences/modals/myprofile_my_device_all_devices_on_account.jsp?account=" + $(this).val(), function() {
							bindDeviceTableActions();
							bindAccountChange();
							truncateCells($("#manageUserRequests"));
						});
					});
				}
				
				// Bind the actions for the device table
				var bindDeviceTableActions = function () {
					if (frmPreferences.find("#selSelectAccount > option").length == 1) {
						frmPreferences.find(".myDeviceTableHeader").parent().parent().hide();
					}
					
					// Set up hovers for ie6
					$("#myDeviceDynamic1").find("td.myDeviceColumn").hover(
						function() {
							$(this).addClass("hover");
						},
						function() {
							$(this).removeClass("hover");
						}
					);
					
					// Add click events for each device
					$("#myDeviceDynamic1").find("td.myDeviceColumn").bind("click", function(event) {
					
						if (!$(this).hasClass("active")) {
							$("#myDeviceDynamic1").find(".active").each(function() {
								$(this).find(".currentAccountPhone").remove();
								$(this).removeClass("active");
							});
							
							$(this).addClass("active");
							$(this).prepend( "<div class=\"currentAccountPhone\">" +
												"<img src=\"/global/images/icons/ico_confirmation_sml.gif\" alt=\"Currently Selected Device\" />"+
												"<br />Selected</div>");
							
							$("#txtNewDevice").val($(this).find(".phoneID").html());
						}
					});
					
					$("#myDeviceDynamic1").find("td.myDeviceColumn:first").trigger("click");

					$("#manageUserRequests").sortableTable({
						pagination: true,
						paginationBelow: false,
						rowsPerPage: 5,
						excludeColumns: [0, 1, 2]
					});
				}
				
			}
			else if (frmPreferences.hasClass("resetVoicemailDevicePasscode") || (frmPreferences.hasClass("resetVoicemailAccountPasscode"))) {

				// Backup the table reset search and sorting
				var tableBackup = $("#manageVoicemailAccounts").html();
				
				// Only validate form if the user want to change passcode
				var setupFormValidation = function () {
					if ( $("#radVoicemailPasscodeChange").is(':checked') ) {
						preferencesFormFields = {
							txtVoicemailPasscode: {
								name: "txtVoicemailPasscode",
								type: "voicemailPasscode",
								required: true,
								emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.passcodeEmpty"),
								invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.passcodeInvalid")
							},
							txtVoicemailPasscodeConfirm: {
								name: "txtVoicemailPasscodeConfirm",
								type: "match",
								required: true,
								mustMatch: "txtVoicemailPasscode",
								emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.passcodeConfirmEmpty"),
								invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.passcodeConfirmInvalid")
							}
						};
						$("#changePasscode input[type='text'], #changePasscode input[type='password']").removeAttr("disabled");
					}
					else {
						// User wants to reset passcode
						preferencesFormFields = null;
						$("#changePasscode input[type='text'], #changePasscode input[type='password']").attr("disabled", "disabled").val("");
					}
					trimNickName();
				}				

				// Custom function recreate sortable with checkboxes
				var setupSortTable = function () {
					
					// Configure table as a sortable table
					$("#manageVoicemailAccounts").sortableTable({
						reverseSort: true,
						pagination: true,
						paginationBelow: true,
						rowsPerPage: 10,
						excludeColumns: [0],
						columnValueFunctions: [
							function(cell) {
								return cell.find("input").val();
							},
							function(cell) {
								return cell.text();
							},
							function(cell) {
								return cell.text();
							}
						],
						beforeSort: function() {
							//Check to see if changes have been made to the form data already, if so, reset the dataChanged variable to true
							if (originalFormData != frmPreferences.serialize()) {
								dataChanged = true;
							}
						},
						afterSort: function() {
							//If the data didn't change at all before the table got re-sorted, re-set the originalFormData variable to reflect the new sort order.
							if (!dataChanged) {
								originalFormData = frmPreferences.serialize();
							}
						}
					});
					
					// Check/Uncheck All Checkboxes
					$("#manageVoicemailAccounts a.checkAll").unbind("click").bind("click", function(event) {
						event.preventDefault();
						$(this).toggleClass("checked");
						
						if ($(this).hasClass("checked")) {
							$("#manageVoicemailAccounts INPUT[type='checkbox']").attr("checked", "checked");
						}
						else {
							$("#manageVoicemailAccounts INPUT[type='checkbox']").removeAttr("checked");
						}
						
						updateResetOptions();
						event.stopPropagation();
					});
					trimNickName();
				}
				
				var manageVoiceMailAccounts = $("#manageVoicemailAccounts");
				
				// Search Sort Table
				$("#btnSearch").bind("click", function(event) {
					
					clearErrMsg();
					
					// Get search term
					var searchTerm   = $.trim($("#txtSearchTerm").val().toLowerCase());
					var searchColumn = $("#selTableCellToSearch").val();
					
					
					if (searchTerm != "") {
						$.ajax({
							data: "searchVoicemailAccounts=true&selSearchColumn=" + searchColumn + "&txtSearchTerm=" + searchTerm,
							dataType: "html",
							type: "POST",
							url: "/mysprint/pages/secure/BaseAjaxServlet?pageContext=updatePasscode&action=search",
							async: false,
							cache: false,
							success: function(data) {
								
								if (manageVoiceMailAccounts.empty().html(data).find("tbody tr").length == 0) {
									var msg = Sprint.fn.getContentString("pSearchEmailErrors.noSearchResults");
									updateErrMsg(msg);
								}
								
								if (manageVoiceMailAccounts.find("tbody tr").length == 1) {									
									manageVoiceMailAccounts.attr("id","manageVoicemailAccount"); // Remove sorting arrows
									// Remove existing pagination controls (if there are any)									
									var pagination = frmPreferences.find(".modulePlain");									
									pagination.find(".tablePagination").remove();
									// If there are no checkboxs check for existence of resetOnly class,
									// on the table row and disable the radio button.
									if (($("#manageVoicemailAccount tbody tr.resetOnly").length > 0) || ($("#manageVoicemailAccounts input[type='checkbox']").length == 0 && $("#manageVoicemailAccounts tbody tr.resetOnly").length > 0)) {	
										$("#radVoicemailPasscodeReset").trigger("click");
										$("#radVoicemailPasscodeChange").attr("disabled", "disabled");
									}
								}
								trimNickName();
							},
							error: Sprint.fn.ajaxError
						});
					}
					else {
						// Fake a search and only show 50 rows
						manageVoiceMailAccounts.html(tableBackup).find("tbody tr:gt(49)").remove();
					}
					
					// Re-configure sort table
					setupSortTable();
				});
				
				// Clear sort
				$("#clearSearch").bind("click", function(event) {
					event.preventDefault();
					clearErrMsg();
					if ($("#txtSearchTerm").val() != "") {
						$("#txtSearchTerm").val("");
						manageVoiceMailAccounts.attr("id","manageVoicemailAccounts"); // Add sorting arrow
						manageVoiceMailAccounts.html(tableBackup);
						updateResetOptions();
						setupSortTable();
					}
					trimNickName();
				});
				
				var header = $("#preferencesModal .containerThreeColumnRt .headerWrapperPrimary");
				
				// Clear Error MSG
				var clearErrMsg = function () {
					header.find(".updateMessage, ul.formErrors").remove();
				}
				
				// Update Error MSG
				var updateErrMsg = function (msg) {
					clearErrMsg();
					var updateMessage = $("<ul class=\"formErrors\"><li><a href=\"#txtSearchTerm\">"+msg+"</a></li></ul>");
					updateMessage.appendTo(header);
				}

				// Trim Nickanme
				var trimNickName = function(){
					if($("#manageVoicemailAccounts").length > 0){
						$("#manageVoicemailAccounts tr").each(function(){
							var firstTd = $(this).find('td:eq(1)');
							var tempText = firstTd.text();
							if(tempText.length > 16){
								firstTd.text(tempText.substr(0, 15) + "...");
							}
						});
					}
					
					if($("#manageVoicemailAccount").length > 0){				
						$("#manageVoicemailAccount tr").each(function(){
							var firstTd = $(this).find('td:eq(0)');
							var tempText = firstTd.text();
							if(tempText.length > 16){
								firstTd.text(tempText.substr(0, 15) + "...");
							}
						});
					}
				}
				
				// Event handler for radio buttons to handle reset options
				$("#frmPreferences .resetOption").bind("click", function() {
					setupFormValidation();																	
				});
				
				// If there are no checkboxs check for existence of resetOnly class,
				// on the table row and disable the radio button.
				if (($("#manageVoicemailAccount tbody tr.resetOnly").length > 0) || ($("#manageVoicemailAccounts input[type='checkbox']").length == 0 && $("#manageVoicemailAccounts tbody tr.resetOnly").length > 0)) {	
					$("#radVoicemailPasscodeReset").trigger("click");
					$("#radVoicemailPasscodeChange").attr("disabled", "disabled");
				}
				
				// Add event handler to all checkboxes 
				// GT: Made this a "live" event because this event needs to be re-binded everytime the search is used.
				$("#manageVoicemailAccounts input[type='checkbox']").live("click", function() {
					updateResetOptions();
				});
				
				// Enable or disable reset options based on the phone type
				var updateResetOptions = function () {
					var hasResetOnly = false;
					var radReset = $("#radVoicemailPasscodeReset");
					var radChange = $("#radVoicemailPasscodeChange");
					
					$("#manageVoicemailAccounts input[type=checkbox]:checked").each(function() { 
						if ($(this).hasClass("resetOnly")) {
							hasResetOnly = true;
							return false;	  
						}
					});
					
					//Disable the change option if more than 1 device is selected
					if ($("#manageVoicemailAccounts input[type=checkbox]:checked").length > 1) {
						hasResetOnly = true;
					}
					
					if (hasResetOnly) {
						radReset.trigger("click");
						radChange.attr("disabled", "disabled");
					}
					else {
						radChange.removeAttr("disabled");
						radChange.attr("checked", "checked");
					}
					
					setupFormValidation();
				}
				
				// Configure Reveal passcode links
				var maskOptions = {
					revealLink: true,		//boolean: adds a reveal link under the input to toggle the field
					revealText: "Show me",	//string: text used for the reveal link
					hideText: "Hide me",	//string: text used for the hide link
					toggleOnFocus: false	//boolean: toogles field on focus
				};
				
				$("#txtVoicemailPasscode").inputMaskToggle(maskOptions);
				$("#txtVoicemailPasscodeConfirm").inputMaskToggle(maskOptions);
				
				//Only show 50 rows
				$("#manageVoicemailAccounts").find("tbody tr:gt(49)").remove();
				
				// Initalize compontents for reset voicemail modal
				setupFormValidation();
				setupSortTable();
				originalFormData = frmPreferences.serialize();
			}
			else if (frmPreferences.hasClass("communicationEmailPassword")) {
				preferencesFormFields = {
					txtPreferencesPassword: {
						name: "txtPreferencesPassword",
						type: "password",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.changePasswordEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.changePasswordInvalid")
					},
					txtPreferencesPasswordConfirm: {
						name: "txtPreferencesPasswordConfirm",
						type: "match",
						required: true,
						mustMatch: "txtPreferencesPassword",
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordConfirmEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.passwordConfirmInvalid")
					}
				};
			}
			else if (frmPreferences.hasClass("blockDigitalMedia") || frmPreferences.hasClass("blockWebAccess")) {
			
				// Add the disabled icon for blocked phones -- by Sujeeth
				$("#manageUserRequests").find("td.blocked").each(function() {
					$(this).addClass("active");
					$(this).prepend( "<div class=\"currentAccountPhone\">" +
										"<img src=\"/global/images/icons/ico_blocked.gif\" alt=\"Blocked Device\" />" + 
										"<br />Blocked</div>");
				});
				// Disable clicking on submit if there are no phones
				frmPreferences.find("a.disabled").unbind("click").bind("click", function(event) {
					event.preventDefault();
				});
				
				// Add click events for each device
				$("#manageUserRequests").find("td.myDeviceColumn").bind("click", function(event) {
					var cell = $(this);
					var bPhones  = frmPreferences.find("#txtBlockedPhones").val();
					var phoneID1 =  cell.attr("id").replace(/phoneID_/, "");
					var phoneID2 = "," + phoneID1;
					var phoneID3 = phoneID1 + ",";
						
					if (cell.hasClass("disabled")) {
						// Do nothing since the device is disabled
					}
					else if (cell.hasClass("active")) {
						cell.find(".currentAccountPhone").remove();
						cell.removeClass("active").removeClass("blocked");
						cell.prepend( "<div class=\"currentAccountPhone\">" +
											"<img src=\"/global/images/icons/ico_confirmation_sml.gif\" alt=\"Currently Selected Device\" />"+
											"<br />Unblock</div>");
						cell.data("isBlocked",false);
						// Remove the phone ID for the deselected phone from the list of blocked phones
						if (bPhones.search(phoneID2) > -1) {
							bPhones = bPhones.replace(phoneID2, "");
						}
						else if (bPhones.search(phoneID3) > -1) {
							bPhones = bPhones.replace(phoneID3, "");
						}
						else {
							bPhones = bPhones.replace(phoneID1, "");
						}
						frmPreferences.find("#txtBlockedPhones").val(bPhones);
					} else {
						if(cell.find('div.currentAccountPhone').length >= 1){
							//cell.removeClass('blocked');
							cell.find('div.currentAccountPhone').html( "<img src=\"/global/images/icons/ico_confirmation_sml.gif\" alt=\"Currently Selected Device\" /><br />Selected");
							cell.find('div.currentAccountPhone').closest('td').addClass("active");
						} else {
							cell.prepend( "<div class=\"currentAccountPhone\">" +
											"<img src=\"/global/images/icons/ico_confirmation_sml.gif\" alt=\"Currently Selected Device\" />"+
											"<br />Selected</div>").addClass("active");
						}
						cell.data("isBlocked",true);
							
						
						// Add the phone ID for the selected phone from the list of blocked phones
						if (bPhones.search(phoneID1) == -1) {
							if (bPhones == "") {
								bPhones = phoneID1;
							}
							else {
								bPhones += phoneID2;
							}
						}
						frmPreferences.find("#txtBlockedPhones").val(bPhones);
					}
				});
				
				$("#manageUserRequests").find("td.myDeviceColumn").hover(function() {
						$(this).addClass("hover");
					},function() {
						$(this).removeClass("hover");
					}
				);
				
				// Select all phones that can be selected
				frmPreferences.find("a.selectAll").unbind("click").bind("click", function(event) {
					event.preventDefault();
					$("#manageUserRequests").find("td.myDeviceColumn:visible").each(function() {
						var cell = $(this);
						if (!cell.hasClass("blocked") && !cell.hasClass("active")) {
							cell.trigger("click");
						}
					});
				});
				
				// Deselect all selected phones
				frmPreferences.find("a.clearAll").unbind("click").bind("click", function(event) {
					event.preventDefault();
					$("#manageUserRequests").find("td.myDeviceColumn.active:visible").trigger("click");
				});
				
				$("#manageUserRequests").sortableTable({
					pagination: true,
					paginationBelow: false,
					rowsPerPage: 5
				});
				$("#manageUserRequests").find('.accountPhoneContent .phoneInfo strong').each(function(){
					var phoneName = $(this);
					var phoneInfoWidth = 110;
					var phoneNameWidth = phoneName.width();
					if(phoneNameWidth > phoneInfoWidth){
						var tempText = phoneName.text();
						tempText = tempText.substr(0, 15) + "...";
						phoneName.text(tempText);
					}
				});
			}
			// "blockDataAccess" || "blockPictureMail" || "blockPermissions"
			else if (frmPreferences.hasClass("blockDataAccess") || frmPreferences.hasClass("blockPictureMail") || frmPreferences.hasClass("blockPermissions")) {
				
				var setUpCells = function(){
					var subscriberIDs = "";
					var visibleDevices = $("#manageUserRequests td.myDeviceColumn:visible");
					
					visibleDevices.each(function(){
						var cell = $(this);
						var cellId = cell.attr("id");
						if(subscriberIDs == ""){
							subscriberIDs += cellId;
						} else {
							subscriberIDs += "," + cellId;
						}
					});
					
					//ajax call to get blocked status
					var cellDetails = getPageDetails(subscriberIDs);
					var cellDetailsLength = (cellDetails.isBlocked) ? cellDetails.isBlocked.length : 0;
					
					for (var i=0; i<cellDetailsLength; i++) {
						if(cellDetails.isBlocked[i] == 1){
							var thisCell = $(visibleDevices[i]);
							thisCell.addClass("blocked");
							thisCell.data("isBlocked",true);
						}
					}
				}
				//setup account owner
				//function which contains ajax call to fetch data and render data cells
				getAccountDevices($("#subscriberListWrapper"));
				
				var cells = $("#manageUserRequests td.myDeviceColumn");
				
				cells.bind("click",function(e){
					var cell = $(this);
					e.preventDefault();
					if(!cell.data("ajaxSuccess")){
						var subscriberData = getSubscriberDetails(cell.attr("id"));
						if(typeof subscriberData == "object"){
							cell.data("ajaxSuccess",true);
								
							if(subscriberData.hotlined){
								disableCell(cell,subscriberData.tooltipMessage);
							}
							else if(subscriberData.error){
								disableCell(cell,subscriberData.tooltipMessage,"error");
							}
							else {
								toggleCell(cell);
							}
						}
					} else {
						if(!cell.hasClass("disabled")){
							toggleCell(cell);
						}
					}
				});
				
				if(cells.length > 0){
					if($("#subscriberListWrapper").data("deviceUser") != true) {
						if(cells.length <= 10){
							setUpCells();
						} else {
							$("#manageUserRequests").sortableTable({
								pagination: true,
								paginationBelow: false,
								rowsPerPage: 5,
								afterPageUpdate: function(){
									//call function at top of this script block
									setUpCells();
								}
							});
						
							//pagination page number click event
							$("ul.pageList li a").bind("click", function(e){
								if(closeIntercept()){
									//if user selects "OK" then revert toggled selections by triggering click
									var visibleDevices = $("#manageUserRequests td.myDeviceColumn[class~=active]:visible");
									visibleDevices.trigger("click");
								} else {
									e.preventDefault();
									$(this).blur();
									return false;
								}
							});
						}
					}
				}
			}
			
			// -------------------- //
			// Start: emailSettings //
			// -------------------- //
			else if (frmPreferences.hasClass("emailSettings")){
				preferencesFormFields = {
					txtCommEmail: {
						name: "txtCommEmail",
						type: "enterpriseEmailAddress",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					}
				};
				
				// Disable clicking on submit if there are no phones
				frmPreferences.find("a.disabled").unbind("click").bind("click", function(event) {
					event.preventDefault();
				});

				var deviceData;
				var detailsRow = $("#deviceDetailsRow");
				detailsRow.data("cell",detailsRow);
				
				//function which contains ajax call to fetch data and render data cells
				getAccountDevices($("#subscriberListWrapper"));
				
				//add click event for error icons to open drawer and scroll page to the email input field
				$("#manageUserRequests td.myDeviceColumn").find("div.accountPhoneError").bind("click",function(e){
					e.preventDefault();
					var cell = $(this).parent();
					if(cell.is(".selected") == false){
						if($("#deviceDetailsWrapper").css("display") == "none"){
							//pause for comm details to open
							$("#txtCommEmail").animate({left: 0}, 500,function(){
								$("#txtCommEmail").scrollTo();
							});
						} else {
							//pause for comm details to close and then open
							$("#txtCommEmail").animate({left: 0}, 1000,function(){
								$("#txtCommEmail").scrollTo();
							});
						}
					} else {
						$("#txtCommEmail").scrollTo();
						e.stopImmediatePropagation();
					}
				});
				
				$("#manageUserRequests").deviceDrawer({
					beforeSlideUp: function(e){
						var cell = $(e.currentTarget);
						var cellId = cell.attr("id");
						
					//Check if this device has been marked as suspended
						if(cell.data("suspended")){
							disableCell(cell,cell.data("suspendedToolTip"));
							return false;
						} else {
							//Fire ajax call to retrieve detailed info on this subscriber
							if(!cell.data("ajaxSuccess")){
								var subscriberData = getSubscriberDetails(cellId);
								if(typeof subscriberData == "object"){
									cell.data("ajaxSuccess",true);
								
									if(subscriberData.hotlined){
										disableCell(cell,subscriberData.tooltipMessage);
										return false;
									}
									else if(subscriberData.error){
										disableCell(cell,subscriberData.tooltipMessage,"error");
										cell.data("ajaxSuccess",false);
										return false;
									}
									else {
										
										cell.append($('<input type="hidden" name="hidCommEmail_'+cellId+'" id="hidCommEmail_'+cellId+'" class="hidCommEmail" value="'+subscriberData.deviceEmail+'" />'));
										cell.append($('<input type="hidden" name="hidCommOptions_'+cellId+'" id="hidCommOptions_'+cellId+'" class="hidCommOptions" value="'+subscriberData.deviceCommOptions+'" />'));
										
										//save the original Communication Options
										if(cell.data("originalOptions") == undefined){
											cell.data("originalOptions",subscriberData.deviceCommOptions);
										}
										if(cell.data("originalEmail") == undefined){
											cell.data("originalEmail",subscriberData.deviceEmail);
										}
										
										//update the originalFormData string with our fresh server data and sort it
										originalFormData += "&" + cell.find("input:hidden").serialize();
										sortQueryString(originalFormData);
									}
								}
							}
						}
					},
					afterSlideUp: function(e){
						var cell = $(e.currentTarget);
						var selectBoxes = detailsRow.find("select");
						var selectBoxesCount = selectBoxes.length;
						var commEmail = cell.find("input.hidCommEmail").val();
						var commOptionsString = cell.find("input.hidCommOptions").val();
						var commOptionsArray = commOptionsString.split(",");
						
						//set select box values based on server data stored in the hidden inputs
						for (var i = selectBoxesCount; i--; ) {
							var selectNode = selectBoxes.get(i);
							selectNode.selectedIndex = commOptionsArray[i];
						}
						
						$("#txtCommEmail").val(commEmail);
						singleFieldValidation.call($("#txtCommEmail"));
					
					},
					beforeToggle: function(e){
						var cell = $(e.currentTarget);
						var commEmail = cell.find("input.hidCommEmail").val();
							
						//validate the field since quick fill may have changed it
						$("#txtCommEmail").val(commEmail);
						singleFieldValidation.call($("#txtCommEmail"));						
					}
				});
				
				$("#deviceDetailsRow select").each(function(i){
					var $this = $(this);
					$this.bind("change",function(e){
						var cell = detailsRow.data("cell");
						var commOptionsString = cell.find("input.hidCommOptions").val();
						var commOptionsArray = commOptionsString.split(",");
						var selected = eval($this.val())?"1":"0";
						
						commOptionsArray[i] = selected;
						commOptionsString = commOptionsArray.join();
						cell.find("input.hidCommOptions").val(commOptionsString);
						
						//compare original data and toggle checkmark
						if(commOptionsString == cell.data("originalOptions") && $("#txtCommEmail").val() == cell.data("originalEmail")){
							cell.removeClass("active emailError");
						} else {
							if(!cell.hasClass("emailError")){
								//flag select boxes as updated and active
								updateCell(cell,"updated");
							}
						}
					});
				});
				
				$("#txtCommEmail").bind("blur",function(e){
					var cell = detailsRow.data("cell");
					var commOptionsString = cell.find("input.hidCommOptions").val();
					var stringEmail = $("#txtCommEmail").val();
					
					singleFieldValidation.call(this);
					
					//check for error class on this input
					if ($(this).hasClass("error") == false){
						if(commOptionsString == cell.data("originalOptions") && stringEmail == cell.data("originalEmail")){
							//commOptions are unchanged and email is unchanged
							updateCell(cell,"reset");
						} else {
							updateCell(cell,"updated");
						}
						cell.data("prevEmailIsError",false);
					} else {
						updateCell(cell,"error");
					}
					//copy the email input text to the hidden field
					cell.find("input.hidCommEmail").val(stringEmail);
				}).bind("change",function(e){
					if($("#chkQuickFillEmail").is(":checked")){
						$("#chkQuickFillEmail").removeAttr("checked");
					}
				});
				
				//click event for quick fill email checkbox
				$("#chkQuickFillEmail").bind("click",function(e){
					var chkQuickFill = $(this);
					var chkQuickFillVal = chkQuickFill.val();
					//var cells = $("#manageUserRequests").find("td.myDeviceColumn:visible:not(.disabled,.error)");
					
					//gather all cells that are not suspended or have already been marked as hotlined and ajaxSuccess is not true
					var cellIDs = "";
					var cells = $("#manageUserRequests td.myDeviceColumn:visible:not(.disabled,.error)").filter(function(i){
						var cell = $(this);
						if(cell.data("suspended") != true){
							if(cell.data("ajaxSuccess") != true ){
								if (cellIDs == ""){
									cellIDs += cell.attr("id");
								} else {
									cellIDs += "," + cell.attr("id");
								}
								return true;
							}
						} else {
							//trigger click on suspended phones. The event will gray out the cell and render tooltip
							cell.trigger("click");
						}
					});
					
					//submit cell id's to server to fetch email and customer preferences or hotlined status or fetch failure
					if(cellIDs.length > 0) {
						//cellData contains the results of the ajax call but the data returned from the server is formatted differently. Specifically, no devices array returned on single items
						//check if cellIDs length is 1 and set up the variables accordingly
						
						//function which preforms ajax call for the cells we've filtered
						var cellData;
						var cellIdArray = cellIDs.split(",");
						
						if(cellIdArray.length > 1){
							//fetch data for multiple devices
							cellData = getPageDetails(cellIDs);
							var cellDataCount = cellData.devices.length;
						} else {
							//fetch data for a single device
							cellData = getSubscriberDetails(cellIDs);
							var cellDataCount = 1;
						}
						
						//process returned ajax data and update cells accordingly
						for (var i=0; i<cellDataCount; i++) {
							var cell = $(cells[i]);
							var thisCellData;
							
							if(cellDataCount == 1){
								thisCellData = cellData;
							} else {
								thisCellData = cellData.devices[i];
							}
							
							if(thisCellData.hotlined){
								//if cell is hotlined or suspended then trigger disabled state and render tooltips
								disableCell(cell,thisCellData.tooltipMessage);
								cell.data("ajaxSuccess", true);
							}
							else if(thisCellData.error){
								//if error fetching data for cell then trigger error state.
								disableCell(cell,thisCellData.tooltipMessage,"error");
							}
							else if(cell.data("ajaxSuccess")){
								//do nothing, move loop forward
								continue;
							}
							else {
								var cellId = cell.attr("id");
								
								//append email address to cell
								cell.append($('<input type="hidden" name="hidCommEmail_'+cellId+'" id="hidCommEmail_'+cellId+'" class="hidCommEmail" value="'+thisCellData.deviceEmail+'" />'));
								
								//append communication preferences to cell
								cell.append($('<input type="hidden" name="hidCommOptions_'+cellId+'" id="hidCommOptions_'+cellId+'" class="hidCommOptions" value="'+thisCellData.deviceCommOptions+'" />'));
								
								//save the original Email Address
								if(cell.data("originalEmail") == undefined){
									cell.data("originalEmail",thisCellData.deviceEmail);
								}
								
								//save the original Communication Options
								if(cell.data("originalOptions") == undefined){
									cell.data("originalOptions",thisCellData.deviceCommOptions);
								}
								
								originalFormData += "&" + cell.find("input:hidden").serialize();
								sortQueryString(originalFormData);
								cell.data("ajaxSuccess", true);
							}
						};
					}
					
					//reassign cells variable now that some cells may have been disabled or have errors
					cells = $("#manageUserRequests td.myDeviceColumn:visible:not(.disabled,.error)");
					
					if(chkQuickFill.is(":checked")){
						//append or update hidden email input
						//mark all visible cells as updated
						//if email cell exists then save value as data
						cells.each(function(){
							var thisCell = $(this);
							
							if (!thisCell.hasClass("disabled") && !thisCell.hasClass("error")){
								var hidEmailInput = thisCell.find("input.hidCommEmail");
								
								//save the email value to cell.data to be used on uncheck
								if(hidEmailInput.val() != chkQuickFillVal){
									if(thisCell.data("originalEmail") != chkQuickFillVal){
										updateCell(thisCell,"updated");
									} else {
										if(thisCell.find("input.hidCommOptions").val() == thisCell.data("originalOptions")){
											updateCell(thisCell,"reset");
										}
									}
									thisCell.data("prevEmailVal",hidEmailInput.val());
									hidEmailInput.val(chkQuickFillVal);
								}
								
								if (thisCell.hasClass("emailError")){
									//save the cell error so it can be restored later
									thisCell.data("prevEmailIsError",true);
								}
								
								//Update the email input if the details box is expanded and trigger blur to remove possible error messages and styles
								if(thisCell.hasClass("selected")){
									if($("#txtCommEmail").val() != chkQuickFillVal){
										$("#txtCommEmail").val(chkQuickFillVal);
									}
									//remove errors on this input
									if ($("#txtCommEmail").next().is("label.error")){
										$("#txtCommEmail").removeClass("error").next().remove();
									}
								}
							}
						});
						
					} else {
						cells.each(function(){
							thisCell = $(this);
							if (!thisCell.hasClass("disabled") && !thisCell.hasClass("error")){
								var hidEmailInput = thisCell.find("input.hidCommEmail");
								//Update the email input if the details box is expanded and trigger blur to show possible error messages and styles
								if(thisCell.find("input:hidden").length < 2){
									//if there's only one hidden input then no ajax call was made on this cell
									hidEmailInput.remove();
									updateCell(thisCell,"reset");
								} else {
									if(thisCell.data("prevEmailVal")){
										hidEmailInput.val(thisCell.data("prevEmailVal"));
										if(thisCell.data("prevEmailVal") == thisCell.data("originalEmail") && thisCell.find("input.hidCommOptions").val() == thisCell.data("originalOptions")){
											//if the saved email value is the same as the original value then remove updated checkmark icon
											updateCell(thisCell,"reset");
										} else {
											updateCell(thisCell,"updated");
										}
									} else if (thisCell.data("originalEmail")){
										hidEmailInput.val(thisCell.data("originalEmail"));
									}
									//hidEmailInput.val(thisCell.data("prevEmailVal"));
									if(thisCell.hasClass("selected")){
										$("#txtCommEmail").val(hidEmailInput.val()).triggerHandler("blur");
									} else if (thisCell.data("prevEmailIsError") == true){
										updateCell(thisCell,"error");
									}
								}
							}
						});
					}
				});
				
				$("#manageUserRequests").sortableTable({
					pagination: true,
					paginationBelow: false,
					rowsPerPage: 5
				});
				
				originalFormData = sortQueryString(frmPreferences.serialize());
				
				//pagination page number click event
				$("ul.pageList li a").bind("click", function(e){
					if(closeIntercept()){
						//if user selects "OK" then remove previous page settings
						var cell = $("#manageUserRequests td.myDeviceColumn");
						$("#deviceDetailsWrapper").slideUp();
						detailsRow.data("cell", detailsRow).appendTo($("#deviceDetailsTable"));
						
						//remove changed data, which is being discarded, from originalFormData object
						var activeCells = $("#manageUserRequests td.active");
						if(activeCells.length > 0){
							activeCells.each(function(){
								//find hidden inputs for this cell, get names, match/remove from originalFormData
								var cell = $(this);
								var hidEmail = cell.find("input:hidden:first");
								var hidOptions = cell.find("input:hidden:last");
								
								var trimStart = originalFormData.lastIndexOf("&" + hidEmail.attr("name"));
								var trimEnd = originalFormData.lastIndexOf(hidOptions.attr("name")) + hidOptions.serialize().length;
								var dataToTrim = originalFormData.substring(trimStart,trimEnd);
								
								originalFormData = originalFormData.replace(dataToTrim,"");
							})
						}
						
						//remove errorText and updateText
						frmPreferences.prev().find("ul.formErrors").remove();
						frmPreferences.prev().find("div.updateMessage").remove();
						
						//remove updated icons, error icons and ajax form data	
						cell.removeData("ajaxSuccess").removeClass("active selected emailError serverError").find("input").remove();
						
						//uncheck Quick Fill email
						$("#chkQuickFillEmail").removeAttr("checked");
						
					} else {
						e.preventDefault();
						$(this).blur();
						return false;
					}
				});
			}
			
			// ----------------------- //
			// END: emailSettings      //
			//                         //
			// Start: oneTouchSettings //
			// ----------------------- //
			
			else if (frmPreferences.hasClass("oneTouchSettings")){
				// Disable clicking on submit if there are no phones
				frmPreferences.find("a.disabled").unbind("click").bind("click", function(event) {
					event.preventDefault();
				});

				var deviceData;
				var detailsRow = $("#deviceDetailsRow");
				detailsRow.data("cell", detailsRow);
				
				// Function which contains ajax call to fetch data and render data cells
				getAccountDevices($("#subscriberListWrapper"));
				
				$("#manageUserRequests").deviceDrawer({
					
					beforeSlideUp: function(e){
												
						var cell = $(e.currentTarget);
						var cellId = cell.attr("id");
												
						// Check if this device has been marked as suspended
						if(cell.data("suspended")){
							disableCell(cell, cell.data("suspendedToolTip"));
							return false;
						} else {
							
							// Post data when an option is chosen
							$('#btnSubmitOneTouchOff, #btnSubmitOneTouchOn').unbind('click').bind('click', function(event) {
								
								// Update hidden input with new options
								cell.data("originalOptions", event.currentTarget.id);
								cell.find('#hidCommOptions_' + cellId).val(event.currentTarget.id);
								
								// Post data
								processPreferencesForm(event);
								
								// Close the drawer
								cell.trigger('click');
																																																				
								// Make sure to get fresh data from the server
								cell.data("ajaxSuccess", false);
								
								// Make sure the beforeSlideUp callback is called next time the drawer is opened
								$('#deviceDetailsRow').removeData('cell');

								event.preventDefault();

							});
							
							//Fire ajax call to retrieve detailed info on this subscriber
							if(!cell.data("ajaxSuccess")) {
								
								// Get current options							
								var subscriberData = getSubscriberDetails(cellId);
								
								// format cells when returned data
								if(typeof subscriberData == "object") {
																		
									cell.data("ajaxSuccess", true);
									
									if(subscriberData.hotlined){
										disableCell(cell, subscriberData.tooltipMessage);
										return false;
									} else if(subscriberData.error) {
										disableCell(cell, subscriberData.tooltipMessage, "error");
										return false;
									} else {
										// Make sure to remove any unneeded data
										$('#manageUserRequests input:hidden').remove();
										cell.append($('<input type="hidden" name="hidCommOptions_' + cellId + '" id="hidCommOptions_' + cellId + '" class="hidCommOptions" value="' + subscriberData.deviceCommOptions + '" />'));
										cell.append($('<input type="hidden" name="subscriberID" id="subscriberID" class="hidSubscriberID" value="' + cellId + '" />'));
										
										// Save the original Communication Options						
										cell.data("originalOptions", subscriberData.deviceCommOptions);
									}
								}
							}							
						}
						
						/*
							Tech: 	When the server returns the deviceCommOptions array, a value of "1" defines that the user
									can act upon the option. A value of "0" will hide the option from the user. The options are
									ordered [one touch off, one touch on].
						*/
						$('.oneTouchModule').each(function(i, item) {
							var displayValue = (cell.data("originalOptions")[i]) ? 'block' : 'none';
							$(item).css('display', displayValue);
						});
						
						// Remove errors and update messages
						frmPreferences.prev().find("ul.formErrors").remove();
						frmPreferences.prev().find("div.updateMessage").remove();
						
						//close any open tooltips
						$("#tooltip").triggerHandler("mouseleave");
					}
					
				});
				
				$("#manageUserRequests").sortableTable({
					pagination: true,
					paginationBelow: false,
					rowsPerPage: 5
				});
				
				// Pagination page number click event
				$("ul.pageList li a").bind("click", function(e){
					$("#deviceDetailsWrapper").slideUp();
					detailsRow.data("cell", detailsRow).appendTo($("#deviceDetailsTable"));
				});
			}


			// --------------------------------- //
			// END: oneTouchSettings	         //
			//							         //
			// START: subscriber status				 //
			// --------------------------------- //
			else if (frmPreferences.hasClass("subscriberStatus")){
				preferencesFormFields = {
					//validations for search 
					searchKey: {
						name: "searchKey",
						type: "phoneNumber",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field) {
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							var fieldValue = field.val();
							var searchCriteria = $("#searchType option:selected").val();
							var validSearchKey = false;

							if(searchCriteria == "name"){
								if(fieldValue){
									var stringChk = fieldValue.split(' ');
									if(stringChk.length >= 2){
										this.invalidErrorMessage = 'Please validate the search key. Search key will have only one value.';
										return validSearchKey;
									}else{
										validSearchKey = Sprint.formFieldTypes.subscriberName.test(fieldValue);
										if (!validSearchKey) {
											this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.displayNameInvalid");
											return validSearchKey;
										}
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else if(searchCriteria == "ptn"){
								if(fieldValue){
									validSearchKey = /^\d{3,10}$/.test(fieldValue);
									if (!validSearchKey) {
										this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberSearchVal");
										return validSearchKey;
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else {
								
								if(fieldValue){
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.SearchCriteria");
									validSearchKey ==  false;
								}
							}
							return validSearchKey;
						}
					},
					//text controls:
					txtBlockNumber: {
						name: "txtBlockNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					},
					txtAllowNumber: {
						name: "txtAllowNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					},
					//voice block number 
					voiceBlockNumber: {
						name: "voiceBlockNumber",
						type: "phoneNumber",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){
							//reset the invalid error message
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							
							var fieldValue = field.val();
							var validDevice = Sprint.formFieldTypes.phoneNumber.test(fieldValue);

							if (validDevice) {
								//test for exceptions and duplicate values in the list. Exceptions are tested first.
								var cell = $("#accntCntrolSubsList").find('form#bulkfrmPreferences');
								var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
								
								//create exception list
								var unblockableList = $.trim(cell.find("input.hidExceptionList").val());
								if(unblockableList.length > 0){
									var unblockableNums = unblockableList.split(',');
									var unblockableNumsCount = unblockableNums.length - 1;
									
									for (var i = unblockableNumsCount; validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(unblockableNums[i]) !== '') {
											validDevice = $.trim(unblockableNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneNumberUnblockable");
										return validDevice;
									}
								}
								
								// No list means no dupes
								var blockedList = $.trim(cell.find("input.hidBlockList").val());
								if (blockedList.length <= 0) {
									return true;
								} else {
									var blockedNums = blockedList.split(',');
									var blockedNumsCount = blockedNums.length - 1;
									
									for (var i = blockedNumsCount;validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(blockedNums[i]) !== '') {
											validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
										return validDevice;
									}
								}
							}
							return validDevice;
						}
					}
				};
				Sprint.frmpreferences.browserChkFrmPref = 1;

				var accountControlsURL = $("#hidAccountControlsURL").val();
				var hidCurrentUserRole = $("#hidCurrentUserRole").val();
				//$("div.searchKeys p:first").append('<br/> If you are using Internet Explorer 6 or 7 and have selected 200 subscribers or more, you may see an alert after clicking "Submit".  Select "No" in the message to submit your selected subscribers or click "Yes" to proceed to the next page, noting that your request may be incomplete.  To avoid this in the future, upgrade your browser or select fewer subscribers.');
				if(hidCurrentUserRole == "deviceSubscriber"){
					var filterSettings = $("input#hidSubscriberID, input#hidAccFilters").serialize();
					var accCntrl = 'All';
				} else {
					var filterSettings = $("div.searchFilters select,input#hidSubscriberID ,input#banNumber, input#nodeID, input#hidErrormessage, input#hidShowErrorMessage, input#dacNodeId").serialize();
					var accCntrl = $("#accFilters option:selected").val();
				}
				
				if($("#selfrmPrefSelectAccount").length > 0){
					var accountNum = 	$("select#selfrmPrefSelectAccount option:selected").text();
					// extract number from BAN
					var accountId = accountNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
					if(typeof(bulkAccountStatusOmitureCall) != "undefined"){
						bulkAccountStatusOmitureCall(accCntrl, accountId);
					}
				} else {
					if(typeof(bulkDeviceUserPageOmitureCall) != "undefined"){
						bulkDeviceUserPageOmitureCall(accCntrl);
					}
				}
				function getAccountControlsTable(filterSettings){
					//fetch subscribers table
					$.ajax({
						data: filterSettings,
						dataType: "html",
						type: "GET",
						url: accountControlsURL,
						async: false,
						success: function(tableData){
							$("#subscriberListWrapper").html(tableData);
							
							
							$("#subscriberStatusTableBody div.controlTitle a.launchPreferencesModal").bind("click",function(e){
								e.preventDefault();
								var chkLen = $("#subscriberListModal #subscriberListWrapper input[type='checkbox']:checked").length;
								var accCntrlSubLen = $("#accntCntrolSubsList form#bulkfrmPreferences").length;
								if((chkLen > 0) || (accCntrlSubLen > 0)){
									var confirmMsg = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
									if(confirmMsg){
										var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).attr("href")), "modal");
										Sprint.ASLoadModalContent(modalPath);
									} else {
										return false;
									}
								} else {
									var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).attr("href")), "modal");
									Sprint.ASLoadModalContent(modalPath);

								}
							});
							// This block won't be necessary when implemented on server side
							// check to see if all statuses are hidden and if so then hide the previous row that has the subscriber's name, number and device
							/*var statusCells = $("#subscriberListWrapper").find("div.subscriberStatus");
							statusCells.each(function(e){
								var $this = $(this);
								if($this.children().length <= 0){
									$this.addClass("noMatch").parents("tr:first").prev().addClass("noMatch");
								} else {
									$this.removeClass("noMatch").parents("tr:first").prev().removeClass("noMatch");
								}
							});*/
							
							var subscriberList = $("#subscriberStatusTable .ac_subscriber");
							var hidSubscriberCount = $("#hid_SubscriberCount").val();
							var subscribersListFlag = $("input#hid_isSubListComplete").val();
							var last_subscriber_id = $("#subscriberStatusTableBody tr.ac_subscriber:last").find('input[name=selectSubscriber]').val();
							$("#hid_lastsubid").val(last_subscriber_id);

							//If more than 5 subscriptions per page enable the pagination.
							//If hid_accsubscriberstatus="true" enable the "Prev" and "next" buttons and if it is false hide the "prev" "next" buttons
							if(subscriberList.length > 10){
								if(hidSubscriberCount > 50){
									$("#subscriberStatusTable").sortableTable({
										sorting: false,
										pagination: true,
										rowsPerPage: 20,
										excludeColumns: [0, 4], 
										paginationNextPrev:true,
										ajaxPagination: true,
										ajaxPaginationCallback: true,
										ajaxOptions: {
											data:filterSettings+"&last_subId="+$("#hid_lastsubid").val(),
											url:"/mysprint/pages/msb/myPreferences/modals/accountcontrols/get_next_block_subscriber.jsp"
										},
										afterPageUpdate: function(){
											settingSubscriberList();
										},
										ajaxPageUpdate: function (currentTable){
											if($("#hid_isSubListComplete").length > 0){
												currentTable.data("ajaxPaginationComplete",true);
											}
											//var lastBlock = parseInt($("#hid_lastBlock").val());
											//$("#hid_lastBlock").val(lastBlock+1);
											var last_subscriber_ide = $("#subscriberStatusTableBody tr.ac_subscriber:last").find('input[name=selectSubscriber]').val();
											$("#hid_lastsubid").val(last_subscriber_ide);
											this.ajaxOptions.data = filterSettings+"&last_subId="+$("#hid_lastsubid").val();
											this.ajaxOptions.url = "/mysprint/pages/msb/myPreferences/modals/accountcontrols/get_next_block_subscriber.jsp";
											
										}
									});
								}else {
									$("#subscriberStatusTable").sortableTable({
										sorting: false,
										pagination: true,
										rowsPerPage: 20,
										excludeColumns: [0, 4], 
										paginationNextPrev:true,
										afterPageUpdate: function(){
											settingSubscriberList();
										}
									});
								}
								$("#subscriberListWrapper .tablePaginationAbove").after('<p class="paginationText">Selected subscribers will be saved as you move from page to page.</p>');
								$("#subscriberListWrapper .tablePaginationBelow").before('<p class="paginationText">Selected subscribers will be saved as you move from page to page.</p>');
							}else {
								settingSubscriberList();
							}
													
						},
						error: Sprint.fn.ajaxError
					});
				}
				
				function getSettingsOptions(target){
					var accSettings = $("#accSettings");
					var setList = acFilters[target];
					accSettings.empty();
					for (opt in setList){
						accSettings.append(settingsOptions[setList[opt]]);
					}
					accSettings.children(":first").attr("selected","selected");
				}
				//Setting options for after making ajax call 
				function settingSubscriberList(){

					//Checkboxes will show when Account controls selected from the select box
					var filterVal = $("div.searchFilters select option:selected").val();
					var currentUserVal = $("#hidCurrentUserRole").val();
					if(filterVal != "All"){
						if(((currentUserVal == "sprintCareRep") || (currentUserVal == "deviceUser") || (currentUserVal == "deviceSubscriber")) || ((currentUserVal == "subAccountUser") && (filterVal == "PERMISSIONS"))){
							$("#chkAllBan").css('display','none');
							$(".selectSubscriber").css('display','none');
							$("a#btnBulkEdit").hide();
						} else {
							$("#chkAllBan").css('display','block');
							$(".selectSubscriber").css({'display':'block','width':'50px'});
							$("a#btnBulkEdit, div.btnBulkEditTxt").show();
						}
						if($("#hid_SubscriberCount").val() > 1000){
							$("#chkAllBan #ban_selectAll").attr("disabled","disabled")
						}
					} else{
						$("a#btnBulkEdit, div.btnBulkEditTxt").hide();
					}

					//Checking bulk list check
					$("#chkAllBan input[type='checkbox']").unbind("click").bind("click",function(){
					    var isChecked = $(this).is(':checked');
						if(isChecked){
						        /*Tech implementation */
							var subscriberCount = $("#subscriberStatusTable input[type='checkbox']").length;
							$("#hidActiveCount").val(subscriberCount);
							$("#subscriberStatusTable input[type='checkbox']").removeAttr("checked");
							$("#subscriberStatusTable input[type='checkbox']").attr("disabled","disabled");
							if($("a#btnBulkEdit").hasClass('disabled')){
								$("a#btnBulkEdit").removeClass('disabled');
							}
						} else{
							$("#subscriberStatusTable input[type='checkbox']").not($('input[rel=disabled]')).removeAttr("disabled");
							if($("a#btnBulkEdit").hasClass('button1_converted')){
								$("a#btnBulkEdit").addClass('disabled');
							}
						}
					});
					//checking select all checkbox per page
					$("#subscriberStatusTableHeader input[type='checkbox']:visible").bind("click",function(){
						var isChecked = $(this).is(':checked');
						if(isChecked){
							//$("#chkAllBan input[type='checkbox']").attr("disabled","disabled");
							$("#subscriberStatusTableBody input[type='checkbox']:visible").not(':disabled').attr("checked","checked");
						} else{
							//$("#chkAllBan input[type='checkbox']").removeAttr("disabled");
							$("#subscriberStatusTableBody input[type='checkbox']:visible").not(':disabled').removeAttr("checked");
						}
					});
					//button enable/disable based on checkbox selection
					$("#subscriberStatusTable input[type='checkbox']:not(:disabled)").bind("click",function(event){
						if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
							TeaLeaf.Client.tlAddEvent(event);
						}
						var hidCheckedListVal = $("#hidCheckedList").val(); 
						var thisVal = $(this).val();
						if($(this).hasClass('chkAllPageSubs')){
								//empty
						} else {
							var isUnchked = $(this).is(':checked');
							
							if(!isUnchked){
								if(hidCheckedListVal != ''){
									var isRemoved = $.inArray(thisVal, hidCheckedListVal.split(","));
									if(isRemoved > -1){
										var hidremovedChkedList = '';
										var hidCheckedListLength = hidCheckedListVal.split(",").length-1;
										if(isRemoved == 0){
											hidremovedChkedList = hidCheckedListVal.replace(thisVal,'');
											hidremovedChkedList= hidremovedChkedList.substring(1, hidremovedChkedList.length);
										} else if(hidCheckedListLength == isRemoved){
											hidremovedChkedList = hidCheckedListVal.replace(thisVal,'');
											hidremovedChkedList= hidremovedChkedList.substring(0, hidremovedChkedList.length-1);
										}else{
											hidremovedChkedList = hidCheckedListVal.replace(thisVal,'');
											hidremovedChkedList = hidremovedChkedList.replace(',,',',');
										}
										$("input[name='hidChkMdn_"+thisVal+"']").remove();
										$("input[name='hidChkName_"+thisVal+"']").remove();
									}
									
								}
								$("#hidCheckedList").val(hidremovedChkedList);
							}
						}
						var chkLen = $("#subscriberStatusTable input[type='checkbox']:checked").length;
						
						if((chkLen>0) || (hidCheckedListVal != '')){
							if($("a#btnBulkEdit").hasClass('disabled')){
								$("a#btnBulkEdit").removeClass('disabled');
							}
						}else {
							if($("a#btnBulkEdit").hasClass('button1_converted')){
								$("a#btnBulkEdit").addClass('disabled');
							}
						}
					});
					$("#subscriberStatusTableBody .ac_subscriberDetails .subscriberStatus:visible").each(function(){
						var accCntrlStat = $(this).find('.accountControl');
						if(accCntrlStat.length == 0){
							$(this).closest('tr').prev().find('td.selectSubscriber input[type="checkbox"]').attr({'disabled':'disabled','rel':'disabled'});
						}else{
							var subStat = accCntrlStat.find('.controlStatus img').attr('class');
							if(subStat == "NotApplicable"){
								$(this).closest('tr').prev().find('td.selectSubscriber input[type="checkbox"]').attr({'disabled':'disabled','rel':'disabled'});
							}
						}
					});

					//showing tooltip and disabling the checkbox for pending and error status account controls.
					/*$("#subscriberStatusTableBody .ac_subscriberDetails .subscriberStatus").each(function(){

						//configuration for account control status row
						var no_of_rows = 2;
						var no_of_accnt_cntrls_per_row  = 7;
						var accCntrls = $(this).find(".accountControl");
						//alert(accCntrls.length);
						if((accCntrls.length > no_of_accnt_cntrls_per_row) && (no_of_rows == 2)){
							var copyAccntCntrls = $(this).find(".accountControl").eq(no_of_accnt_cntrls_per_row-1).nextAll();
							var tempContainer = copyAccntCntrls.clone();
							copyAccntCntrls.remove();
							var newSubscriberStatusDiv = $('<div class="subscriberStatus"></div>');
							newSubscriberStatusDiv.append(tempContainer);
							$(this).after(newSubscriberStatusDiv);
						}
					
						var accCntrlStat = $(this).find('.accountControl');
						if(accCntrlStat.length == 0){
							$(this).closest('tr').prev().find('td.selectSubscriber input[type="checkbox"]').attr({'disabled':'disabled','rel':'disabled'});
						}
						else if(accCntrlStat.length == 1){
							var subStat = accCntrlStat.find('.controlStatus img').attr('class');
							var tooltipMsg = accCntrlStat.find('.controlStatus img').attr('tooltipcustom');
							var noStatus = $(this).find('div').length;
							if(subStat == "Pending" || noStatus == 0 || subStat == "NotApplicable"){
								$(this).closest('tr').prev().find('td.selectSubscriber input[type="checkbox"]').attr({'disabled':'disabled','rel':'disabled'});
							}
							if(subStat == "Pending" || subStat == "Failure" || subStat == "NotApplicable"){
								var aLink = $(this).find('.controlTitle a').length;
								if(aLink > 0){
									$(this).find('.controlTitle a').attr({'class':'footnoteAnchor','tooltipcustom':''+tooltipMsg+''});
								} else {
									var aTxt = $(this).find('.controlTitle').text();
									$(this).find('.controlTitle').html('<a tooltipcustom="'+tooltipMsg+'" class="footnoteAnchor tooltip dotted" href="#">'+aTxt+'</a>');

								}
							}
						} else {
							if(accCntrlStat.length > 1){
								for(var i=0; i<accCntrlStat.length; i++){
									var subStat = accCntrlStat.eq(i).find('.controlStatus img').attr('class');
									var tooltipMsg = accCntrlStat.eq(i).find('.controlStatus img').attr('tooltipcustom');
									if(subStat == "Pending" || subStat == "Failure" || subStat == "NotApplicable"){
										var aLink = accCntrlStat.eq(i).find('.controlTitle a').length;
										if(aLink > 0){
											accCntrlStat.eq(i).find('.controlTitle a').attr({'class':'footnoteAnchor','tooltipcustom':''+tooltipMsg+''});
										} else {
											var aTxt = accCntrlStat.eq(i).find('.controlTitle').text();
											accCntrlStat.eq(i).find('.controlTitle').html('<a tooltipcustom="'+tooltipMsg+'" class="footnoteAnchor tooltip dotted" href="#">'+aTxt+'</a>');

										}
									}
								}
							}
						}
					});*/
					
					//if disabled the all scribers in the page we are disabling the select all on page checkbox
					var isAllChkDisabled = $("#subscriberStatusTableBody input[type='checkbox']:visible").filter(function(i){
						if($(this).is(':disabled')){
							return true;
						}
					});
					var chksPerPage = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").length;
					if((isAllChkDisabled.length == chksPerPage) && (chksPerPage > 0)){
						$("#subscriberStatusTableHeader input[type='checkbox']:visible").attr('disabled','disabled');
					}
					//tooltip for links
					$("a.footnoteAnchor").tooltip();
					//if button is enabled disable the button 
					if($("#subscriberListWrapper input[type='checkbox']:checked").length <= 0){
						if($("a#btnBulkEdit").hasClass('button1_converted')){
							$("a#btnBulkEdit").addClass('disabled');
						}
					}
					
					
					
					frmPreferences.data("selectedAccCntrl", $("#accFilters option:selected").val());
	
				}
				// bind "Display" button to fetch data based on filter settings
				$("#btnSubmitFilters, a#resetKeys").bind("click",function(event){
					
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}
					event.preventDefault();
					var thisTxt = $(this).attr('id');
					if(thisTxt == "resetKeys"){
						$("input#searchKey").removeClass('error');
						$("ul.formErrors").remove();
						$("#searchKey").attr('value','');
						$("#searchType option[value='default']").attr('selected','selected');
						var chkLen = $("#subscriberListWrapper input[type='checkbox']:checked").length;
						var chkedAllBan = $("#subscriberListModal  #subscriberListWrapper #chkAllBan input[type='checkbox']:checked").length;
						var hidCheckedList = $("#hidCheckedList");
						if(chkLen > 0){
						
							if(chkedAllBan >= 1){
								hidCheckedList.val("selectAllOnBan");
							}else{
								var chkedVals = '';
								$("#subscriberStatusTableBody input[type='checkbox']").not(':disabled').each(function(){
										if($(this).is(':checked')){
	
											var isAdded = $.inArray($(this).val(), hidCheckedList.val().split(","));
											if(isAdded == -1){
												chkedVals +=  $(this).val()+",";
											}
										}
								});
								var thisVal = chkedVals.substring(0, chkedVals.length-1);
								if(hidCheckedList.val() == ''){
									hidCheckedList.val(thisVal);
								} else {
									if(thisVal != ''){
										var allVal = hidCheckedList.val()+','+thisVal;
										hidCheckedList.val(allVal);
									}
								}
							}
						}
						getAccountControlsTable($("div.searchFilters select, input#banNumber, input#nodeID, input#dacNodeId, input#hidErrormessage, input#hidShowErrorMessage, input#hidCheckedList").serialize());
						var hidSubCheckList = $("input#hid_subCheckedlist").val();
						if(hidSubCheckList == "selectAllOnBan") {
							$("#subscriberListModal  #subscriberListWrapper #chkAllBan input[type='checkbox']").attr('checked','checked');
							$("#subscriberStatusTable input[type='checkbox']").removeAttr("checked").attr('disabled','disabled');
						}else {
							var checkedListArray = hidSubCheckList.split(",");
							$("div#subscriberListWrapper #subscriberStatusTable tr.ac_subscriber td input[type='checkbox']").each(function(i){
								var thisVal = $.inArray($(this).val(), checkedListArray);
								if(thisVal > -1){
									$(this).attr('checked','checked');
								}
							});
								
							//var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').is(':checked');
							var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').filter(function(i){
								if($(this).is(':checked')){
									return true;
								}
							});
							var chksPerPage = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').length;
							if((isAllChkChecked.length == chksPerPage) && (chksPerPage > 0)){
								$("#subscriberStatusTableHeader input[type='checkbox']:visible").attr('checked','checked');
							}

						}
							
						if((chkLen > 0) || (hidSubCheckList != '')){
							$("a#btnBulkEdit").removeClass("disabled");
						}
					} else {
					        var searchCriteriaSelected = $("#searchType option:selected").val();
						var searchKeyVal = $("#searchKey").val();
						var validSearchKeyVal = Sprint.formFieldTypes.subscriberName.test(searchKeyVal);
						if((searchCriteriaSelected == 'default') &&  (searchKeyVal == '' || validSearchKeyVal ==  true)){
							var searchKeyValidForm = true;
						}else{
							var searchKeyValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
						}
						
						if(searchKeyValidForm == true){
							$("#searchKey").removeClass('error');
							$("ul.formErrors").remove();
							//checking the checkbox selected length and current selected accountrol for showing alert to override the existing data.
							var currentSelectedFilter = $("#accFilters option:selected").val()
							var chkLen = $("#subscriberListWrapper input[type='checkbox']:checked").length;
							var hidsubCheckedlist = $("#hid_subCheckedlist").val();
							if((chkLen > 0 || hidsubCheckedlist != "") && frmPreferences.data("selectedAccCntrl") != currentSelectedFilter){
								
								var confirmMsg = confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.closeInterceptMessage"));
								if(confirmMsg){
									$("#preferencesModal #accntCntrolSubsList").remove();
									$("#btnBulkEdit span span span span").html("Edit control for selected subscribers");
									$("#subscriberListWrapper input[type='checkbox']").removeAttr('checked');
									$("#hidCheckedList").val("");
									$("input.hidChkedMdnList").remove();
									$("input.hidChkedNameList").remove();
									//If search key is null 'search key' and 'search criteria' are not sending to backend
									if($("#searchKey").val() == "" || $("#searchKey").val() == null){
										getAccountControlsTable($("div.searchFilters select, input#banNumber, input#nodeID, input#dacNodeId, input#hidErrormessage, input#hidShowErrorMessage").serialize());
									} else {
										getAccountControlsTable($("#searchKey,div.searchKeys select,div.searchFilters select, input#banNumber, input#nodeID, input#dacNodeId, input#hidErrormessage, input#hidShowErrorMessage").serialize());
									}
								} else {
								    var selectedVal = frmPreferences.data("selectedAccCntrl");
									$("#accFilters option[value='"+selectedVal+"']").attr('selected','selected');
									e.preventDefault();
									return false;
								}
							} else {
								var chkedAllBan = $("#subscriberListModal  #subscriberListWrapper #chkAllBan input[type='checkbox']:checked").length;
								var hidCheckedList = $("#hidCheckedList");
								var hidChkedMdnList = '';
								var hidChkedNameList = '';
								if(chkLen > 0){
									if(chkedAllBan >= 1){
										hidCheckedList.val("selectAllOnBan");
									}else{
										var chkedVals = '';
										$("#subscriberStatusTableBody input[type='checkbox']").not(':disabled').each(function(){
												if($(this).is(':checked')){
			
													var isAdded = $.inArray($(this).val(), hidCheckedList.val().split(","));
													if(isAdded == -1){
														var thisChkVal =  $(this).val();
														var Mdn = $("input[value='"+thisChkVal+"']").closest('tr').find('td.subscriberNumber').text();
														var Name = $("input[value='"+thisChkVal+"']").closest('tr').find('td.subscriberName').text();
														chkedVals +=  thisChkVal+",";
														hidChkedMdnList += '<input type="hidden" class="hidChkedMdnList" name="hidChkMdn_'+thisChkVal+'" value="'+Mdn+'" />';
														hidChkedNameList += '<input type="hidden" class="hidChkedNameList" name="hidChkName_'+thisChkVal+'" value="'+Name+'" />';
													}
												}
										});
										var thisVal = chkedVals.substring(0, chkedVals.length-1);
										if(hidCheckedList.val() == ''){
											hidCheckedList.val(thisVal);
										} else {
											if(thisVal != ''){
												var allVal = hidCheckedList.val()+','+thisVal;
												hidCheckedList.val(allVal);
											}
										}
										
										$("#subscriberListWrapper").before(hidChkedMdnList);
										$("#subscriberListWrapper").before(hidChkedNameList);
									}
								}
								//If search key is null 'search key' and 'search criteria' are not sending to backend
								if($("#searchKey").val() == "" || $("#searchKey").val() == null){
									getAccountControlsTable($("div.searchFilters select, input#banNumber, input#nodeID, input#dacNodeId, input#hidErrormessage, input#hidShowErrorMessage, input#hidCheckedList").serialize());
								} else {
									getAccountControlsTable($("#searchKey,div.searchKeys select,div.searchFilters select, input#banNumber, input#nodeID, input#dacNodeId, input#hidErrormessage, input#hidShowErrorMessage, input#hidCheckedList").serialize());
								}
								var hidSubCheckList = $("input#hid_subCheckedlist").val();
								if(hidSubCheckList == "selectAllOnBan") {
									$("#subscriberListModal  #subscriberListWrapper #chkAllBan input[type='checkbox']").attr('checked','checked');
									$("#subscriberStatusTable input[type='checkbox']").removeAttr("checked").attr('disabled','disabled');
								}else{
									var checkedListArray = hidSubCheckList.split(",");
									$("div#subscriberListWrapper #subscriberStatusTable tr.ac_subscriber td input[type='checkbox']").each(function(i){
										var thisVal = $.inArray($(this).val(), checkedListArray);
										if(thisVal > -1){
											$(this).attr('checked','checked');
										}
									});
										
									//var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').is(':checked');
									var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').filter(function(i){
										if($(this).is(':checked')){
											return true;
										}
									});
									var chksPerPage = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').length;
									if((isAllChkChecked.length == chksPerPage) && (chksPerPage > 0)){
										$("#subscriberStatusTableHeader input[type='checkbox']:visible").attr('checked','checked');
									}

								}
									
								if((chkLen > 0) || (hidSubCheckList != '')){
									$("a#btnBulkEdit").removeClass("disabled");
								}
							}
						} else {
							$("ul.formErrors").remove();
							frmPreferences.showFormErrors({
								errorData: searchKeyValidForm,
								showInline: false,
								showSummary: true,
								summaryAnchor:frmPreferences.prev(),
								showSummaryPlain: true
								/*callback: function() {
									if (frmPreferences.hasClass("subscriberStatus")) {
										if ($("ul.formErrors li a").attr("href") == "#searchKey") {
											$("ul.formErrors li a").html(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.SearchCriteria"));
										}
									}
								}*/
							});
						}
					}
					frmPreferences.data("selectedAccCntrl", $("#accFilters option:selected").val());
					//settingSubscriberList();
					
				});

				//TODO: convert hard coded text to content strings
				var settingsOptions = {
					"optAll": $('<option value="All" selected="selected">-All-</option>'),
					"optAllow": $('<option value="FULLACCESS">Allowed</option>'),
					"optBlock": $('<option value="NOACCESS">Blocked</option>'),
					"optBlockNone": $('<option value="FULLACCESS">Do not block</option>'),
					"optBlockVoiceNone": $('<option value="BLOCKNONE">Do not block</option>'),
					"optBlockTextNone": $('<option value="NOSOC">No block and block/allow list</option>'),
					"optBlockIn": $('<option value="BLOCKIN">Block inbound</option>'),
					"optBlockOut": $('<option value="BLOCKOUT">Block outbound</option>'),
					"optBlockInOut": $('<option value="BLOCKINOUT">Block in &amp; outbound</option>'),
					"optBlockList": $('<option value="BLOCKLIST">Block list</option>'),
					"optAllowList": $('<option value="ALLOWLIST">Allow list</option>'),
					"optPending": $('<option value="Pending">Pending</option>'),
					"optError": $('<option value="Failure">Error</option>')
				};
				var acFilters = {
					"DIGITALMEDIADOWNLOADS": ["optAll","optAllow","optBlock","optPending","optError"],
					"WEBACCESS": ["optAll","optAllow","optBlock","optPending","optError"],
					"TEXTS": ["optAll","optBlockTextNone","optBlockInOut","optBlockIn","optBlockOut","optBlockList","optAllowList","optPending","optError"],
					"PICTUREMAIL": ["optAll","optAllow","optBlock","optPending","optError"],
					"DATA": ["optAll","optAllow","optBlock","optPending","optError"],
					"VOICE": ["optAll","optBlockVoiceNone","optBlockInOut","optBlockIn","optBlockOut","optBlockList","optPending","optError"],
					"PERMISSIONS": ["optAll","optAllow","optBlock","optPending","optError"],
					"ONETOUCH": ["optAll"]
				};
				//condition for selecting account control option from left nav or mypreference landing page;
				var accFilterSelected = $("#accFilters option:selected").val();
				
				if(accFilterSelected == "All"){
					$("#accFilters").show();
					$("#tempAccFilters").hide();
					$("#accSettings").attr("disabled","disabled");
					//getSettingsOptions(accFilterSelected);
				} else if(accFilterSelected == "ONETOUCH"){
					$("#accFilters").hide();
					$("#tempAccFilters").show();
					$("#tempAccFilters option[value='"+accFilterSelected+"']").attr('selected','selected');
					$("#tempAccFilters").attr('disabled','disabled');
					$("#accSettings").attr("disabled","disabled");
				}else{
					var dacNodeStatus = $("#dacNodeIdStatus").val();

					if(dacNodeStatus == "true"){
						$("#accSettings").attr("disabled","disabled");
					}else{
						$("#accSettings").removeAttr("disabled","disabled");
					}
					$("#accFilters").hide();
					$("#tempAccFilters").show();
					$("#tempAccFilters option[value='"+accFilterSelected+"']").attr('selected','selected');
					$("#tempAccFilters").attr('disabled','disabled');
					getSettingsOptions(accFilterSelected);
				}
				
				//accFilter dropdown;
				$("#accFilters").bind("change",function(e){
					var accFilters = $(this);
					var accSettings = $("#accSettings");

					if(accFilters.val() == "All" || accFilters.val() == "ONETOUCH"){
						accSettings.find("option[value='All']").attr({'selected':'selected','disabled':'disabled'});
						accSettings.attr("disabled","disabled");
					} else {
						var dacNodeStatus = $("#dacNodeIdStatus").val();
						if(dacNodeStatus == "true"){
							accSettings.attr("disabled","disabled");
						}else{
							accSettings.removeAttr("disabled","disabled");
						}
						getSettingsOptions(accFilters.val());
					}

				});
				
				// block text : itemcustom validation
				var itemListCustomValidation = function (field){
					//used for both block and allow lists
					//reset the invalid error message
					preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.deviceInvalid");
					
					var fieldValue = field.val();
					var validDevice = false;
					if(fieldValue.length < 4){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.minimumLengthError");
					}
					else if (Sprint.formFieldTypes.enterpriseEmailAddress.test(fieldValue)) {
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneShortCode.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneNumber.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.domainName.test(fieldValue)){
						validDevice = true;
					}
					if(validDevice){
						//test for duplicate values in the list
						var cell = $("#accntCntrolSubsList").find('#bulkfrmPreferences');
					
						// No list means no dupes
						if (!cell.find("input.hidItemList").length) {
							return;
						}
						var itemListString = cell.find("input.hidItemList").val();
						var blockedNums = itemListString.split(',');
						var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
						
						for (var i = 0; validDevice && i < blockedNums.length; i++) {
							if ($.trim(blockedNums[i]) !== '') {
								//check if comparison is against a phone number
								if(Sprint.formFieldTypes.phoneNumber.test(blockedNums[i])){
									validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								} else {
									validDevice = blockedNums[i] !== $.trim(fieldValue);
								}
							}
						}
						if (!validDevice) {
							preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
						}
					} 
					else if (fieldValue.length > 4 && fieldValue.match(/@/)){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid");
					}
					return validDevice;
				}
				
				function bulkVoiceSetupControl(frmPreferences){
					var detailsRow              = frmPreferences.find("#bulkListControl");
					var blockListBox			= detailsRow.find("#blockSelectedWrapper").hide();
					var btnAddBlockedNumber		= detailsRow.find('#btnAddBlockedNumber');
					var btnRemoveNumber			= detailsRow.find('#btnRemoveBlockedNumber');
					var addNumberInput			= detailsRow.find("#voiceBlockNumber");
					var blockListSelect			= blockListBox.find("#selBlockedList");
					var btnUploadPtns           = frmPreferences.find("#btnUploadBlockedNumber");
					//blockvoice: Bind the radio selection
					$("#subScriberVoiceWrapper input.radio").bind("click", function(e) {
						var radio = $(this);
						var currentVoiceOption = frmPreferences.find("input.hidSelectedOption").val();
					
						if(detailsRow.data("lastClicked") == undefined){
							detailsRow.data("lastClicked",currentVoiceOption);
						}
					
						if (radio.val() != detailsRow.data("lastClicked")) {
						
							// If current selection is a list then trigger confirm alert that list will be lost
							if (currentVoiceOption === 'BLOCKLIST') {
								var blockList = frmPreferences.find("input.hidBlockList");
								
								if (blockList.length > 0 && blockList.val() != "") {
									var radVoicetSelection = $("#rad"+currentVoiceOption);
									var listText = $('#radBlockSelected').attr("alt");
									
									alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteVoiceListMessage");
									alertMsg = alertMsg.replace(/\[type\]/g, listText);
									
									if (confirm(alertMsg)) {
										// Empty the hidden phone list
										blockList.val("");
										
										//empty the visible select box list
										blockListSelect.empty();
									}
									else {
										e.preventDefault();
										radVoicetSelection.attr('checked','checked');
										return;
									}
								}
							}
							//clear any errors that might have been left in the add number input
							$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
						
							//updateCellStatus(cell, radio.val());
							frmPreferences.find('input.hidSelectedOption').val(radio.val());
						
						
							if (radio.attr("id") == "radBlockSelected") {
								
								$.ajax({
									data: "bulkException=Voice&exeptionMdn="+$("#hidExceptionMdn").val(),
									dataType: "json",
									type: "GET",
									url: $("#hidExceptionurl").val(),
									async: false,
									success: function(result){
										frmPreferences.find('#hidBlockLimit').val(result.blockLimit);
										frmPreferences.find('input.hidExceptionList').val(result.exceptionList);
										
									},
									error: Sprint.fn.ajaxError
								});
								// Populate the blocked list
								var hidBlockListVal = frmPreferences.find("input.hidBlockList").val();
								if(hidBlockListVal.length > 0){
									var optionList		= "";
									var blockList		= hidBlockListVal.split(',').sort();
									var blockListLength = blockList.length;
									
									for (var i=0; i<blockListLength; i++) {
										optionList += '<option value="' + blockList[i] + '">' + blockList[i] + '</option>\n';
									}
								
									blockListSelect.html(optionList);
								} else {
									blockListSelect.empty();
								}
								
								if(frmPreferences.data("blockListActive") == false){
									detailsRow.find("#blockSelectedWrapper ul.formSuggestions").show();
								} else {
									detailsRow.find("#blockSelectedWrapper ul.formSuggestions").hide();
								}
								
								blockListBox.slideDown();
							} else {
								if (blockListBox.is(":visible")) {
									blockListBox.slideUp();
								}
							}
							detailsRow.data("lastClicked", radio.val());
						}
					});
					//if blocklist is checked already
					if($("#subScriberVoiceWrapper input[type='radio']:checked").attr("id") == "radBlockSelected"){
						blockListBox.slideDown();
					}
					
					// Trigger a click on the 'add number' button when the enter/return key is pressed
					addNumberInput.bind('keypress', function(e) {
						if (e.keyCode == 13) {
							btnAddBlockedNumber.trigger('click');
							return false;
						}
					});
					
					// Bind 'add number' to list button
					btnAddBlockedNumber.bind("click", function() {
						//var cell = detailsRow.data("cell");
						
						//remove errors
						addNumberInput.removeClass('error').siblings("label").remove();
						var newAddNumberInput = addNumberInput.val();
						newAddNumberInput = newAddNumberInput.replace(/\s+/g,"");
						//return if input is empty
						if (newAddNumberInput.length == 0) {
							addNumberInput.trigger("blur").val("").focus();
							return;
						}
						
						//validate this field
						var blockVoiceValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
						
						if (blockVoiceValidForm == true) {

							//see if the limit has been reached
							var max = frmPreferences.data("blockLimit") || $("#hidBlockLimit").val() || 50;
							var itemListCount = blockListSelect.find("option").length;
							
							if(max <= itemListCount){
								return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
							} else {
								var newOption			= $('<option value="' + addNumberInput.val() + '">' + addNumberInput.val() + '</option>');
								var hidBlockList		= frmPreferences.find('input.hidBlockList');
								var hidBlockListString	= hidBlockList.val();
														
								blockListSelect.append(newOption);
								
								if(hidBlockListString == "") {
									hidBlockList.val(addNumberInput.val());
									//frmPreferences.data("originalItemList","");
								} else {
									hidBlockList.val(hidBlockListString + "," + addNumberInput.val());
								}
								addNumberInput.val("");
								//compareLists(frmPreferences);
							}
						}
						else {
							frmPreferences.showFormErrors({
								errorData: blockVoiceValidForm,
								showInline: true,
								showSummary: false
							});
						}
					});
				
					// Bind remove items from list button
					btnRemoveNumber.bind("click", function(e) {
						//remove number from list and hidden input list
						var selectedListItems = blockListSelect.find("option:selected");
						
						if(selectedListItems.length > 0){
							//var cell = detailsRow.data("cell");
							
							var hidBlockList = frmPreferences.find('input.hidBlockList');
							var hidBlockListString = hidBlockList.val();
							
							// Remove the number from the hidden block list input
							selectedListItems.each(function(){
								var $this = $(this);
								var $thisVal = $this.val();
								
								// Remove the number from the hidden block list input
								hidBlockListString = hidBlockListString.replace($thisVal,"");
								$this.remove();
							
							});
							
							//clean up the itemListString by removing any extra commas at the start, middle and end of the string
							hidBlockListString = hidBlockListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
							hidBlockList.val(hidBlockListString);
							
							//compare lists to see if this device should be flagged as updated
							//compareLists(cell);
						}
						return false;
					});
					//Bind upload Ptn's
					btnUploadPtns.bind("click",function(e){
						e.preventDefault();
						$.ajaxFileUpload({
							url:$("input#hidUploadurl").val()+"&exceptionList="+$("#hidExceptionList").val()+"&access=fileUpload&uploadFldName=accUploadFile",
							secureuri:false,
							fileElementId:'accUploadFile',
							async: false,
							dataType: "json",
							success: function (result, status){
								if(typeof(result.validated) != 'undefined'){
									$("input#accUploadFile").val("");
									if(result.validated == "true"){
										$("div.updateMessage").remove();
										blockListSelect.find('option').remove();
										var hidBlockList = frmPreferences.find('input.hidBlockList');
										var hidBlockListString = '';
										var uploadedPtns = result.accPtnList;
										var splitAccPtn = uploadedPtns.split(",");
										var newOption = '';
										for(var i=0;i<splitAccPtn.length;i++){
											newOption += '<option value="' + splitAccPtn[i] + '">' + splitAccPtn[i] + '</option>';
											if(hidBlockListString == "") {
												hidBlockListString += splitAccPtn[i];
												//frmPreferences.data("originalItemList","");
											} else {
												hidBlockListString += ","+splitAccPtn[i];
											}
										}
										blockListSelect.append(newOption);
										hidBlockList.val(hidBlockListString);
										var errorMsg  = result.errorMsg;
										if(errorMsg == "true"){
											showErrorMessage(result.errorMessage);
										}
									}else{
									blockListSelect.find('option').remove();
									showErrorMessage(result.errorMessage);
									}
								}
							},
							error: Sprint.fn.ajaxError
						});
					});
				}
				function bulkTextSetupControl(frmPreferences){
					var detailsRow              = frmPreferences.find("#bulkListControl");
					var blockSelectedBox        = detailsRow.find("#blockSelectedWrapper").hide();
					var allowSelectedBox        = detailsRow.find("#allowSelectedWrapper").hide();
						
					//blockText: Bind the radio selection
					$("#subScriberTextWrapper input.radio").bind("click",function(e){
						var $this = $(this);
						//var cell = detailsRow.data("cell");
						//var blockSelectedBox = $("#blockSelectedWrapper");
						//var allowSelectedBox = $("#allowSelectedWrapper");
						var currentSelectionVal = frmPreferences.find("input.hidSelectedOption").val();
						
						if(detailsRow.data("lastClicked") == undefined){
							detailsRow.data("lastClicked",currentSelectionVal);
						}
						
						if ($this.val() != detailsRow.data("lastClicked")) {
						
							// if current selection is a list then trigger confirm alert that list will be lost
							if(currentSelectionVal == "BLOCKLIST" || currentSelectionVal == "ALLOWLIST"){
								var itemList = frmPreferences.find("input.hidItemList");
								
								if(itemList.length > 0 && itemList.val() != ""){
									var radCurrentSelection = $("#rad"+currentSelectionVal);
									var listText = radCurrentSelection.attr("alt");
									
									alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteListMessage");
									alertMsg = alertMsg.replace(/\[type\]/g, listText);
									
									if(confirm(alertMsg)){
										//empty the hidden phone list
										itemList.val("");
										
										//empty the visible select box list
										if(currentSelectionVal == "BLOCKLIST"){
											$("#blockSelectedWrapper select").empty();
										} else {
											$("#allowSelectedWrapper select").empty();
										}
									} else {
										e.preventDefault();
										radCurrentSelection.attr('checked','checked');
										return;
									}
								}
							}
							//clear any errors that might have been left in the add number input
							$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
							
							//updateCellStatus(cell,$this.val());
							frmPreferences.find("input.hidSelectedOption").val($this.val());
							
							// Show/Hide the select list
							if($this.attr("id") == "radAllowSelected"){
								if(blockSelectedBox.is(":visible")){
									blockSelectedBox.slideUp().animate({left: 0}, 100,function(){
										allowSelectedBox.slideDown();
									});
								} else {
									allowSelectedBox.slideDown();
								}
							}
							else if($this.attr("id") == "radBlockSelected"){
								if(allowSelectedBox.is(":visible")){
									allowSelectedBox.slideUp().animate({left: 0}, 100,function(){
										blockSelectedBox.slideDown();
									});
								} else {
									blockSelectedBox.slideDown();
								}
							}
							else {
								if (blockSelectedBox.is(":visible")) {
									blockSelectedBox.slideUp();
								}
								else if (allowSelectedBox.is(":visible")) {
									allowSelectedBox.slideUp();
								}
							}
						}
						detailsRow.data("lastClicked",$this.val());
					});
					//if blocklist is checked already
					if($("#subScriberTextWrapper input[type='radio']:checked").attr("id") == "radBlockSelected"){
						allowSelectedBox.slideUp().animate({left: 0}, 100,function(){
							blockSelectedBox.slideDown();
						});
					}
					//if allowlist checked already
					if($("#subScriberTextWrapper input[type='radio']:checked").attr("id") == "radAllowSelected"){

						blockSelectedBox.slideUp().animate({left: 0}, 100,function(){
							allowSelectedBox.slideDown();
						});
					}
					
					$('#txtBlockNumber').bind('keypress', function(e) {
						if (e.keyCode == 13) {
							$("#btnAddBlockTextNumber").trigger('click');
							return false;
						}
					});
					$('#txtAllowNumber').bind('keypress', function(e) {
						if (e.keyCode == 13) {
							$("#btnAddAllowedNumber").trigger('click');
							return false;
						}
					});
						
						
					//Bind 'add number' to list buttons
					$("#btnAddBlockTextNumber, #btnAddAllowedNumber").bind("click",function(){
						//add number to list and to hidden phone number list
						//var cell = detailsRow.data("cell");
						var newListItem = ($(this).attr("id") == "btnAddBlockTextNumber")?$("#txtBlockNumber"):$("#txtAllowNumber");
						var newListItemVal = newListItem.val();
						
						//remove errors
						$('#txtBlockNumber,#txtAllowNumber').removeClass('error').siblings("label").remove();
						
					    newListItemVal = newListItemVal.replace(/\s+/g,"");
						//return if input is empty
						if(newListItemVal.length == 0){
							newListItem.trigger("blur").val("").focus();
							return;
						}
						
						//validate this field
						var validatedInput = Sprint.fn.validateForm(frmPreferences, {field: preferencesFormFields[newListItem.attr("name")]});
						if (validatedInput == true) {
							//see if the limit has been reached
							//TODO: test when max is undefined or null;
							var max = frmPreferences.data("blockLimit") || $("#hidBlockLimit").val() || 50;
							var selectBox = ($(this).attr("id") == "btnAddBlockTextNumber")?$("#selBlockedList"):$("#selAllowedList");
							var itemListCount = selectBox.find("option").length;
							
							if(max <= itemListCount){
								return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
							} else {
								
								var newOption = $('<option value="'+newListItemVal+'">'+newListItemVal+'</option>');
								var itemList = frmPreferences.find("input.hidItemList");
								var itemListString = itemList.val();
								
								selectBox.append(newOption);
								
								if (itemListString == ""){
									itemList.val(newListItemVal)
								} else {
									itemList.val(itemListString + "," + newListItemVal);
								}
								
								newListItem.val("");
								//compareLists(cell);
							}
						}
						else {
							frmPreferences.showFormErrors({
								errorData: validatedInput,
								showInline: true,
								showSummary: false
							});
						}
					});
					
					//BIND remove items from list button
					$("#btnRemoveBlockTextNumber, #btnRemoveAllowedNumber").bind("click",function(){
						//remove number from list and hidden input list
						
						var selectBox = ($(this).attr("id") == "btnRemoveBlockTextNumber")?$("#selBlockedList"):$("#selAllowedList");
						var selectedListItems = selectBox.find("option:selected");
						
						if(selectedListItems.length > 0){
							//var cell = detailsRow.data("cell");
							var itemList = frmPreferences.find("input.hidItemList");
							var itemListString = itemList.val();
							
							selectedListItems.each(function(){
								//remove the values selected from the itemListString
								itemListString = itemListString.replace($(this).text(),"");
							}).remove();
							
							//clean up the itemListString by removing any extra commas at the start, middle and end of the string
							itemListString = itemListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
							
							itemList.val(itemListString);
							//compareLists(cell);
						}
					});
					
					//Bind upload Ptn's
					$("#btnUploadBlockTextNumber, #btnUploadAllowedNumber").bind("click",function(e){
						e.preventDefault();
						var selectBox = ($(this).attr("id") == "btnUploadBlockTextNumber")?$("#selBlockedList"):$("#selAllowedList");
						var accUploadFile = ($(this).attr("id") == "btnUploadBlockTextNumber")?'accBlockUploadFile':'accAllowUploadFile';
						$.ajaxFileUpload({
							url:$("input#hidUploadurl").val()+"&access=fileUpload&uploadFldName="+accUploadFile,
							secureuri:false,
							fileElementId:accUploadFile,
							async: false,
							dataType: "json",
							success: function (result, status){
								if(typeof(result.validated) != 'undefined'){
									$("input#"+accUploadFile+"").val("");
									if(result.validated == "true"){
										$("div.updateMessage").remove();
										selectBox.find('option').remove();
										var hidItemList = frmPreferences.find('input.hidItemList');
										var hidBlockListString = '';
										var uploadedPtns = result.accPtnList;
										var splitAccPtn = uploadedPtns.split(",");

										var newOption = '';
										for(var i=0;i<splitAccPtn.length;i++){
										
											newOption += '<option value="' + splitAccPtn[i] + '">' + splitAccPtn[i] + '</option>';
											if(hidBlockListString == "") {
												hidBlockListString += splitAccPtn[i];
												//frmPreferences.data("originalItemList","");
											} else {
												hidBlockListString += ","+splitAccPtn[i];
											}
										}						
										selectBox.append(newOption);
										hidItemList.val(hidBlockListString);
										var errorMsg  = result.errorMsg;
										if(errorMsg == "true"){
											showErrorMessage(result.errorMessage);
										}
									}else{
									selectBox.find('option').remove();
									showErrorMessage(result.errorMessage);
									}
								}
							},
							error: Sprint.fn.ajaxError
						});
					});
				}
				function bulkToggleControl(frmPreferences){
					$("#bulkListControl input.bulkRadio,#bulkListControl input.onetouchRadio").bind("click",function(e){
						var $this = $(this);
						frmPreferences.find("input.hidSelectedOption").val($this.val());
					});
				}
				
				//Bind for edit subscriber list option
				$("#btnBulkEdit").bind("click",function(e){
						
					if(!$(this).hasClass('disabled')){

						if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
							TeaLeaf.Client.tlAddEvent(e);
						}
						var bulkListURL = frmPreferences.attr("action");
						//Sprint.ASLoadModalContent(bulkListURL+"?"+frmPreferences.serialize()+"&subscriberIDs="+subscriberIDs);
						$.ajax({
							data: "ajax=true&hidPreferencesFormID=subscriberStatus&banNumber="+$("input#banNumber").val()+"&nodeID="+$("input#nodeID").val()+"&"+$("div.searchFilters select, #hidActiveCount").serialize(),
							type: "GET",
							url: bulkListURL,
							async: false,
							success: function(data) {
								$('#subscriberListModal').hide();
								var accntCntrlDiv = $("div.containerFourColumn #accntCntrolSubsList").length;
								
								//avoiding multiple div creation
								if(accntCntrlDiv == 0){
									$('#preferencesModal').find(".containerFourColumn").append(data);
									$('#accntCntrolSubsList').setupComponents().scrollTo();
								} else {
									$('#accntCntrolSubsList').show().scrollTo();
								}
								
								var accntrlVal = $('#accntCntrolSubsList').find("input#hidPreferencesFormID").attr('value');
								//setting new form ID to  'frmpreferences' for bulklist  creation
								var frmPreferences = $('#accntCntrolSubsList').find("form#bulkfrmPreferences");
								
								var chkedAllBan = $("#subscriberListModal  #subscriberListWrapper #chkAllBan input[type='checkbox']:checked").length;
								$("#accntCntrolSubsList #subscriberBulkListWrapper div.nameList").remove();
								var bulkListShow = ''								
								bulkListShow += '<div style="clear:both"><div class="nameList">';
								
								//retrieving the checked PTN's and subscriberids from subscriber status page, this logic is common for all account controls.
								if(chkedAllBan > 0){
									var dacNodeStatus = $("#dacNodeIdStatus").val();

									if(dacNodeStatus == "true"){
										var hidSelectAllonBan = $("#dacNodeId").val();
									}else{
										var hidSelectAllonBan = $("#hidBanNumber").val();
									}
									bulkListShow += '<span class="appSubs">All applicable subscribers on Account: '+hidSelectAllonBan+'</span>';
									$("input#hidBanSelectAll").val("true");
									$("#modifyBulkEdit").hide();
								} else {
									//Rendering the number list with the checked subscribers and setting mdn's through hidden variables.
									var chkboxcheckedList = $("#subscriberListModal  #subscriberListWrapper #subscriberStatusTable #subscriberStatusTableBody input[type='checkbox']:checked");
									var tempCheckedList = "";
									var hidCheckedListVal = $("#subscriberListModal #hidCheckedList").val();
									if(hidCheckedListVal == ""){

										chkboxcheckedList.each(function(i){
											if (tempCheckedList == "") {
												tempCheckedList += $(this).val();
											} else {
												tempCheckedList += "," + $(this).val();
											}
										});
										
										var tempCheckedListVal = tempCheckedList;
									} else {
												var tmpCheckedListArray = hidCheckedListVal.split(",");
										chkboxcheckedList.each(function(i){
											var isinList = $.inArray($(this).val(), tmpCheckedListArray);
											if(isinList == -1){
												tempCheckedList += $(this).val()+",";
											}
										});
										var tempCheckedListVal = tempCheckedList + hidCheckedListVal;
									}
			
									var checkedList = tempCheckedListVal.split(",");
									var subscriberIDs = "";
									var mdns ="";
									//checkedList.each(function(i){
								
									for(var i=0; i<checkedList.length; i++){
										if($("#frmPreferences").find("input[name='hidChkMdn_"+checkedList[i]+"']").length>0){
											var ptnID = $("input[name='hidChkMdn_"+checkedList[i]+"']").val();
										}else{
											var ptnID = $("input[value='"+checkedList[i]+"']").closest('tr').find('td.subscriberNumber').text();
										}
										ptnID = ptnID.replace(/\(|\)|\s|\.|\-/g, '');
										var cellId = checkedList[i];
										if (subscriberIDs == "") {
											subscriberIDs += cellId;
										} else {
											subscriberIDs += "," + cellId;
										}
										mdns  += '<input type="hidden" class="hidMdnNum" name="mdn_'+cellId+'" value="'+ptnID+'" id="mdn_'+cellId+'" />';
									}
									//});
									frmPreferences.find('input#hidSubscriberlist').val(subscriberIDs);
									
									$("input.hidMdnNum").remove();
									frmPreferences.find("#subscriberBulkListWrapper").before(mdns);
									
									//This is showing subsriber Id's with Name on individual bulk list account control page.
									if(checkedList.length > 4){
										var n = parseInt(checkedList.length -5);
										//checkedList.each(function(i){
										for(var j=0; j<=5; j++){
										
											//var Ptn = $(this).closest('tr').find('td.subscriberNumber').text();
											//var Name = $(this).closest('tr').find('td.subscriberName').text();
										   if($("#frmPreferences").find("input[name='hidChkMdn_"+checkedList[j]+"']").length>0){
											 var Ptn = $("input[name='hidChkMdn_"+checkedList[j]+"']").val();
											 var Name = $("input[name='hidChkName_"+checkedList[j]+"']").val();
										   }else{
												var Ptn = $("input[value='"+checkedList[j]+"']").closest('tr').find('td.subscriberNumber').text();
												var Name = $("input[value='"+checkedList[j]+"']").closest('tr').find('td.subscriberName').text();
											}
											
											if(j <= 4){
												bulkListShow += '<span class="subscriberName">'+Name+'</span><span class="subscriberNumber">'+Ptn+'</span>';
											} else {
												bulkListShow += '<span class="subscriberName">and ['+n+'] more...</span>';
											}
											
											if((j+1)%2 == 0){
												bulkListShow += '</div></div><div style="clear:both"><div class="nameList">';
											}
										}
										//});
									}else{
										//checkedList.each(function(i){
										for(var i=0; i<checkedList.length; i++){
											//var Ptn = $(this).closest('tr').find('td.subscriberNumber').text();
											//var Name = $(this).closest('tr').find('td.subscriberName').text();
											
											if($("#frmPreferences").find("input[name='hidChkMdn_"+checkedList[i]+"']").length>0){
												var Ptn = $("input[name='hidChkMdn_"+checkedList[i]+"']").val();
												var Name = $("input[name='hidChkName_"+checkedList[i]+"']").val();
										    }else{
												var Ptn = $("input[value='"+checkedList[i]+"']").closest('tr').find('td.subscriberNumber').text();
												var Name = $("input[value='"+checkedList[i]+"']").closest('tr').find('td.subscriberName').text();
											}
											bulkListShow += '<span class="subscriberName">'+Name+'</span><span class="subscriberNumber">'+Ptn+'</span>';
											if((i+1)%2 == 0){
												bulkListShow += '</div></div><div style="clear:both"><div class="nameList">';
											}
										}
										//});
									}
								
								}
								bulkListShow += '</div></div>';
								$("#accntCntrolSubsList #subscriberBulkListWrapper h5").after(bulkListShow);
													
								//functions for individual account control options
								if(accntrlVal == "bulkVoiceControl"){
									bulkVoiceSetupControl(frmPreferences);
								} else if(accntrlVal == "bulkTextControl"){
									bulkTextSetupControl(frmPreferences);
								} else {
									bulkToggleControl(frmPreferences);
								}
								
								//Bind for add/view/remove subscribers from the subscriberlist.
								$("#modifyBulkEdit").unbind("click").bind("click",function(e){
									e.preventDefault();
									$("div.updateMessage").remove();
									$('#subscriberListModal').show();
									$('#accntCntrolSubsList').hide();
									$("#searchKey").attr('value','');
									$("#searchType option[value='default']").attr('selected','selected');
									if($("#hid_accFilter").val() == "ONETOUCH"){
										$("#accSettings").attr('disabled','disabled');
									}
									$("a#btnBulkEdit span span span span").html("Back to bulk list");
									
									getAccountControlsTable($("div.searchFilters select, input#hidSubscriberlist, input#hidBanSelectAll, input#banNumber, input#nodeID").serialize());
									$("a#btnBulkEdit").removeClass("disabled");
									//settingSubscriberList();
									
									var hidSubCheckList = $("input#hid_subCheckedlist").val();
									var checkedListArray = hidSubCheckList.split(",");
									$("div#subscriberListWrapper #subscriberStatusTable tr.ac_subscriber td input[type='checkbox']").each(function(i){
										var thisVal = $.inArray($(this).val(), checkedListArray);
										if(thisVal > -1){
											$(this).attr('checked','checked');
										}
									});
									
									//var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').is(':checked');
									var isAllChkChecked = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').filter(function(i){
										if($(this).is(':checked')){
											return true;
										}
									});
									var chksPerPage = $("#subscriberStatusTableBody input[name='selectSubscriber']:visible").not(':disabled').length;
									if((isAllChkChecked.length == chksPerPage) && (chksPerPage > 0)){
										$("#subscriberStatusTableHeader input[type='checkbox']:visible").attr('checked','checked');
									}
									
								});
								//bind click event for save button
								$("#btnBulkListSave").bind("click", {form:$("#bulkfrmPreferences")},function(e){
									if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
										TeaLeaf.Client.tlAddEvent(e);
									}
									if(accntrlVal == "bulkTextControl" || accntrlVal == "bulkVoiceControl"){
										var hidSelectedOption = $("#hidSelectedOption").val();
										if(accntrlVal == "bulkVoiceControl"){
											
											
											if(hidSelectedOption == "BLOCKLIST"){
												var currentBlockList = $.trim($("#hidBlockList").val());
												if(currentBlockList == ""){
													alert("You must enter at least one number to be blocked");
													$("#radBlockSelected").scrollTo();
													$("#voiceBlockNumber").focus();
													return;
												}
											}
										} else {
											if(hidSelectedOption == "BLOCKLIST" || hidSelectedOption == "ALLOWLIST"){
												var currentBlockList = $.trim($("#hidItemList").val());
						
												if(currentBlockList == ""){
													alert("You must enter at least one number to be blocked");
													$("#radBlockSelected").scrollTo();
													$("#voiceBlockNumber").focus();
													return;
												}
											}
										}
										alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteBulkListMessage");
										//alertMsg = alertMsg.replace(/\[type\]/g, listText);
										if(confirm(alertMsg)){
											if(!$(this).hasClass("disabled")){
												processPreferencesForm(e);
											}
										}else{
											e.preventDefault();
										}
									}else{
										if(!$(this).hasClass("disabled")){
											processPreferencesForm(e);
										}
									}
								});
							}
						});	
					}
				});
				
				//get inital table when modal loads
				getAccountControlsTable(filterSettings);
				Sprint.frmpreferences.bulProcessChanges = $("#frmPreferences").serialize();
				

			}
			// ----------------------- //
			// END: subscriber status      //
			//                         //
			// Start: bulk block Texts //
			// ----------------------- //
			else if (frmPreferences.hasClass("bulkBlockTexts")){
				var deviceData;
				var detailsRow = $("#deviceDetailsRow");
				detailsRow.data("cell",detailsRow);
				detailsRow.data("isDrawerSetup",false);
				/*
				  The term "current" refers to what's currently saved or entered as the radio button option
				  The term "target" refers to the radio selection the user wants to make current
				 */
				
				preferencesFormFields = {
					//validations for search 
					searchKey: {
						name: "searchKey",
						type: "phoneNumber",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field) {
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							var fieldValue = field.val();
							var searchCriteria = $("#searchType option:selected").val();
							var validSearchKey = false;

							if(searchCriteria == "name"){
								if(fieldValue){
									var stringChk = fieldValue.split(' ');
									if(stringChk.length >= 2){
										this.invalidErrorMessage = 'Please validate the search key. Search key will have only one value.';
										return validSearchKey;
									}else{
										validSearchKey = Sprint.formFieldTypes.subscriberName.test(fieldValue);
										if (!validSearchKey) {
											this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.displayNameInvalid");
											return validSearchKey;
										}
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else if(searchCriteria == "ptn"){
								if(fieldValue){
									validSearchKey = /^\d{3,10}$/.test(fieldValue);
									if (!validSearchKey) {
										this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberSearchVal");
										return validSearchKey;
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else {
								
								if(fieldValue){
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.SearchCriteria");
									validSearchKey ==  false;
								}
							}
							return validSearchKey;
						}
					},
					txtBlockNumber: {
						name: "txtBlockNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					},
					txtAllowNumber: {
						name: "txtAllowNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					}
				};
				
				var itemListCustomValidation = function (field){
					//used for both block and allow lists
					
					//reset the invalid error message
					preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.deviceInvalid");
					
					var fieldValue = field.val();
					var fieldName = field.attr("name");
					var validDevice = false;
					
					if(fieldValue.length < 4){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.minimumLengthError");
					}
					else if (Sprint.formFieldTypes.enterpriseEmailAddress.test(fieldValue)) {
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneShortCode.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneNumber.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.domainName.test(fieldValue)){
						validDevice = true;
					}
					
					if(validDevice){
						//test for duplicate values in the list
						var cell = detailsRow.data("cell");
						var cellId = cell.attr("id");
						// No list means no dupes
						if (!cell.find("input.hidItemList").length) {
							return;
						}
						if(fieldName == "txtBlockNumber"){
							var itemListString = $("#hidBlockList_"+cellId+"").val();
						} else {
							var itemListString = $("#hidAllowList_"+cellId+"").val();
						}
						var blockedNums = itemListString.split(',');
						var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
						
						for (var i = 0; validDevice && i < blockedNums.length; i++) {
							if ($.trim(blockedNums[i]) !== '') {
								//check if comparison is against a phone number
								if(Sprint.formFieldTypes.phoneNumber.test(blockedNums[i])){
									validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								} else {
									validDevice = blockedNums[i] !== $.trim(fieldValue);
								}
							}
						}
						if (!validDevice) {
							preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
						}
					} 
					else if (fieldValue.length > 4 && fieldValue.match(/@/)){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid");
					}
					
					return validDevice;
				}
				/* omniture trigering for individual bulkblocktext business control */
				if($("#selfrmPrefSelectAccount").length > 0){
					var accountNum = 	$("select#selfrmPrefSelectAccount option:selected").text();
					// extract number from BAN
					var accountId = accountNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
					if(typeof(bulkTextsOmitureCall) != "undefined"){
						bulkTextsOmitureCall(accountId);
					}
				}
				Sprint.frmpreferences.browserChkFrmPref = 1;
				var setUpCells = function(result){
					var subscriberIDs = "";
					var visibleDevices = $("#manageUserRequests td.myDeviceColumn");
					
					visibleDevices.each(function(){
						var cell = $(this);
						var cellId = cell.attr("id");
						if(subscriberIDs == ""){
							subscriberIDs += cellId;
						} else {
							subscriberIDs += "," + cellId;
						}
					});
					
					//ajax call to get blocked status
					var cellDetailsLength = 0;
					//var cellDetails = getPageDetails(subscriberIDs);
					var cellDetails = result;
					if(cellDetails.devices != undefined){
						cellDetailsLength = cellDetails.devices.length;
					
						for (var i=0; i<cellDetailsLength; i++) {
							var cell = $(visibleDevices[i]);
							var cellId = cell.attr("id");
							var subscriberData = cellDetails.devices[i];
							var selectedOption = (subscriberData.currentSetting) ? subscriberData.currentSetting : "";
							var itemList = (subscriberData.itemList) ? subscriberData.itemList : "";
							
							//TODO: remove hotlined status and check for disabled status instead
							if(subscriberData.hotlined){
								cell.data("hotlined",true);
								cell.data("hotlinedToolTip",subscriberData.tooltipMessage);
							}
							
							// Check for server errors
							if(subscriberData.error && !cell.hasClass("error")){
								disableCell(cell,subscriberData.tooltipMessage,"error");
							}
								
							//append original selected option and device list (even if list is empty) to subscriber cell
							cell.append($(
								'<input type="hidden" name="hidOriginalOption_'+cellId+'" id="hidOriginalOption_'+cellId+'" class="hidOriginalOption" value="'+selectedOption+'" />' + 
								'<input type="hidden" name="hidSelectedOption_'+cellId+'" id="hidSelectedOption_'+cellId+'" class="hidSelectedOption" value="'+selectedOption+'" />' +
								'<input type="hidden" name="hidBlockList_'+cellId+'" id="hidBlockList_'+cellId+'" class="hidItemList" value="'+itemList+'" />' +
								'<input type="hidden" name="hidAllowList_'+cellId+'" id="hidAllowList_'+cellId+'" class="hidItemList" value="'+itemList+'" />' +
								'<input type="hidden" name="mdn_'+cellId+'" id="mdn_'+cellId+'" class="hidMdnNum" value="'+cell.find("div.deviceNumber").text().replace(/\(|\)|\s|\.|\-/g, '')+'" />'
							));
							
							//save the original item list, even if it's empty
							if(cell.data("originalItemList") == undefined){
								var sortedItemList = "";
								if (itemList != ""){
									var itemListArray = itemList.split(",");
									sortedItemList = itemListArray.sort().join(",");
								}
								cell.data("originalItemList",sortedItemList);
							}
							
							//save the blockLimit for this cell - caps the amount of numbers that can be added to the block/allow select lists
							if(cell.data("blockLimit") == undefined && subscriberData.blockLimit){
								cell.data("blockLimit",subscriberData.blockLimit);
							}
							
							originalFormData += "&" + cell.find("input:hidden").serialize();
							
							if(selectedOption != "" && selectedOption != "BlockNone"){
								//this device is restricted in some way, display restricted icon
								cell.addClass("restricted");
							}
							if(subscriberData.accountControlStatus == "ERROR"){
							   cell.append($('<input type="hidden" name="status_'+cellId+'" id="status_'+cellId+'" class="hidStatusError" value="ERROR" />'));
								//cell.addClass("statusError");
								//cell.removeClass("restricted");
							}
							if(subscriberData.accountControlStatus == "PENDING"){
								cell.addClass("statusPending");
								cell.removeClass("restricted");
							}
						}
					}
					if(!detailsRow.data("isDrawerSetup")){
						setUpDrawer($("div.textMessagingWrapper table:first"));	
					}
				}
				/* This hidden varibale for drill down the BAN's in account selector functionality  */
				var hidDrillDownMessage = $("#displayDrillDownMessage").val();
				
				$("#btnSubmitFilters, a#resetKeys").bind("click",function(event){
					
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}
					event.preventDefault();
					detailsRow.data("isDrawerSetup",false);
					//restore the detailsRow if needed
					if($("#deviceDetailsTable #deviceDetailsRow").length <= 0){
						detailsRowReset();
					}
					
					var thisTxt = $(this).attr("id");
					if(thisTxt == 'resetKeys'){
						$("ul.formErrors").remove();
						$("#searchKey").removeClass('error');
						$("div.searchKeys input").attr('value','');
						$("select#searchType option[value='default']").attr('selected','selected');
						var searchKeyValidForm = true;
						//function which contains ajax call to fetch data and render data cells
						if(hidDrillDownMessage == "true"){
							var drillDownMsg = $("input#drillDownMessage").val();
							$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
						}else{
							//function which contains ajax call to fetch data and render data cells
							var result = getBulkAccountDevices($("#subscriberListWrapper"));
							
						}
						var cells = $("#manageUserRequests td.myDeviceColumn");
						//getAccountControlsTable($("div.searchFilters select").serialize());
					} else {
						var searchCriteriaSelected = $("#searchType option:selected").val();
						var searchKeyVal = $("#searchKey").val();
						var validSearchKeyVal = Sprint.formFieldTypes.subscriberName.test(searchKeyVal);
						if((searchCriteriaSelected == 'default') &&  (searchKeyVal == '' || validSearchKeyVal ==  true)){
							var searchKeyValidForm = true;
						}else{
							var searchKeyValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
						}
						if(searchKeyValidForm == true){
							$("ul.formErrors").remove();
							$("#searchKey").removeClass('error');
							//function which contains ajax call to fetch data and render data cells
							if(hidDrillDownMessage == "true"){
								var drillDownMsg = $("input#drillDownMessage").val();
								$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
							}else{
								//function which contains ajax call to fetch data and render data cells
								var result = getBulkAccountDevices($("#subscriberListWrapper"));
								
							}
							var cells = $("#manageUserRequests td.myDeviceColumn");
						} else {
							$("ul.formErrors").remove();
							frmPreferences.showFormErrors({
								errorData: searchKeyValidForm,
								showInline: false,
								showSummary: true,
								summaryAnchor:frmPreferences.prev(),
								showSummaryPlain: true
							});
						}
					}
					if(searchKeyValidForm == true){
						if(cells.length > 0){
							if(cells.length <= 6){
								setUpCells(result);
							} else {
								$("#manageUserRequests").sortableTable({
									pagination: true,
									paginationBelow: false,
									rowsPerPage: 3,
									afterPageUpdate: function(){
										setUpCells(result);
									}
								});
						
								//pagination page number click event
								$("ul.pageList li a").bind("click", function(e){
									if(closeIntercept()){
										//if user selects "OK" then remove previous page settings
										var cells = $("#manageUserRequests td.myDeviceColumn");
										detailsRowReset();
										
										//remove changed data, which is being discarded, from originalFormData object
										var activeCells = $("#manageUserRequests td.active");
										if(activeCells.length > 0){
											activeCells.each(function(){
												//find hidden inputs for this cell, get names, match/remove from originalFormData
												
												var cell = $(this);
												var hidOriginalOption = cell.find("input.hidOriginalOption");
												var hidSelectedOption = cell.find("input.hidSelectedOption");
												var hidItemList = cell.find("input.hidItemList");
												
												var trimStart = originalFormData.lastIndexOf("&" + hidOriginalOption.attr("name"));
												var trimEnd = originalFormData.lastIndexOf(hidItemList.attr("name")) + hidItemList.serialize().length;
												var dataToTrim = originalFormData.substring(trimStart,trimEnd);
												
												originalFormData = originalFormData.replace(dataToTrim,"");
												
											})
										}
										
										//remove errorText and updateText
										frmPreferences.prev().find("ul.formErrors").remove();
										frmPreferences.prev().find("div.updateMessage").remove();
										
										//remove updated icons, error icons and ajax form data	
										cells.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
										
									} else {
										e.preventDefault();
										$(this).blur();
										return false;
									}
								});
							}
						}
					}
				});
				//function which contains ajax call to fetch data and render data cells
				$("#searchKey").before('<p>Enter part of a name or phone number (area code first) and select search type from the dropdown.</p>');
				if(hidDrillDownMessage == "true"){
					var drillDownMsg = $("input#drillDownMessage").val();
					$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
					Sprint.frmpreferences.bulProcessChanges = $("#frmPreferences").serialize();
				}else{
					//function which contains ajax call to fetch data and render data cells
					var result = getBulkAccountDevices($("#subscriberListWrapper"));
				}
				var cells = $("#manageUserRequests td.myDeviceColumn");
				
				// Set up drawer UI
				var setUpDrawer = function(table){
					
					table.deviceDrawer({
						beforeSlideUp: function(e){
							var cell = $(e.currentTarget);
							var cellId = cell.attr("id");
							if (!cell.hasClass("readonly")){
								var currentCell = detailsRow.data("cell");
								var currentItemListString = currentCell.find("input.hidItemList").val();
								
								if(cell.data("suspended")){
									disableCell(cell,cell.data("suspendedToolTip"),"readonly");
								} else if (cell.data("hotlined")){
									disableCell(cell,cell.data("hotlinedToolTip"),"readonly");
								} else if (cell.data("disabled")){
									disableCell(cell,cell.data("disabledToolTip"),"readonly");
								}
								
								
								if(!cell.data("ajaxSuccess")){
									//Fire ajax call to check if user has permissions to update device
									var subscriberData = getSubscriberDetails(cell);
									
									cell.data("ajaxSuccess",true);
									
									var hidCurrentUserRole = $("#hidCurrentUserRole").val();
									if((subscriberData.disabled) || hidCurrentUserRole == "sprintCareRep"){
										disableCell(cell,subscriberData.tooltipMessage, "readonly");
									}
									else if(subscriberData.error){
										disableCell(cell,"","reset");
										disableCell(cell,subscriberData.tooltipMessage,"error");
										cell.data("ajaxSuccess",false);
										return false;
									}
									if(subscriberData.blockList){
										cell.find("#hidBlockList_"+cellId+"").val(subscriberData.blockList);
										
										//save the original item list so it can be compared to detect changes
										if(cell.data("originalItemList") == undefined){
											var sortedItemList = "";
											if (subscriberData.blockList != ""){
												var itemListArray = subscriberData.blockList.split(",");
												sortedItemList = itemListArray.sort().join(",");
											}
											cell.data("originalItemList",sortedItemList);
										}
									} 
									if(subscriberData.allowList){
										cell.find("#hidAllowList_"+cellId+"").val(subscriberData.allowList);
										
										//save the original item list so it can be compared to detect changes
										if(cell.data("originalItemList") == undefined){
											var sortedItemList = "";
											if (subscriberData.allowList != ""){
												var itemListArray = subscriberData.allowList.split(",");
												sortedItemList = itemListArray.sort().join(",");
											}
											cell.data("originalItemList",sortedItemList);
										}
									}
									
								}
							}
						},
						afterSlideUp: function(e){
							var cell = $(e.currentTarget);
							var cellId = cell.attr("id");
							var blockSelectedBox = $("#blockSelectedWrapper");
							var allowSelectedBox = $("#allowSelectedWrapper");
							var currentSelectionVal = cell.find("input.hidSelectedOption").val();
							
							blockSelectedBox.hide();
							allowSelectedBox.hide();
							
							//clear the select lists
							$("#selBlockedList, #selAllowedList").empty();
							
							//clear value and errors from the input field
							$("#txtBlockNumber, #txtAllowNumber").removeClass("error").val("").siblings("label").remove();
								
							//if we have an item list then add the values to either the BlockSelected or AllowSelected <select> element
							//if Blocked or Allowed then check for item list.
							if(currentSelectionVal == "BlockSelected" || currentSelectionVal == "AllowSelected"){
								if(currentSelectionVal == "BlockSelected"){
									var itemListString = cell.find("#hidBlockList_"+cellId+"").val();
								}else{
									var itemListString = cell.find("#hidAllowList_"+cellId+"").val();
								}
								var optionList = "";
								
								if (itemListString && itemListString != ""){
									var itemListArray = itemListString.split(",").sort();
									var itemListLength = itemListArray.length;
									
									for (var i=0; i<itemListLength; i++) {
										optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
									}
								}
								
								if(currentSelectionVal == "BlockSelected"){
									$("#selBlockedList").html(optionList);
									blockSelectedBox.show();
								} else {
									$("#selAllowedList").html(optionList);
									allowSelectedBox.show();
								}
							}
							
							//radio buttons are checked in beforeSlideDown for IE6 and IE7 due to browser bug
							$("#rad"+currentSelectionVal).attr("checked","checked");
							detailsRow.data("lastClicked",currentSelectionVal);
							
							if(cell.hasClass("readonly")){
								detailsRow.find("input.radio, select").attr("disabled","disabled");
								detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber, #btnAddAllowedNumber, #btnRemoveAllowedNumber").addClass("disabled");
							} else {
								detailsRow.find("input.radio, select").removeAttr("disabled","disabled");
								detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber, #btnAddAllowedNumber, #btnRemoveAllowedNumber").removeClass("disabled");
							}
							
							if(cell.hasClass("readonly") && currentSelectionVal == "BlockNone"){
								//cell.scrollTo();
								return false;
							}
						},
					beforeSlideDown: function(e){
						if($.browser.msie && $.browser.version < 8){
							var cell = $(e.currentTarget);
							var currentRadioSelection = "#rad" + cell.find("input.hidSelectedOption").val();
						
							detailsRow.find(currentRadioSelection).attr('checked', 'checked');
						}
					},
					beforeToggle: function(e){
						var cell = $(e.currentTarget);
						if(cell.hasClass("readonly") && cell.find("input.hidSelectedOption").val() == "BlockNone"){
							return false;
						}
					}
					});
					detailsRow.data("isDrawerSetup",true);
				}
				
				// BIND radio button events
				$("#deviceDetailsWrapper input.radio").bind("click",function(e){
					var $this = $(this);
					var cell = detailsRow.data("cell");
					var cellId = cell.attr("id");
					var blockSelectedBox = $("#blockSelectedWrapper");
					var allowSelectedBox = $("#allowSelectedWrapper");
					var currentSelectionVal = cell.find("input.hidSelectedOption").val();
					
					if(detailsRow.data("lastClicked") == undefined){
						detailsRow.data("lastClicked",currentSelectionVal);
					}
					
					if ($this.val() != detailsRow.data("lastClicked")) {
					
						// if current selection is a list then trigger confirm alert that list will be lost
						if(currentSelectionVal == "BlockSelected" && $this.val() != "AllowSelected"){
							if(currentSelectionVal == "BlockSelected"){
								var itemList = cell.find("#hidBlockList_"+cellId+"");
							}else{
								var itemList = cell.find("#hidAllowList_"+cellId+"");
							}
							
							
							if(itemList.length > 0 && itemList.val() != ""){
								var radCurrentSelection = $("#rad"+currentSelectionVal);
								var listText = radCurrentSelection.attr("alt");
								
								alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteListMessage");
								alertMsg = alertMsg.replace(/\[type\]/g, listText);
								
								if(confirm(alertMsg)){
									//empty the hidden phone list
									itemList.val("");
									
									//empty the visible select box list
									if(currentSelectionVal == "BlockSelected"){
										$("#blockSelectedWrapper select").empty();
									} else {
										$("#allowSelectedWrapper select").empty();
									}
								} else {
									e.preventDefault();
									radCurrentSelection.attr('checked','checked');
									return;
								}
							}
						}
						//clear any errors that might have been left in the add number input
						$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
						
						updateCellStatus(cell,$this.val());
						cell.find("input.hidSelectedOption").val($this.val());
						
						// Show/Hide the select list
						if($this.attr("id") == "radAllowSelected"){
							var allowListString = $("#hidAllowList_"+cellId+"").val();
							if (allowListString && allowListString != ""){
								var optionList = "";
								var itemListArray = allowListString.split(",").sort();
								var itemListLength = itemListArray.length;
								
								for (var i=0; i<itemListLength; i++) {
									optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
								}
								$("#selAllowedList").html(optionList);
							}
							
							if(blockSelectedBox.is(":visible")){
								blockSelectedBox.slideUp().animate({left: 0}, 100,function(){
									allowSelectedBox.slideDown();
								});
							} else {
								allowSelectedBox.slideDown();
							}
						}
						else if($this.attr("id") == "radBlockSelected"){
							var blockListString = $("#hidBlockList_"+cellId+"").val();
							if (blockListString && blockListString != ""){
								var optionList = "";
								var itemListArray = blockListString.split(",").sort();
								var itemListLength = itemListArray.length;
								
								for (var i=0; i<itemListLength; i++) {
									optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
								}
								$("#selBlockedList").html(optionList);
							}
							

							if(allowSelectedBox.is(":visible")){
								allowSelectedBox.slideUp().animate({left: 0}, 100,function(){
									blockSelectedBox.slideDown();
								});
							} else {
								blockSelectedBox.slideDown();
							}
						}
						else {
							if (blockSelectedBox.is(":visible")) {
								blockSelectedBox.slideUp();
							}
							else if (allowSelectedBox.is(":visible")) {
								allowSelectedBox.slideUp();
							}
						}
					}
					detailsRow.data("lastClicked",$this.val());
				});
				
				// Trigger a click on the 'add number' buttons when the enter/return key is pressed
				$('#txtBlockNumber').bind('keypress', function(e) {
					if (e.keyCode == 13) {
						$("#btnAddBlockedNumber").trigger('click');
						return false;
					}
				});
				$('#txtAllowNumber').bind('keypress', function(e) {
					if (e.keyCode == 13) {
						$("#btnAddAllowedNumber").trigger('click');
						return false;
					}
				});
				
				//Bind 'add number' to list buttons
				$("#btnAddBlockedNumber, #btnAddAllowedNumber").bind("click",function(){
					//add number to list and to hidden phone number list
					var cell = detailsRow.data("cell");
					var cellId = cell.attr("id");
					var newListItem = ($(this).attr("id") == "btnAddBlockedNumber")?$("#txtBlockNumber"):$("#txtAllowNumber");
					var newListItemVal = newListItem.val();
					
					//remove errors
					$('#txtBlockNumber,#txtAllowNumber').removeClass('error').siblings("label").remove();
					newListItemVal = newListItemVal.replace(/\s+/g,"");
					//return if input is empty
					if(newListItemVal.length == 0){
						newListItem.trigger("blur").val("").focus();
						return;
					}
					
					//validate this field
					var validatedInput = Sprint.fn.validateForm(frmPreferences, {field: preferencesFormFields[newListItem.attr("name")]});
					
					if (validatedInput == true) {
						//see if the limit has been reached
						//TODO: test when max is undefined or null;
						var max = cell.data("blockLimit") || $("#hidBlockLimit").val() || 50;
						var selectBox = ($(this).attr("id") == "btnAddBlockedNumber")?$("#selBlockedList"):$("#selAllowedList");
						var itemListCount = selectBox.find("option").length;
						
						if(max <= itemListCount){
							return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
						} else {
							
							var newOption = $('<option value="'+newListItemVal+'">'+newListItemVal+'</option>');
							if($(this).attr("id") == "btnAddBlockedNumber"){
								var itemList = cell.find("#hidBlockList_"+cellId+"");
							}else{
								var itemList = cell.find("#hidAllowList_"+cellId+"");
							}
							var itemListString = itemList.val();
							
							selectBox.append(newOption);
							
							if (itemListString == ""){
								itemList.val(newListItemVal)
							} else {
								itemList.val(itemListString + "," + newListItemVal);
							}
							
							newListItem.val("");
							compareLists(cell);
						}
					}
					else {
						frmPreferences.showFormErrors({
							errorData: validatedInput,
							showInline: true,
							showSummary: false
						});
					}
				});
				
				//BIND remove items from list button
				$("#btnRemoveBlockedNumber, #btnRemoveAllowedNumber").bind("click",function(){
					//remove number from list and hidden input list
					
					var selectBox = ($(this).attr("id") == "btnRemoveBlockedNumber")?$("#selBlockedList"):$("#selAllowedList");
					var selectedListItems = selectBox.find("option:selected");
					
					if(selectedListItems.length > 0){
						var cell = detailsRow.data("cell");
						var cellId = cell.attr("id");
						if($(this).attr("id") == "btnRemoveBlockedNumber"){
							var itemList = cell.find("#hidBlockList_"+cellId+"");
						}else{
							var itemList = cell.find("#hidAllowList_"+cellId+"");
						}
						var itemListString = itemList.val();
						
						selectedListItems.each(function(){
							
							//remove the values selected from the itemListString
							itemListString = itemListString.replace($(this).text(),"");
						}).remove();
						
						//clean up the itemListString by removing any extra commas at the start, middle and end of the string
						itemListString = itemListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
						
						
						itemList.val(itemListString);
						compareLists(cell);
					}
				});
				
				if(cells.length > 0){
					if(cells.length <= 6){
						setUpCells(result);
					} else {
						/*$("#manageUserRequests").sortableTable({
							pagination: true,
							paginationBelow: false,
							rowsPerPage: 3,
							afterPageUpdate: function(){
								setUpCells(result);
							}
						});*/
						var last_subscriber_id = $("#manageUserRequests tr:last").closest('td').attr("id");
						$("#hid_lastsubid").val(last_subscriber_id);
						var currentAccount;
						if($("#selfrmPrefSelectAccount").length > 0){
							currentAccount = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($("#selfrmPrefSelectAccount option:selected").val()), "account").toLowerCase();
						} else {
							currentAccount = "deviceUser";
						}
						var filterSettings = "form=" + $("#frmPreferences").attr("class") + "&account=" + currentAccount +"&"+$("#hidPreferencesFormID").serialize()+"&"+$("div.searchKeys input,div.searchKeys select,div.searchFilters select").serialize() +"&banNumber="+$("input#hid_selectedBan").val()+"&nodeID="+$("input#hid_nodeID").val();
						if(cells.length > 49){
							$("#manageUserRequests").sortableTable({
								pagination: true,
								rowsPerPage: 3,
								paginationBelow: false,
								paginationNextPrev:true,
								ajaxPagination: true,
								afterPageUpdate: function(){
									setUpCells(result);
								},
								ajaxOptions: {
									data:filterSettings+"&last_subId="+$("#hid_lastsubid").val(),
									url:"/mysprint/pages/msb/myPreferences/modals/accountcontrols/getSubscriberListingJSON.jsp",
									dataType:'json',
									type:'POST'
								},
								ajaxJsonOPtions: function (target, tableData){
									detailsRow.data("isDrawerSetup",false);
									var result = Sprint.fn.getBulkAccount(target, tableData);
									var cells = $("#manageUserRequests td.myDeviceColumn");
									//detailsRow.data("cell",detailsRow).appendTo($("#deviceDetailsTable"));
									//setUpCells(result);
								},
								ajaxPageUpdate: function (currentTable){
									if($("#hid_isSubListComplete").length > 0){
										currentTable.data("ajaxPaginationComplete",true);
									}
									//var lastBlock = parseInt($("#hid_lastBlock").val());
									//$("#hid_lastBlock").val(lastBlock+1);
									var last_subscriber_ide = $("#manageUserRequests tr:last").closest('td').attr("id");
									$("#hid_lastsubid").val(last_subscriber_ide);
									this.ajaxOptions.data = filterSettings+"&last_subId="+$("#hid_lastsubid").val();
									this.ajaxOptions.url = "/mysprint/pages/msb/myPreferences/modals/accountcontrols/getSubscriberListingJSON.jsp";
									this.ajaxOptions.dataType = 'json';
									this.ajaxOptions.type = 'POST';
								}
							});
						}else{
							$("#manageUserRequests").sortableTable({
								pagination: true,
								paginationBelow: false,
								rowsPerPage: 3,
								afterPageUpdate: function(){
									setUpCells(result);
								}
							});
						}
						//pagination page number click event
						$("ul.pageList li a").bind("click", function(e){
							if(closeIntercept()){
								//if user selects "OK" then remove previous page settings
								var cells = $("#manageUserRequests td.myDeviceColumn");
								$("#deviceDetailsWrapper").slideUp().removeClass("readonly");
								detailsRow.data("cell").find("div.accountPhoneBottom").removeClass("readonly");
								detailsRow.data("cell",detailsRow).appendTo($("#deviceDetailsTable"));
								
								//remove changed data, which is being discarded, from originalFormData object
								var activeCells = $("#manageUserRequests td.active");
								if(activeCells.length > 0){
									activeCells.each(function(){
										//find hidden inputs for this cell, get names, match/remove from originalFormData
										
										var cell = $(this);
										var hidOriginalOption = cell.find("input.hidOriginalOption");
										var hidSelectedOption = cell.find("input.hidSelectedOption");
										var hidItemList = cell.find("input.hidItemList");
										
										var trimStart = originalFormData.lastIndexOf("&" + hidOriginalOption.attr("name"));
										var trimEnd = originalFormData.lastIndexOf(hidItemList.attr("name")) + hidItemList.serialize().length;
										var dataToTrim = originalFormData.substring(trimStart,trimEnd);
										
										originalFormData = originalFormData.replace(dataToTrim,"");
										
									})
								}
								
								//remove errorText and updateText
								frmPreferences.prev().find("ul.formErrors").remove();
								frmPreferences.prev().find("div.updateMessage").remove();
								
								//remove updated icons, error icons and ajax form data	
								cells.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
								
							} else {
								e.preventDefault();
								$(this).blur();
								return false;
							}
						});
					}
					Sprint.frmpreferences.bulProcessChanges = $("#frmPreferences").serialize();
				}
			}
			
			// ----------------------- //
			// END: bulk block Texts      //
			//                         //
			// Start: bulk block Voice //
			// ----------------------- //
			else if (frmPreferences.hasClass("bulkBlockVoice")){
				var deviceData;
				var detailsRow				= $("#deviceDetailsRow");
				var blockListBox			= detailsRow.find("#blockSelectedWrapper").hide();
				var archiveListBox			= detailsRow.find('#archivedNumbersWrapper').hide();
				var btnHideArchiveList		= detailsRow.find('#hideArchiveList');
				var btnAccessArchiveList	= detailsRow.find('#accessArchiveList');
				var btnAddBlockedNumber		= detailsRow.find('#btnAddBlockedNumber');
				var btnRemoveNumber			= detailsRow.find('#btnRemoveBlockedNumber');
				var btnMoveNumber			= archiveListBox.find("#btnMoveNumber");
				var addNumberInput			= detailsRow.find("#voiceBlockNumber");
				var blockListSelect			= blockListBox.find("#selBlockedList");
				var archiveListSelect		= archiveListBox.find("#selArchivedList");
				detailsRow.data("isDrawerSetup",false);
				// Create "add number" input validation object
				preferencesFormFields = {
					//validations for search 
					searchKey: {
						name: "searchKey",
						type: "phoneNumber",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field) {
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							var fieldValue = field.val();
							var searchCriteria = $("#searchType option:selected").val();
							var validSearchKey = false;

							if(searchCriteria == "name"){
								if(fieldValue){
									var stringChk = fieldValue.split(' ');
									if(stringChk.length >= 2){
										this.invalidErrorMessage = 'Please validate the search key. Search key will have only one value.';
										return validSearchKey;
									}else{
										validSearchKey = Sprint.formFieldTypes.subscriberName.test(fieldValue);
										if (!validSearchKey) {
											this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.displayNameInvalid");
											return validSearchKey;
										}
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else if(searchCriteria == "ptn"){
								if(fieldValue){
									validSearchKey = /^\d{3,10}$/.test(fieldValue);
									if (!validSearchKey) {
										this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberSearchVal");
										return validSearchKey;
									}
								}else{
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.searchKeyEmpty");
									validSearchKey ==  false;
								}
							} else {
								
								if(fieldValue){
									this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.SearchCriteria");
									validSearchKey ==  false;
								}
							}
							return validSearchKey;
						}
					},
					voiceBlockNumber: {
						name: "voiceBlockNumber",
						type: "phoneNumber",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){
							//reset the invalid error message
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							
							var fieldValue = field.val();
							var validDevice = Sprint.formFieldTypes.phoneNumber.test(fieldValue);

							if (validDevice) {
								//test for exceptions and duplicate values in the list. Exceptions are tested first.
								var cell = detailsRow.data("cell");
								var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
								
								//create exception list
								var unblockableList = $.trim(cell.find("input.hidExceptionList").val());
								if(unblockableList.length > 0){
									var unblockableNums = unblockableList.split(',');
									var unblockableNumsCount = unblockableNums.length - 1;
									
									for (var i = unblockableNumsCount; validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(unblockableNums[i]) !== '') {
											validDevice = $.trim(unblockableNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneNumberUnblockable");
										return validDevice;
									}
								}
								
								// No list means no dupes
								var blockedList = $.trim(cell.find("input.hidBlockList").val());
								if (blockedList.length <= 0) {
									return true;
								} else {
									var blockedNums = blockedList.split(',');
									var blockedNumsCount = blockedNums.length - 1;
									
									for (var i = blockedNumsCount;validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(blockedNums[i]) !== '') {
											validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
										return validDevice;
									}
								}
							}
							return validDevice;
						}
					}
				};
				/* omniture trigering for individual bulkblocktext business control */
				if($("#selfrmPrefSelectAccount").length > 0){
					var accountNum = 	$("select#selfrmPrefSelectAccount option:selected").text();
					// extract number from BAN
					var accountId = accountNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
					if(typeof(bulkVoiceOmitureCall) != "undefined"){
						bulkVoiceOmitureCall(accountId);
					}
				}
				Sprint.frmpreferences.browserChkFrmPref = 1;
				// Define the cell setup procedure
				var setUpCells = function(result){
					var subscriberIDs = "";
					var visibleDevices = $("#manageUserRequests td.myDeviceColumn");
					
					//collect the Id's of the visible device
					visibleDevices.each(function(){
						var cell = $(this);
						var cellId = cell.attr("id");
						if (subscriberIDs == "") {
							subscriberIDs += cellId;
						} else {
							subscriberIDs += "," + cellId;
						}
					});
					
					// Ajax call to get blocked status
					var cellDetailsLength = 0;
					//var cellDetails = getPageDetails(subscriberIDs);
					var cellDetails = result;
					if(cellDetails.devices){
						cellDetailsLength = cellDetails.devices.length;
						
						
						for (var i=0; i<cellDetailsLength; i++) {
							var cell = $(visibleDevices[i]);
							var cellId = cell.attr("id");
							var subscriberData = cellDetails.devices[i];
							var selectedOption = (subscriberData.currentSetting) ? subscriberData.currentSetting : "";
							
							//TODO: remove hotlined status and check for disabled status instead
							if(subscriberData.hotlined){
								cell.data("hotlined",true);
								cell.data("hotlinedToolTip",subscriberData.tooltipMessage);
							}
							
							/*if(subscriberData.WINPresent){
								cell.data("WINPresent",true);
							}*/
							
							// Check for server errors
							if(subscriberData.error && !cell.hasClass("error")){
								disableCell(cell,subscriberData.tooltipMessage,"error");
							}
														
							// Append original selected option and device list (even if list is empty) to subscriber cell
							// hidArchiveList is for which numbers will be stored as the archived list
							// hidBlockList is for which numbers will be blocked and appear in the editable select box
							// hidExceptionList is for numbers that cannot be added to the block list
							
							cell.append($(
								'<input type="hidden" name="hidOriginalOption_' + cellId + '" id="hidOriginalOption_' + cellId + '" class="hidOriginalOption" value="' + subscriberData.currentSetting + '" />' +
								'<input type="hidden" name="hidSelectedOption_' + cellId + '" id="hidSelectedOption_' + cellId + '" class="hidSelectedOption" value="' + subscriberData.currentSetting + '" />' +
								'<input type="hidden" name="hidArchiveList_' + cellId + '" id="hidArchiveList_' + cellId + '" class="hidArchiveList" value="" />' +
								'<input type="hidden" name="hidBlockList_' + cellId + '" id="hidBlockList_' + cellId + '" class="hidBlockList" value="" />' +
								'<input type="hidden" name="hidExceptionList_' + cellId + '" id="hidExceptionList_' + cellId + '" class="hidExceptionList" value="" />' +
								'<input type="hidden" name="mdn_' + cellId + '" id="mdn_' + cellId + '" class="hidMdnNum" value="'+ cell.find("div.deviceNumber").text().replace(/\(|\)|\s|\.|\-/g, '') +'" />'
							));
							
							originalFormData += "&" + cell.find("input:hidden").serialize();
							
							if(selectedOption != "" && selectedOption != "BlockNone"){
								//this device is restricted in some way, display restricted icon
								cell.addClass("restricted");
							}
							if(subscriberData.accountControlStatus == "ERROR"){
							   cell.append($('<input type="hidden" name="status_'+cellId+'" id="status_'+cellId+'" class="hidStatusError" value="ERROR" />'));
								//cell.addClass("statusError");
								//cell.removeClass("restricted");
							}
							if(subscriberData.accountControlStatus == "PENDING"){
								cell.addClass("statusPending");
								cell.removeClass("restricted");
							}
						}
						if(!detailsRow.data("isDrawerSetup")){
							setUpDrawer($("div.blockVoiceWrapper table:first"));
						}
					}
				}
				/* This hidden varibale for drill down the BAN's in account selector functionality  */
				var hidDrillDownMessage = $("#displayDrillDownMessage").val();
				
				//search function for business users
				// bind "Display" button to fetch data based on filter settings
				$("#btnSubmitFilters, a#resetKeys").bind("click",function(event){
					
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}
					event.preventDefault();
					detailsRow.data("isDrawerSetup",false);
					//restore the detailsRow if needed
					if($("#deviceDetailsTable #deviceDetailsRow").length <= 0){
						detailsRowReset();
					}
					
					var thisTxt = $(this).attr("id");
					if(thisTxt == 'resetKeys'){
						$("ul.formErrors").remove();
						$("#searchKey").removeClass('error');
						$("div.searchKeys input").attr('value','');
						$("select#searchType option[value='default']").attr('selected','selected');
						var searchKeyValidForm = true;
						//function which contains ajax call to fetch data and render data cells
						if(hidDrillDownMessage == "true"){
							var drillDownMsg = $("input#drillDownMessage").val();
							$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
						}else{
							//function which contains ajax call to fetch data and render data cells
							var result = getBulkAccountDevices($("#subscriberListWrapper"));
							
						}
						var cells = $("#manageUserRequests td.myDeviceColumn");
						//getAccountControlsTable($("div.searchFilters select").serialize());
					} else {
						var searchCriteriaSelected = $("#searchType option:selected").val();
						var searchKeyVal = $("#searchKey").val();
						var validSearchKeyVal = Sprint.formFieldTypes.subscriberName.test(searchKeyVal);
						if((searchCriteriaSelected == 'default') &&  (searchKeyVal == '' || validSearchKeyVal ==  true)){
							var searchKeyValidForm = true;
						}else{
							var searchKeyValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
						}
						if(searchKeyValidForm == true){
							$("ul.formErrors").remove();
							$("#searchKey").removeClass('error');
							//function which contains ajax call to fetch data and render data cells
							if(hidDrillDownMessage == "true"){
								var drillDownMsg = $("input#drillDownMessage").val();
								$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
							}else{
								//function which contains ajax call to fetch data and render data cells
								var result = getBulkAccountDevices($("#subscriberListWrapper"));
								
							}
							var cells = $("#manageUserRequests td.myDeviceColumn");
						} else {
							$("ul.formErrors").remove();
							frmPreferences.showFormErrors({
								errorData: searchKeyValidForm,
								showInline: false,
								showSummary: true,
								summaryAnchor:frmPreferences.prev(),
								showSummaryPlain: true
							});
						}
					}
					if(searchKeyValidForm == true){
						if(cells.length > 0){
							if(cells.length <= 6){
								setUpCells(result);
							} else {
								// Set up pagination
								$("#manageUserRequests").sortableTable({
									pagination: true,
									paginationBelow: false,
									rowsPerPage: 3,
									afterPageUpdate: function(){
										setUpCells(result);
									}
								});

								// Pagination page number click event
								$("ul.pageList li a").bind("click", function(e){
									if(closeIntercept()){
										// If user selects "OK" then remove previous page settings
										var cell = $("#manageUserRequests td.myDeviceColumn");
										detailsRowReset();
										
										// Remove errorText and updateText
										frmPreferences.prev().find("ul.formErrors").remove();
										frmPreferences.prev().find("div.updateMessage").remove();
										
										// Remove updated icons, error icons and ajax form data	
										cell.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
										
									} else {
										e.preventDefault();
										$(this).blur();
										return false;
									}
								});
							}
						}
					}
				});
			
				//function which contains ajax call to fetch data and render data cells
				$("#searchKey").before('<p>Enter part of a name or phone number (area code first) and select search type from the dropdown.</p>');
				if(hidDrillDownMessage == "true"){
					var drillDownMsg = $("input#drillDownMessage").val();
					$("#subscriberListWrapper").html('<p>'+drillDownMsg+'</p>');
					Sprint.frmpreferences.bulProcessChanges = $("#frmPreferences").serialize();
				}else{
					//function which contains ajax call to fetch data and render data cells
					var result = getBulkAccountDevices($("#subscriberListWrapper"));
					
				}
				var cells = $("#manageUserRequests td.myDeviceColumn");
				
				// Set up drawer UI
				var setUpDrawer = function(table){
					table.deviceDrawer({
						beforeSlideUp: function(e) {
							var cell = $(e.currentTarget);
													
							if (!cell.hasClass("readonly")){
								var currentCell = detailsRow.data("cell");
								var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
								var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
								
								if(currentRadioSelection == "BlockSelected" && originalRadioSelection != "BlockSelected"){
									var currentBlockList = $.trim(currentCell.find("input.hidBlockList").val());
									if(currentBlockList == ""){
										alert("You must enter at least one number to be blocked");
										$("#radBlockSelected").scrollTo();
										$("#voiceBlockNumber").focus();
										return false;
									}
								}
								
								if(cell.data("suspended")){
									disableCell(cell, cell.data("suspendedToolTip"),"readonly");
								} else if (cell.data("hotlined")){
									disableCell(cell,cell.data("hotlinedToolTip"),"readonly");
								} else if (cell.data("disabled")){
									disableCell(cell,cell.data("disabledToolTip"),"readonly");
								}
								
								// Make ajax call to get the subscriber's lists
								if(!cell.data('ajaxSuccess')) {
									var itemLists = getSubscriberDetails(cell);
									cell.data('ajaxSuccess', true);
									var hidCurrentUserRole = $("#hidCurrentUserRole").val();
									if((itemLists.disabled) || hidCurrentUserRole == "sprintCareRep"){
										disableCell(cell, itemLists.tooltipMessage,"readonly");
									} else if(itemLists.error){
										disableCell(cell,"","reset");
										disableCell(cell,itemLists.tooltipMessage,"error");
										cell.data('ajaxSuccess', false);
										return false;
									}
									
									if(itemLists.blockListActive == false){
										cell.data("blockListActive", false);
									} else {
										cell.data("blockListActive", true);
									}

									if(itemLists.isWinServicePresent){
										cell.data("WINPresent",true);
									}
									if(itemLists.archiveList){
										cell.find("input.hidArchiveList").val(itemLists.archiveList);
										
										//store the original archive list so it can be reverted if data is dumped
										if(cell.data("originalArchiveList") == undefined){
											var sortedItemList = "";
											if (itemLists.archiveList != ""){
												var itemListArray = itemLists.archiveList.split(",");
												sortedItemList = itemListArray.sort().join(",");
											}
											cell.data("originalArchiveList",sortedItemList);
										}
										// remove items from archive list that are already present in the block list
										// using reverse loop so as items are removed the indexes remain the same for the duration of the loop
										var blockList = cell.find("input.hidBlockList").val();
										var archiveListArray = itemLists.archiveList.split(",");
										if(blockList.length > 0 && archiveListArray.length < 100){
											var blockListArray = blockList.split(",");
											
											for (var i = blockListArray.length - 1; i >= 0; i--) {
												for (var j = archiveListArray.length - 1; j >= 0; j--) {
													if(blockListArray[i] == archiveListArray[j]){
														archiveListArray.splice(j,1);
														break;
													}
												}
											}
											cell.find("input.hidArchiveList").val(archiveListArray.join(","));
										}
											
									}
									if(itemLists.blockList){
										cell.find("input.hidBlockList").val(itemLists.blockList);
										
										//save the original item list so it can be compared to detect changes
										if(cell.data("originalItemList") == undefined){
											var sortedItemList = "";
											if (itemLists.blockList != ""){
												var itemListArray = itemLists.blockList.split(",");
												sortedItemList = itemListArray.sort().join(",");
											}
											cell.data("originalItemList",sortedItemList);
										}
									}
									if(itemLists.exceptionList){
										cell.find("input.hidExceptionList").val(itemLists.exceptionList);
									}
									
									//save the blockLimit for this cell - caps the amount of numbers that can be added to the block/allow select lists
									if(cell.data("blockLimit") == undefined && itemLists.blockLimit){
										cell.data("blockLimit",itemLists.blockLimit);
									}
								}
							}
						},
						afterSlideUp: function(e){
							
							//TODO: clear unactivated list warning
							//TODO: clear errors, clear errors on save button click as well.
							
							var cell = $(e.currentTarget);
							var currentRadioSelection = cell.find("input.hidSelectedOption").val();
							
							//hide readonly info message
							detailsRow.find("#readonlyMsg .formSuggestions").hide();
							
							if(cell.data("WINPresent")){
								//$("#detailsField").hide();
								//$("#detailsMessage").show();
								detailsRow.find("#radBlockSelected").attr("disabled","disabled");
								detailsRow.find("#blockSelectedWrapper").css("display","none");
								$("#detailsMessage").show();
							} else {
								//$("#detailsField").show();
								$("#detailsMessage").hide();
								// Make current selection and update display
								//radio buttons are checked in beforeSlideDown for IE6 and IE7 due to browser bug
								detailsRow.find('#rad' + currentRadioSelection).attr('checked', 'checked');
								detailsRow.data("lastClicked",currentRadioSelection);
								
								//clear value and errors from the input field
								$("#voiceBlockNumber").removeClass("error").val("").siblings("label").remove();
								
								// Setup the block number display
								if(currentRadioSelection === 'BlockSelected') {
									
									if(cell.data("blockListActive") == false){
										detailsRow.find("#blockSelectedWrapper ul.formSuggestions").show();
									} else {
										detailsRow.find("#blockSelectedWrapper ul.formSuggestions").hide();
									}
									
									//TODO: remove this since loading occurs when drawer is closed. Ajax can be moved to afterSlideDown callback
									// Set the loading message before the ajax call
									//var loadingMessage = $('<p id="loadingListMessage">Loading...</p>');
									//detailsRow.find('#radBlockSelected').parents('.checks').after(loadingMessage);
									
									// Populate the blocked list
									var hidBlockListVal = cell.find("input.hidBlockList").val();
									if(hidBlockListVal.length > 0){
										var optionList		= "";
										var blockList		= hidBlockListVal.split(',').sort();
										var blockListLength = blockList.length;
										
										for (var i=0; i<blockListLength; i++) {
											optionList += '<option value="' + blockList[i] + '">' + blockList[i] + '</option>\n';
										}
									
										blockListSelect.html(optionList);
									} else {
										blockListSelect.empty();
									}
									
									// Populate the archived list
									var hidArchiveListVal = cell.find("input.hidArchiveList").val();
									if(hidArchiveListVal.length > 0){
										var optionList	= "";
										var archiveList = hidArchiveListVal.split(',');
										var archiveListLength = archiveList.length;
										
										for (var i=0; i<archiveListLength; i++) {
											optionList += '<option value="' + archiveList[i] + '">' + archiveList[i] + '</option>\n';
										}
									
										archiveListSelect.html(optionList);
									} else {
										archiveListSelect.empty();
									}
									
									// Remove the loading message and show the blocked list
									//loadingMessage.remove();
									
									blockListBox.show();
								} else if (currentRadioSelection === 'BlockAllInbound' || currentRadioSelection === 'BlockAll'){
									detailsRow.find("#readonlyMsg .formSuggestions").show();
									
									//replace [SOC type name] with proper text
									
									var warningMsg = detailsRow.find('#readonlyMsg ul li');
									var warningMsgText = warningMsg.text();
									var SOCtype = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal['"+currentRadioSelection+"']");
									
									warningMsg.text(warningMsgText.replace(/\$[a-zA-Z0-9_\.\-\s]*\$/g, SOCtype));
									
									blockListBox.hide();
								} else {
									blockListBox.hide();
								}
								archiveListBox.hide();
								$("#btnRemoveBlockedNumber").show();
							
								//update the originalFormData string with our fresh server data and sort it
								originalFormData += "&" + cell.find("input:hidden").serialize();
								originalFormData = sortQueryString(originalFormData);
								
								if(cell.hasClass("readonly")){
									detailsRow.find("input.radio, select, input#voiceBlockNumber").attr("disabled","disabled");
									detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber").addClass("disabled");
								} else {
									detailsRow.find("input.radio:not(#radBlockAllInbound,#radBlockAll), select, input#voiceBlockNumber").removeAttr("disabled","disabled");
									detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber").removeClass("disabled");
								}
							}
							if(cell.hasClass("readonly") && currentRadioSelection == "BlockNone"){
								//cell.scrollTo();
								return false;
							}
						},
						beforeSlideDown: function(e){
							if($.browser.msie && $.browser.version < 8){
								var cell = $(e.currentTarget);
								var currentRadioSelection = "#rad" + cell.find("input.hidSelectedOption").val();
							
								detailsRow.find(currentRadioSelection).attr('checked', 'checked');
							}
						},
						beforeToggle: function(e){
							var detailsRow = $("#deviceDetailsRow");
							var currentCell = detailsRow.data("cell");
							var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
							var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
							
							if(currentCell.hasClass("readonly") && currentCell.find("input.hidSelectedOption").val() == "BlockNone"){
								return false;
							}
							
							if(currentRadioSelection == "BlockSelected"){
								var currentBlockList = $.trim(currentCell.find("input.hidBlockList").val());
								if(currentBlockList == ""){
									alert("You must enter at least one number to be blocked");
									$("#radBlockSelected").scrollTo();
									$("#voiceBlockNumber").focus();
									return false;
								}
							}
						}
						
					});
					detailsRow.data("isDrawerSetup",true);
				}
				
				// Click events for show/hide of archived list
				btnAccessArchiveList.toggle( 
					function() {
						var cell = detailsRow.data("cell");
						btnRemoveNumber.fadeOut();
						archiveListBox.fadeIn();
						return false;
					},
					function(){
						btnRemoveNumber.fadeIn();
						archiveListBox.fadeOut();
						return false;
					}
				);
				btnHideArchiveList.bind('click', function() {
					btnRemoveNumber.fadeIn();
					btnAccessArchiveList.trigger("click");
					return false;
				});
							
				// Bind radio button events				
				$("#deviceDetailsWrapper input.radio").bind("click", function(e) {
					var radio = $(this);
					var cell = detailsRow.data('cell');
					var currentVoiceOption = cell.find("input.hidSelectedOption").val();
					
					if(detailsRow.data("lastClicked") == undefined){
						detailsRow.data("lastClicked",currentVoiceOption);
					}
					
					if (radio.val() != detailsRow.data("lastClicked")) {
						
						// If current selection is a list then trigger confirm alert that list will be lost
						if (currentVoiceOption === 'BlockSelected') {
							var blockList = cell.find("input.hidBlockList");
							
							if (blockList.length > 0 && blockList.val() != "") {
								var radVoicetSelection = $("#rad"+currentVoiceOption);
								var listText = $('#radBlockSelected').attr("alt");
								
								alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteVoiceListMessage");
								alertMsg = alertMsg.replace(/\[type\]/g, listText);
								
								if (confirm(alertMsg)) {
									// Empty the hidden phone list
									blockList.val("");
									
									//empty the visible select box list
									blockListSelect.empty();
								}
								else {
									e.preventDefault();
									radVoicetSelection.attr('checked','checked');
									return;
								}
							}
						}
						//clear any errors that might have been left in the add number input
						$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
						
						updateCellStatus(cell, radio.val());
						cell.find('input.hidSelectedOption').val(radio.val());
						
						// Show/Hide the select list
						if (radio.attr("id") == "radBlockSelected") {
							
							// Populate the blocked list
							var hidBlockListVal = cell.find("input.hidBlockList").val();
							if(hidBlockListVal.length > 0){
								var optionList		= "";
								var blockList		= hidBlockListVal.split(',').sort();
								var blockListLength = blockList.length;
								
								for (var i=0; i<blockListLength; i++) {
									optionList += '<option value="' + blockList[i] + '">' + blockList[i] + '</option>\n';
								}
							
								blockListSelect.html(optionList);
							} else {
								blockListSelect.empty();
							}
							
							if(cell.data("blockListActive") == false){
								detailsRow.find("#blockSelectedWrapper ul.formSuggestions").show();
							} else {
								detailsRow.find("#blockSelectedWrapper ul.formSuggestions").hide();
							}
							
							// Populate the archived list
							var hidArchiveListVal = cell.find("input.hidArchiveList").val();
							if (hidArchiveListVal.length > 0) {
								var optionList = "";
								var archiveList = hidArchiveListVal.split(',');
								var archiveListLength = archiveList.length;
								
								for (var i = 0; i < archiveListLength; i++) {
									optionList += '<option value="' + archiveList[i] + '">' + archiveList[i] + '</option>\n';
								}
								
								archiveListSelect.html(optionList);
							}
							else {
								archiveListSelect.empty();
							}
							archiveListBox.hide();
							
							blockListBox.slideDown();
							//The below JS is for showing alert message when block list is there at the time  selecting 'Block list' option from other options. 
							var currentCell = detailsRow.data("cell");
							var blockListEmpty = currentCell.data("originalItemList")
							if(blockListEmpty != undefined){
								alert("We are still in the process of completing your last transaction, come back after 15 minutes");
								var lastClicked = detailsRow.data("lastClicked");
								$("#rad"+lastClicked).attr('checked','checked');
								cell.find('input.hidSelectedOption').val(lastClicked);
								blockListBox.slideUp();
								var hidOriginalSel = cell.find("input.hidOriginalOption").val();
								
								if(hidOriginalSel == lastClicked){
									var subDeselId = cell.attr('id');
									$("#manageUserRequests td#"+subDeselId).removeClass('active');
								}
							}
						}
						else {
							if (blockListBox.is(":visible")) {
								blockListBox.slideUp();
								archiveListBox.hide();
							}
						}
						detailsRow.data("lastClicked", radio.val());
					}
				});

				// Trigger a click on the 'add number' button when the enter/return key is pressed
				addNumberInput.bind('keypress', function(e) {
					if (e.keyCode == 13) {
						btnAddBlockedNumber.trigger('click');
						return false;
					}
				});
				
				// Bind 'add number' to list button
				btnAddBlockedNumber.bind("click", function() {
					var cell = detailsRow.data("cell");
					
					//remove errors
					addNumberInput.removeClass('error').siblings("label").remove();
					var newAddNumberInput = addNumberInput.val();
					newAddNumberInput = newAddNumberInput.replace(/\s+/g,"");
					//return if input is empty
					if (newAddNumberInput.length == 0) {
						addNumberInput.trigger("blur").val("").focus();
						return;
					}
					
					//validate this field
					var blockVoiceValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
					
					if (blockVoiceValidForm == true) {

						
						//see if the limit has been reached
						var max = cell.data("blockLimit") || $("#hidBlockLimit").val() || 50;
						var itemListCount = blockListSelect.find("option").length;
						
						if(max <= itemListCount){
							return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
						} else {
							var newOption			= $('<option value="' + addNumberInput.val() + '">' + addNumberInput.val() + '</option>');
							var hidBlockList		= cell.find('input.hidBlockList');
							var hidBlockListString	= hidBlockList.val();
													
							blockListSelect.append(newOption);
							
							if(hidBlockListString == "") {
								hidBlockList.val(addNumberInput.val());
								//cell.data("originalItemList","");
							} else {
								hidBlockList.val(hidBlockListString + "," + addNumberInput.val());
							}
							
							addNumberInput.val("");
							compareLists(cell);
						}
					}
					else {
						frmPreferences.showFormErrors({
							errorData: blockVoiceValidForm,
							showInline: true,
							showSummary: false
						});
					}
				});

				// Bind remove items from list button
				btnRemoveNumber.bind("click", function(e) {
					//remove number from list and hidden input list
					var selectedListItems = blockListSelect.find("option:selected");
					
					if(selectedListItems.length > 0){
						var cell = detailsRow.data("cell");
						var hidArchiveList = cell.find('input.hidArchiveList');
						var hidBlockList = cell.find('input.hidBlockList');
						var hidArchiveListString = hidArchiveList.val();
						var hidBlockListString = hidBlockList.val();
						
						// Remove the number from the hidden block list input
						selectedListItems.each(function(){
							var $this = $(this);
							var $thisVal = $this.val();
							
							// Remove the number from the hidden block list input
							hidBlockListString = hidBlockListString.replace($thisVal,"");
							
							if(hidArchiveListString == "") {
								hidArchiveList.val($thisVal);
								
								// Add the numbers to the archive list
								archiveListSelect.append($this);
							} else {
								//check for duplicates before adding
								var validDevice = true;
								var archiveList = hidArchiveListString.split(',');
								var archiveListCount = archiveList.length - 1;
								var simplifiedFieldValue = $.trim($thisVal).replace(/\(|\)|\s|\.|\-/g, '');
								
								for (var i = archiveListCount;validDevice && i >= 0; i--) {
									validDevice = $.trim(archiveList[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								}
								/* Ominiture for removing Number in  Block voice added by Venkat */
								if(validDevice){
									
									hidArchiveList.val(hidArchiveListString + "," + $thisVal);
									
									// Add the numbers to the archive list
									archiveListSelect.append($this);
								} else {
									// remove the number from the block list since it's already in the archive list
									$this.remove();
								}
							}
						});
						
						//clean up the itemListString by removing any extra commas at the start, middle and end of the string
						hidBlockListString = hidBlockListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
						hidBlockList.val(hidBlockListString);
						
						//compare lists to see if this device should be flagged as updated
						compareLists(cell);
					}
					return false;
				});

				// Bind move items from archive to block list button
				btnMoveNumber.bind("click", function(e) {
					e.preventDefault();
					var cell = detailsRow.data("cell");
					var selectedListItems = archiveListSelect.find("option:selected");
					
					if(selectedListItems.length > 0){
						var hidArchiveList = cell.find('input.hidArchiveList');
						var hidBlockList = cell.find('input.hidBlockList');
						var hidArchiveListString = hidArchiveList.val();
						var hidBlockListString = hidBlockList.val();
						var exceptionAlertFlag = false;
						
						// Update the hidden list inputs
						selectedListItems.each(function(i) {
							var $this = $(this);
							var $thisVal = $this.val();
							
							//check if this number is on the exception list
							if(preferencesFormFields.voiceBlockNumber.customValidationRule($this) == false){
								exceptionAlertFlag = true;
								$this.attr("disabled","disabled").removeAttr("selected");
								return;
							}
							
							// Remove the number from the hidden archive list input
							hidArchiveListString = hidArchiveListString.replace($thisVal,"");
							
							// Add to block list
							if(hidBlockListString === '') {
								hidBlockList.val($thisVal);
								hidBlockListString = $thisVal;
								// Add the numbers to the block list
								blockListSelect.append($this);
							} else {
								//check for duplicates before adding
								var validDevice = true;
								var blockList = hidBlockListString.split(',');
								var blockListCount = blockList.length - 1;
								var simplifiedFieldValue = $.trim($thisVal).replace(/\(|\)|\s|\.|\-/g, '');
								//save the index at which the duplicate value was found
								var i;
								
								for (i = blockListCount;validDevice && i >= 0; i--) {
									validDevice = $.trim(blockList[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								}
								if(validDevice){
									//see if the limit has been reached
									var max = cell.data("blockLimit");
									var itemListCount = blockListSelect.find("option").length;
							
									if(max <= itemListCount){
										alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
										return false;
									} else {
										hidBlockList.val(hidBlockListString + "," + $thisVal);
										hidBlockListString = hidBlockListString + "," + $thisVal;
										// Add the numbers to the block list
										blockListSelect.append($this);
									}
								} else {
									// remove the number from the archive list since it's already in the block list
									$this.remove();
									//TODO: verify that hidBlockList is always in the same order as the <option>'s in selBlockedList
									$("#selBlockedList option:eq("+i+")").attr("selected","selected");
								}
							}
						});
						
						if(exceptionAlertFlag){
							alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneNumbersUnblockable"));
						}
						
						//clean up the hidArchiveListString by removing any extra commas at the start, middle and end of the string					
						hidArchiveListString = hidArchiveListString.replace(/,+/g,",").replace(/^,/,"").replace(/,+$/,"");
						hidArchiveList.val(hidArchiveListString);
						
						//compare lists to see if this device should be flagged as updated
						compareLists(cell);
					}
					
					return false;
				});
				
				if(cells.length > 0){
					if(cells.length <= 6){
						setUpCells(result);
					} else {
						// Set up pagination
						/*$("#manageUserRequests").sortableTable({
							pagination: true,
							paginationBelow: false,
							rowsPerPage: 3,
							afterPageUpdate: function(){
								setUpCells(result);
							}
						});*/
						var last_subscriber_id = $("#manageUserRequests tr:last").closest('td').attr("id");
						$("#hid_lastsubid").val(last_subscriber_id);
						var currentAccount;
						if($("#selfrmPrefSelectAccount").length > 0){
							currentAccount = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($("#selfrmPrefSelectAccount option:selected").val()), "account").toLowerCase();
						} else {
							currentAccount = "deviceUser";
						}
						var filterSettings = "form=" + $("#frmPreferences").attr("class") + "&account=" + currentAccount +"&"+$("#hidPreferencesFormID").serialize()+"&"+$("div.searchKeys input,div.searchKeys select,div.searchFilters select").serialize() +"&banNumber="+$("input#hid_selectedBan").val()+"&nodeID="+$("input#hid_nodeID").val();
						if(cells.length > 49){
							$("#manageUserRequests").sortableTable({
								pagination: true,
								rowsPerPage: 3,
								paginationBelow: false,
								paginationNextPrev:true,
								ajaxPagination: true,
								afterPageUpdate: function(){
									setUpCells(result);
								},
								ajaxOptions: {
									data:filterSettings+"&last_subId="+$("#hid_lastsubid").val(),
									url:"/mysprint/pages/msb/myPreferences/modals/accountcontrols/getSubscriberListingJSON.jsp",
									dataType:'json',
									type:'POST'
								},
								ajaxJsonOPtions: function (target, tableData){
									detailsRow.data("isDrawerSetup",false);
									var result = Sprint.fn.getBulkAccount(target, tableData);
									var cells = $("#manageUserRequests td.myDeviceColumn");
									//detailsRow.data("cell",detailsRow).appendTo($("#deviceDetailsTable"));
									//setUpCells(result);
								},
								ajaxPageUpdate: function (currentTable){
									if($("#hid_isSubListComplete").length > 0){
										currentTable.data("ajaxPaginationComplete",true);
									}
									//var lastBlock = parseInt($("#hid_lastBlock").val());
									//$("#hid_lastBlock").val(lastBlock+1);
									var last_subscriber_ide = $("#manageUserRequests tr:last").closest('td').attr("id");
									$("#hid_lastsubid").val(last_subscriber_ide);
									this.ajaxOptions.data = filterSettings+"&last_subId="+$("#hid_lastsubid").val();
									this.ajaxOptions.url = "/mysprint/pages/msb/myPreferences/modals/accountcontrols/getSubscriberListingJSON.jsp";
									this.ajaxOptions.dataType = 'json';
									this.ajaxOptions.type = 'POST';
								}
							});
						}else{
							$("#manageUserRequests").sortableTable({
								pagination: true,
								paginationBelow: false,
								rowsPerPage: 3,
								afterPageUpdate: function(){
									setUpCells(result);
								}
							});
						}
						// Pagination page number click event
						$("ul.pageList li a").bind("click", function(e){
							if(closeIntercept()){
								// If user selects "OK" then remove previous page settings
								var cell = $("#manageUserRequests td.myDeviceColumn");
								//$("#deviceDetailsWrapper").slideUp().removeClass("readonly");
								//detailsRow.data("cell").find("div.accountPhoneBottom").removeClass("readonly");
								//detailsRow.data("cell", detailsRow).appendTo($("#deviceDetailsTable"));
								detailsRowReset();
								
								// Remove errorText and updateText
								frmPreferences.prev().find("ul.formErrors").remove();
								frmPreferences.prev().find("div.updateMessage").remove();
								
								// Remove updated icons, error icons and ajax form data	
								cell.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
								
							} else {
								e.preventDefault();
								$(this).blur();
								return false;
							}
						});
					}
					Sprint.frmpreferences.bulProcessChanges = $("#frmPreferences").serialize();
				}
			}
			
			// ----------------------- //
			// END: bulk block Voice      //
			//                         //
			// Start: block text //
			// ----------------------- //
			else if (frmPreferences.hasClass("blockTexts")){
				var deviceData;
				var detailsRow = $("#deviceDetailsRow");
				detailsRow.data("cell",detailsRow);
				
				/*
				  The term "current" refers to what's currently saved or entered as the radio button option
				  The term "target" refers to the radio selection the user wants to make current
				 */
				
				preferencesFormFields = {
					txtBlockNumber: {
						name: "txtBlockNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					},
					txtAllowNumber: {
						name: "txtAllowNumber",
						type: "enterpriseEmailAddress,phoneShortCode,phoneNumber,domainName",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.deviceInvalid"),
						customValidationRule: function(field){return itemListCustomValidation(field)}
					}
				};
				
				var itemListCustomValidation = function (field){
					//used for both block and allow lists
					
					//reset the invalid error message
					preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.deviceInvalid");
					
					var fieldValue = field.val();
					var fieldName = field.attr("name");
					var validDevice = false;
					
					if(fieldValue.length < 4){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.minimumLengthError");
					}
					else if (Sprint.formFieldTypes.enterpriseEmailAddress.test(fieldValue)) {
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneShortCode.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.phoneNumber.test(fieldValue)){
						validDevice = true;
					}
					else if (Sprint.formFieldTypes.domainName.test(fieldValue)){
						validDevice = true;
					}
					
					if(validDevice){
						//test for duplicate values in the list
						var cell = detailsRow.data("cell");
						var cellId = cell.attr("id");
						// No list means no dupes
						if (!cell.find("input.hidItemList").length) {
							return;
						}
						
						if(fieldName == "txtBlockNumber"){
							var itemListString = $("#hidBlockList_"+cellId+"").val();
						} else {
							var itemListString = $("#hidAllowList_"+cellId+"").val();
						}
						var blockedNums = itemListString.split(',');
						var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
						
						for (var i = 0; validDevice && i < blockedNums.length; i++) {
							if ($.trim(blockedNums[i]) !== '') {
								//check if comparison is against a phone number
								if(Sprint.formFieldTypes.phoneNumber.test(blockedNums[i])){
									validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								} else {
									validDevice = blockedNums[i] !== $.trim(fieldValue);
								}
							}
						}
						if (!validDevice) {
							preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
						}
					} 
					else if (fieldValue.length > 4 && fieldValue.match(/@/)){
						preferencesFormFields[field.attr("name")].invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid");
					}
					
					/* Omniture for add number in  Block text added by Venkat */
					if(validDevice){
						var cell = detailsRow.data("cell");
						var currentTxtVal = cell.find("input.hidSelectedOption").val();
						var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");

						if($("#selfrmPrefSelectAccount").length > 0){
							var banNum = 	$("select#selfrmPrefSelectAccount option:selected").text();
								
							// extract number from BAN
							var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
							
							if(cell.data("omnitureFlag").addBlkNumVal == false && currentTxtVal == "BlockSelected"){
								if(typeof(textOmitureBlockAddNumber) != "undefined"){
									textOmitureBlockAddNumber(subId, banId);
								}
								cell.data("omnitureFlag").addBlkNumVal = true;
							}
							else if(cell.data("omnitureFlag").addAlwNumVal == false && currentTxtVal == "AllowSelected"){
								if(typeof(textOmitureAllowAddNumber) != "undefined"){
									textOmitureAllowAddNumber(subId, banId);
								}
								cell.data("omnitureFlag").addAlwNumVal = true;
							}
						} else {
							if(cell.data("omnitureFlag").addBlkNumVal == false && currentTxtVal == "BlockSelected"){
								if(typeof(textOmitureBlockAddNumber) != "undefined"){
									textOmitureBlockAddNumber(subId);
								}
								cell.data("omnitureFlag").addBlkNumVal = true;
							}
							else if(cell.data("omnitureFlag").addAlwNumVal == false && currentTxtVal == "AllowSelected"){
								if(typeof(textOmitureAllowAddNumber) != "undefined"){
									textOmitureAllowAddNumber(subId);
								}
								cell.data("omnitureFlag").addAlwNumVal = true;
							}
						}
					}
					return validDevice;
				}
				
				var setUpCells = function(){
					var subscriberIDs = "";
					var visibleDevices = $("#manageUserRequests td.myDeviceColumn:visible");
					
					visibleDevices.each(function(){
						var cell = $(this);
						var cellId = cell.attr("id");
						if(subscriberIDs == ""){
							subscriberIDs += cellId;
						} else {
							subscriberIDs += "," + cellId;
						}
					});
					
					//ajax call to get blocked status
					var cellDetailsLength = 0;
					var cellDetails = getPageDetails(subscriberIDs);
					
					if(cellDetails.devices != undefined){
						cellDetailsLength = cellDetails.devices.length;
					
						for (var i=0; i<cellDetailsLength; i++) {
							var cell = $(visibleDevices[i]);
							var cellId = cell.attr("id");
							var subscriberData = cellDetails.devices[i];
							var selectedOption = (subscriberData.selectedOption) ? subscriberData.selectedOption : "";
							var blockList = (subscriberData.blockList) ? subscriberData.blockList : "";
							var allowList = (subscriberData.allowList) ? subscriberData.allowList : "";
							
							//TODO: remove hotlined status and check for disabled status instead
							if(subscriberData.hotlined){
								cell.data("hotlined",true);
								cell.data("hotlinedToolTip",subscriberData.tooltipMessage);
							}
							
							// Check for server errors
							if(subscriberData.error && !cell.hasClass("error")){
								disableCell(cell,subscriberData.tooltipMessage,"error");
							}
								
							//append original selected option and device list (even if list is empty) to subscriber cell
							cell.append($(
								'<input type="hidden" name="hidOriginalOption_'+cellId+'" id="hidOriginalOption_'+cellId+'" class="hidOriginalOption" value="'+selectedOption+'" />' + 
								'<input type="hidden" name="hidSelectedOption_'+cellId+'" id="hidSelectedOption_'+cellId+'" class="hidSelectedOption" value="'+selectedOption+'" />' +
								'<input type="hidden" name="hidBlockList_'+cellId+'" id="hidBlockList_'+cellId+'" class="hidItemList" value="'+blockList+'" />' + '<input type="hidden" name="hidAllowList_'+cellId+'" id="hidAllowList_'+cellId+'" class="hidItemList" value="'+allowList+'" />' +
								'<input type="hidden" name="mdn_'+cellId+'" id="mdn_'+cellId+'" class="hidMdnNum" value="'+cell.find("div.deviceNumber").text()+'" />'
							));
							
							//save the original item list, even if it's empty
							/*if(cell.data("originalItemList") == undefined){
								var sortedItemList = "";
								if (itemList != ""){
									var itemListArray = itemList.split(",");
									sortedItemList = itemListArray.sort().join(",");
								}
								cell.data("originalItemList",sortedItemList);
							}*/
							
							//save the blockLimit for this cell - caps the amount of numbers that can be added to the block/allow select lists
							if(cell.data("blockLimit") == undefined && subscriberData.blockLimit){
								cell.data("blockLimit",subscriberData.blockLimit);
							}
							
							originalFormData += "&" + cell.find("input:hidden").serialize();
							
							if(selectedOption != "" && selectedOption != "BlockNone"){
								//this device is restricted in some way, display restricted icon
								cell.addClass("restricted");
							}
							/* add omniture data flags for each device */
							cell.data("omnitureFlag",{
								addBlkNumVal:false,
								addAlwNumVal:false,
								remBlkNumVal:false,
								remAlwNumVal:false
							});
						}
					}
				}
	
				//function which contains ajax call to fetch data and render data cells
				getAccountDevices($("#subscriberListWrapper"));
				var cells = $("#manageUserRequests td.myDeviceColumn");
				
				// Set up drawer UI
				$("div.textMessagingWrapper table:first").deviceDrawer({
					beforeSlideUp: function(e){
						var cell = $(e.currentTarget);
						if (!cell.hasClass("readonly")){
							var currentCell = detailsRow.data("cell");
							var currentItemListString = currentCell.find("input.hidItemList").val();
							
							if(cell.data("suspended")){
								disableCell(cell,cell.data("suspendedToolTip"),"readonly");
							} else if (cell.data("hotlined")){
								disableCell(cell,cell.data("hotlinedToolTip"),"readonly");
							} else if (cell.data("disabled")){
								disableCell(cell,cell.data("disabledToolTip"),"readonly");
							}
							
							
							if(!cell.data("ajaxSuccess")){
								//Fire ajax call to check if user has permissions to update device
								var subscriberData = getSubscriberDetails(cell);
								
								cell.data("ajaxSuccess",true);
								
								if(subscriberData.hotlined || subscriberData.disabled){
									disableCell(cell,subscriberData.tooltipMessage, "readonly");
								}
								else if(subscriberData.error){
									disableCell(cell,"","reset");
									disableCell(cell,subscriberData.tooltipMessage,"error");
									cell.data("ajaxSuccess",false);
									return false;
								}
							}
						}
					},
					afterSlideUp: function(e){
						var cell = $(e.currentTarget);
						var cellId = cell.attr("id");
						var blockSelectedBox = $("#blockSelectedWrapper");
						var allowSelectedBox = $("#allowSelectedWrapper");
						var currentSelectionVal = cell.find("input.hidSelectedOption").val();
						
						blockSelectedBox.hide();
						allowSelectedBox.hide();
						
						//clear the select lists
						$("#selBlockedList, #selAllowedList").empty();
						
						//clear value and errors from the input field
						$("#txtBlockNumber, #txtAllowNumber").removeClass("error").val("").siblings("label").remove();
							
						//if we have an item list then add the values to either the BlockSelected or AllowSelected <select> element
						//if Blocked or Allowed then check for item list.
						if(currentSelectionVal == "BlockSelected" || currentSelectionVal == "AllowSelected"){
							if(currentSelectionVal == "BlockSelected"){
								var itemListString = cell.find("#hidBlockList_"+cellId+"").val();
							}else{
								var itemListString = cell.find("#hidAllowList_"+cellId+"").val();
							}
							var optionList = "";
							
							if (itemListString && itemListString != ""){
								var itemListArray = itemListString.split(",").sort();
								var itemListLength = itemListArray.length;
								
								for (var i=0; i<itemListLength; i++) {
									optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
								}
							}
							
							if(currentSelectionVal == "BlockSelected"){
								$("#selBlockedList").html(optionList);
								blockSelectedBox.show();
							} else {
								$("#selAllowedList").html(optionList);
								allowSelectedBox.show();
							}
						}
						
						//radio buttons are checked in beforeSlideDown for IE6 and IE7 due to browser bug
						$("#rad"+currentSelectionVal).attr("checked","checked");
						detailsRow.data("lastClicked",currentSelectionVal);
						
						if(cell.hasClass("readonly")){
							detailsRow.find("input.radio, select").attr("disabled","disabled");
							detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber, #btnAddAllowedNumber, #btnRemoveAllowedNumber").addClass("disabled");
						} else {
							detailsRow.find("input.radio, select").removeAttr("disabled","disabled");
							detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber, #btnAddAllowedNumber, #btnRemoveAllowedNumber").removeClass("disabled");
						}
						
						if(cell.hasClass("readonly") && currentSelectionVal == "BlockNone"){
							//cell.scrollTo();
							return false;
						}
					},
					beforeSlideDown: function(e){
						if($.browser.msie && $.browser.version < 8){
							var cell = $(e.currentTarget);
							var currentRadioSelection = "#rad" + cell.find("input.hidSelectedOption").val();
						
							detailsRow.find(currentRadioSelection).attr('checked', 'checked');
						}
					},
					beforeToggle: function(e){
						var cell = $(e.currentTarget);
						if(cell.hasClass("readonly") && cell.find("input.hidSelectedOption").val() == "BlockNone"){
							return false;
						}
					}
				});
				
				// BIND radio button events
				$("#deviceDetailsWrapper input.radio").bind("click",function(e){
					var $this = $(this);
					var cell = detailsRow.data("cell");
					var cellId = cell.attr("id");
					var blockSelectedBox = $("#blockSelectedWrapper");
					var allowSelectedBox = $("#allowSelectedWrapper");
					var currentSelectionVal = cell.find("input.hidSelectedOption").val();
					
					if(detailsRow.data("lastClicked") == undefined){
						detailsRow.data("lastClicked",currentSelectionVal);
					}
					
					if ($this.val() != detailsRow.data("lastClicked")) {
					
						// if current selection is a list then trigger confirm alert that list will be lost
						if(currentSelectionVal == "BlockSelected" && $this.val() != "AllowSelected"){
							if(currentSelectionVal == "BlockSelected"){
								var itemList = cell.find("#hidBlockList_"+cellId+"");
							}else{
								var itemList = cell.find("#hidAllowList_"+cellId+"");
							}
							
							if(itemList.length > 0 && itemList.val() != ""){
								var radCurrentSelection = $("#rad"+currentSelectionVal);
								var listText = radCurrentSelection.attr("alt");
								
								alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteListMessage");
								alertMsg = alertMsg.replace(/\[type\]/g, listText);
								
								if(confirm(alertMsg)){
									//empty the hidden phone list
									itemList.val("");
									
									//empty the visible select box list
									if(currentSelectionVal == "BlockSelected"){
										$("#blockSelectedWrapper select").empty();
									} else {
										$("#allowSelectedWrapper select").empty();
									}
								} else {
									e.preventDefault();
									radCurrentSelection.attr('checked','checked');
									return;
								}
							}
						}
						//clear any errors that might have been left in the add number input
						$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
						
						updateCellStatus(cell,$this.val());
						cell.find("input.hidSelectedOption").val($this.val());
						
						// Show/Hide the select list
						if($this.attr("id") == "radAllowSelected"){
							var allowListString = $("#hidAllowList_"+cellId+"").val();
							if (allowListString && allowListString != ""){
								var optionList = "";
								var itemListArray = allowListString.split(",").sort();
								var itemListLength = itemListArray.length;
								
								for (var i=0; i<itemListLength; i++) {
									optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
								}
								$("#selAllowedList").html(optionList);
							}
						
							if(blockSelectedBox.is(":visible")){
								blockSelectedBox.slideUp().animate({left: 0}, 100,function(){
									allowSelectedBox.slideDown();
								});
							} else {
								allowSelectedBox.slideDown();
							}
						}
						else if($this.attr("id") == "radBlockSelected"){
							var blockListString = $("#hidBlockList_"+cellId+"").val();
							if (blockListString && blockListString != ""){
								var optionList = "";
								var itemListArray = blockListString.split(",").sort();
								var itemListLength = itemListArray.length;
								
								for (var i=0; i<itemListLength; i++) {
									optionList += '<option value="' + itemListArray[i] + '">' + itemListArray[i] + '</option>\n';
								}
								$("#selBlockedList").html(optionList);
							}
							
							if(allowSelectedBox.is(":visible")){
								allowSelectedBox.slideUp().animate({left: 0}, 100,function(){
									blockSelectedBox.slideDown();
								});
							} else {
								blockSelectedBox.slideDown();
							}
						}
						else {
							if (blockSelectedBox.is(":visible")) {
								blockSelectedBox.slideUp();
							}
							else if (allowSelectedBox.is(":visible")) {
								allowSelectedBox.slideUp();
							}
						}
					}
					detailsRow.data("lastClicked",$this.val());
				});
				
				// Trigger a click on the 'add number' buttons when the enter/return key is pressed
				$('#txtBlockNumber').bind('keypress', function(e) {
					if (e.keyCode == 13) {
						$("#btnAddBlockedNumber").trigger('click');
						return false;
					}
				});
				$('#txtAllowNumber').bind('keypress', function(e) {
					if (e.keyCode == 13) {
						$("#btnAddAllowedNumber").trigger('click');
						return false;
					}
				});
				
				//Bind 'add number' to list buttons
				$("#btnAddBlockedNumber, #btnAddAllowedNumber").bind("click",function(){
					//add number to list and to hidden phone number list
					var cell = detailsRow.data("cell");
					var cellId = cell.attr("id");
					var newListItem = ($(this).attr("id") == "btnAddBlockedNumber")?$("#txtBlockNumber"):$("#txtAllowNumber");
					var newListItemVal = newListItem.val();
					
					//remove errors
					$('#txtBlockNumber,#txtAllowNumber').removeClass('error').siblings("label").remove();
					newListItemVal = newListItemVal.replace(/\s+/g,"");
					//return if input is empty
					if(newListItemVal.length == 0){
						newListItem.trigger("blur").val("").focus();
						return;
					}
					
					//validate this field
					var validatedInput = Sprint.fn.validateForm(frmPreferences, {field: preferencesFormFields[newListItem.attr("name")]});
					
					if (validatedInput == true) {
						//see if the limit has been reached
						//TODO: test when max is undefined or null;
						var max = cell.data("blockLimit") || $("#hidBlockLimit").val() || 50;
						var selectBox = ($(this).attr("id") == "btnAddBlockedNumber")?$("#selBlockedList"):$("#selAllowedList");
						var itemListCount = selectBox.find("option").length;
						
						if(max <= itemListCount){
							return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
						} else {
							
							var newOption = $('<option value="'+newListItemVal+'">'+newListItemVal+'</option>');
							if($(this).attr("id") == "btnAddBlockedNumber"){
								var itemList = cell.find("#hidBlockList_"+cellId+"");
							}else{
								var itemList = cell.find("#hidAllowList_"+cellId+"");
							}
							var itemListString = itemList.val();
							
							selectBox.append(newOption);
							
							if (itemListString == ""){
								itemList.val(newListItemVal)
							} else {
								itemList.val(itemListString + "," + newListItemVal);
							}
							
							newListItem.val("");
							compareLists(cell);
						}
					}
					else {
						frmPreferences.showFormErrors({
							errorData: validatedInput,
							showInline: true,
							showSummary: false
						});
					}
				});
				
				//BIND remove items from list button
				$("#btnRemoveBlockedNumber, #btnRemoveAllowedNumber").bind("click",function(){
					//remove number from list and hidden input list
					
					var selectBox = ($(this).attr("id") == "btnRemoveBlockedNumber")?$("#selBlockedList"):$("#selAllowedList");
					var selectedListItems = selectBox.find("option:selected");
					
					if(selectedListItems.length > 0){
						var cell = detailsRow.data("cell");
						var cellId = cell.attr("id");
						if($(this).attr("id") == "btnRemoveBlockedNumber"){
							var itemList = cell.find("#hidBlockList_"+cellId+"");
						}else{
							var itemList = cell.find("#hidAllowList_"+cellId+"");
						}
						var itemListString = itemList.val();
						
						selectedListItems.each(function(){
							
							/* Omniture for remove number in  Block text added by Venkat */
							var cell = detailsRow.data("cell");
							var currentTxtVal = cell.find("input.hidSelectedOption").val();
							var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");
							
							if($("#selfrmPrefSelectAccount").length > 0){
								var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
								var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
								
								if(cell.data("omnitureFlag").remBlkNumVal == false && currentTxtVal == "BlockSelected"){
									if(typeof(textOmitureBlockRemoveNumber) != "undefined"){
										textOmitureBlockRemoveNumber(subId, banId);
									}
									cell.data("omnitureFlag").remBlkNumVal = true;
								}
								else if(cell.data("omnitureFlag").remAlwNumVal == false && currentTxtVal == "AllowSelected"){
									if(typeof(textOmitureAllowRemoveAddNumber) != "undefined"){
										textOmitureAllowRemoveAddNumber(subId, banId);
									}
									cell.data("omnitureFlag").remAlwNumVal = true;
								}
							} else {
								if(cell.data("omnitureFlag").remBlkNumVal == false && currentTxtVal == "BlockSelected"){
									if(typeof(textOmitureBlockRemoveNumber) != "undefined"){
										textOmitureBlockRemoveNumber(subId);
									}
									cell.data("omnitureFlag").remBlkNumVal = true;
								}
								else if(cell.data("omnitureFlag").remAlwNumVal == false && currentTxtVal == "AllowSelected"){
									if(typeof(textOmitureAllowRemoveAddNumber) != "undefined"){
										textOmitureAllowRemoveAddNumber(subId);
									}
									cell.data("omnitureFlag").remAlwNumVal = true;
								}
							}
							/* End of Omniture*/
							//remove the values selected from the itemListString
							itemListString = itemListString.replace($(this).text(),"");
						}).remove();
						
						//clean up the itemListString by removing any extra commas at the start, middle and end of the string
						itemListString = itemListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
						
						
						itemList.val(itemListString);
						compareLists(cell);
					}
				});
				
				if(cells.length > 0){
					if(cells.length <= 6){
						setUpCells();
					} else {
						$("#manageUserRequests").sortableTable({
							pagination: true,
							paginationBelow: false,
							rowsPerPage: 3,
							afterPageUpdate: function(){
								setUpCells();
							}
						});
					
						//pagination page number click event
						$("ul.pageList li a").bind("click", function(e){
							if(closeIntercept()){
								//if user selects "OK" then remove previous page settings
								var cells = $("#manageUserRequests td.myDeviceColumn");
								$("#deviceDetailsWrapper").slideUp().removeClass("readonly");
								detailsRow.data("cell").find("div.accountPhoneBottom").removeClass("readonly");
								detailsRow.data("cell",detailsRow).appendTo($("#deviceDetailsTable"));
								
								//remove changed data, which is being discarded, from originalFormData object
								var activeCells = $("#manageUserRequests td.active");
								if(activeCells.length > 0){
									activeCells.each(function(){
										//find hidden inputs for this cell, get names, match/remove from originalFormData
										
										var cell = $(this);
										var hidOriginalOption = cell.find("input.hidOriginalOption");
										var hidSelectedOption = cell.find("input.hidSelectedOption");
										var hidItemList = cell.find("input.hidItemList");
										
										var trimStart = originalFormData.lastIndexOf("&" + hidOriginalOption.attr("name"));
										var trimEnd = originalFormData.lastIndexOf(hidItemList.attr("name")) + hidItemList.serialize().length;
										var dataToTrim = originalFormData.substring(trimStart,trimEnd);
										
										originalFormData = originalFormData.replace(dataToTrim,"");
										
									})
								}
								
								//remove errorText and updateText
								frmPreferences.prev().find("ul.formErrors").remove();
								frmPreferences.prev().find("div.updateMessage").remove();
								
								//remove updated icons, error icons and ajax form data	
								cells.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
								
							} else {
								e.preventDefault();
								$(this).blur();
								return false;
							}
						});
					}
				}
			}
			
			// ------------------------- //
			// END: block text	      	 //
			//					         //
			// START: block voice		 //
			// ------------------------- //
			
			else if (frmPreferences.hasClass("blockVoice")){
				var deviceData;
				var detailsRow				= $("#deviceDetailsRow");
				var blockListBox			= detailsRow.find("#blockSelectedWrapper").hide();
				var archiveListBox			= detailsRow.find('#archivedNumbersWrapper').hide();
				var btnHideArchiveList		= detailsRow.find('#hideArchiveList');
				var btnAccessArchiveList	= detailsRow.find('#accessArchiveList');
				var btnAddBlockedNumber		= detailsRow.find('#btnAddBlockedNumber');
				var btnRemoveNumber			= detailsRow.find('#btnRemoveBlockedNumber');
				var btnMoveNumber			= archiveListBox.find("#btnMoveNumber");
				var addNumberInput			= detailsRow.find("#voiceBlockNumber");
				var blockListSelect			= blockListBox.find("#selBlockedList");
				var archiveListSelect		= archiveListBox.find("#selArchivedList");
				
				// Create "add number" input validation object
				preferencesFormFields = {
					voiceBlockNumber: {
						name: "voiceBlockNumber",
						type: "phoneNumber",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){
							//reset the invalid error message
							this.invalidErrorMessage = Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid");
							
							var fieldValue = field.val();
							var validDevice = Sprint.formFieldTypes.phoneNumber.test(fieldValue);

							if (validDevice) {
								//test for exceptions and duplicate values in the list. Exceptions are tested first.
								var cell = detailsRow.data("cell");
								var simplifiedFieldValue = $.trim(fieldValue).replace(/\(|\)|\s|\.|\-/g, '');
								
								//create exception list
								var unblockableList = $.trim(cell.find("input.hidExceptionList").val());
								if(unblockableList.length > 0){
									var unblockableNums = unblockableList.split(',');
									var unblockableNumsCount = unblockableNums.length - 1;
									
									for (var i = unblockableNumsCount; validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(unblockableNums[i]) !== '') {
											validDevice = $.trim(unblockableNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneNumberUnblockable");
										return validDevice;
									}
								}
								
								// No list means no dupes
								var blockedList = $.trim(cell.find("input.hidBlockList").val());
								if (blockedList.length <= 0) {
									return true;
								} else {
									var blockedNums = blockedList.split(',');
									var blockedNumsCount = blockedNums.length - 1;
									
									for (var i = blockedNumsCount;validDevice && i >= 0; i--) {
										//TODO: remove empty string check
										if ($.trim(blockedNums[i]) !== '') {
											validDevice = $.trim(blockedNums[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
										}
									}
									if (!validDevice) {
										this.invalidErrorMessage = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListDuplicate");
										return validDevice;
									}
								}
							}
							return validDevice;
						}
					}
				};
				
				// Define the cell setup procedure
				var setUpCells = function(){
					var subscriberIDs = "";
					var visibleDevices = $("#manageUserRequests td.myDeviceColumn:visible");
					
					//collect the Id's of the visible device
					visibleDevices.each(function(){
						var cell = $(this);
						var cellId = cell.attr("id");
						if (subscriberIDs == "") {
							subscriberIDs += cellId;
						} else {
							subscriberIDs += "," + cellId;
						}
					});
					
					// Ajax call to get blocked status
					var cellDetailsLength = 0;
					var cellDetails = getPageDetails(subscriberIDs);
					
					if(cellDetails.devices){
						cellDetailsLength = cellDetails.devices.length;
						
						
						for (var i=0; i<cellDetailsLength; i++) {
							var cell = $(visibleDevices[i]);
							var cellId = cell.attr("id");
							var subscriberData = cellDetails.devices[i];
							var selectedOption = (subscriberData.selectedOption) ? subscriberData.selectedOption : "";
							
							//TODO: remove hotlined status and check for disabled status instead
							if(subscriberData.hotlined){
								cell.data("hotlined",true);
								cell.data("hotlinedToolTip",subscriberData.tooltipMessage);
							}
							
							if(subscriberData.WINPresent){
								cell.data("WINPresent",true);
							}
							
							// Check for server errors
							if(subscriberData.error && !cell.hasClass("error")){
								disableCell(cell,subscriberData.tooltipMessage,"error");
							}
														
							// Append original selected option and device list (even if list is empty) to subscriber cell
							// hidArchiveList is for which numbers will be stored as the archived list
							// hidBlockList is for which numbers will be blocked and appear in the editable select box
							// hidExceptionList is for numbers that cannot be added to the block list
							
							cell.append($(
								'<input type="hidden" name="hidOriginalOption_' + cellId + '" id="hidOriginalOption_' + cellId + '" class="hidOriginalOption" value="' + subscriberData.selectedOption + '" />' +
								'<input type="hidden" name="hidSelectedOption_' + cellId + '" id="hidSelectedOption_' + cellId + '" class="hidSelectedOption" value="' + subscriberData.selectedOption + '" />' +
								'<input type="hidden" name="hidArchiveList_' + cellId + '" id="hidArchiveList_' + cellId + '" class="hidArchiveList" value="" />' +
								'<input type="hidden" name="hidBlockList_' + cellId + '" id="hidBlockList_' + cellId + '" class="hidBlockList" value="" />' +
								'<input type="hidden" name="hidExceptionList_' + cellId + '" id="hidExceptionList_' + cellId + '" class="hidExceptionList" value="" />' +
								'<input type="hidden" name="mdn_' + cellId + '" id="mdn_' + cellId + '" class="hidMdnNum" value="'+ cell.find("div.deviceNumber").text() +'" />'
							));
							
							originalFormData += "&" + cell.find("input:hidden").serialize();
							
							if(selectedOption != "" && selectedOption != "BlockNone"){
								//this device is restricted in some way, display restricted icon
								cell.addClass("restricted");
							}
				
							/* add omniture data flags for each device */
							cell.data("omnitureFlag",{
								btnAddVal:false,
								btnAccVal:false,
								btnRemVal:false,
								btnMovVal:false
							});
						}
					}
				}


				
				//function which contains ajax call to fetch data and render data cells
				getAccountDevices($("#subscriberListWrapper"));
				var cells = $("#manageUserRequests td.myDeviceColumn");
				
				// Set up drawer UI
				$("div.blockVoiceWrapper table:first").deviceDrawer({
					beforeSlideUp: function(e) {
						var cell = $(e.currentTarget);
												
						if (!cell.hasClass("readonly")){
							var currentCell = detailsRow.data("cell");
							var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
							var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
							
							if(currentRadioSelection == "BlockSelected" && originalRadioSelection != "BlockSelected"){
								var currentBlockList = $.trim(currentCell.find("input.hidBlockList").val());
								if(currentBlockList == ""){
									alert("You must enter at least one number to be blocked");
									$("#radBlockSelected").scrollTo();
									$("#voiceBlockNumber").focus();
									return false;
								}
							}
							
							if(cell.data("suspended")){
								disableCell(cell, cell.data("suspendedToolTip"),"readonly");
							} else if (cell.data("hotlined")){
								disableCell(cell,cell.data("hotlinedToolTip"),"readonly");
							} else if (cell.data("disabled")){
								disableCell(cell,cell.data("disabledToolTip"),"readonly");
							}
							
							// Make ajax call to get the subscriber's lists
							if(!cell.data('ajaxSuccess')) {
								var itemLists = getSubscriberDetails(cell);
								cell.data('ajaxSuccess', true);
								
								if(itemLists.disabled){
									disableCell(cell, itemLists.tooltipMessage,"readonly");
								} else if(itemLists.error){
									disableCell(cell,"","reset");
									disableCell(cell,itemLists.tooltipMessage,"error");
									cell.data('ajaxSuccess', false);
									return false;
								}
								
								if(itemLists.blockListActive == false){
									cell.data("blockListActive", false);
								} else {
									cell.data("blockListActive", true);
								}
								
								if(itemLists.archiveList){
									cell.find("input.hidArchiveList").val(itemLists.archiveList);
									
									//store the original archive list so it can be reverted if data is dumped
									if(cell.data("originalArchiveList") == undefined){
										var sortedItemList = "";
										if (itemLists.archiveList != ""){
											var itemListArray = itemLists.archiveList.split(",");
											sortedItemList = itemListArray.sort().join(",");
										}
										cell.data("originalArchiveList",sortedItemList);
									}
									// remove items from archive list that are already present in the block list
									// using reverse loop so as items are removed the indexes remain the same for the duration of the loop
									var blockList = cell.find("input.hidBlockList").val();
									var archiveListArray = itemLists.archiveList.split(",");
									if(blockList.length > 0 && archiveListArray.length < 100){
										var blockListArray = blockList.split(",");
										
										for (var i = blockListArray.length - 1; i >= 0; i--) {
											for (var j = archiveListArray.length - 1; j >= 0; j--) {
												if(blockListArray[i] == archiveListArray[j]){
													archiveListArray.splice(j,1);
													break;
												}
											}
										}
										cell.find("input.hidArchiveList").val(archiveListArray.join(","));
									}
										
								}
								if(itemLists.blockList){
									cell.find("input.hidBlockList").val(itemLists.blockList);
									
									//save the original item list so it can be compared to detect changes
									if(cell.data("originalItemList") == undefined){
										var sortedItemList = "";
										if (itemLists.blockList != ""){
											var itemListArray = itemLists.blockList.split(",");
											sortedItemList = itemListArray.sort().join(",");
										}
										cell.data("originalItemList",sortedItemList);
									}
								}
								if(itemLists.exceptionList){
									cell.find("input.hidExceptionList").val(itemLists.exceptionList);
								}
								
								//save the blockLimit for this cell - caps the amount of numbers that can be added to the block/allow select lists
								if(cell.data("blockLimit") == undefined && itemLists.blockLimit){
									cell.data("blockLimit",itemLists.blockLimit);
								}
							}
						}
					},
					afterSlideUp: function(e){
						
						//TODO: clear unactivated list warning
						//TODO: clear errors, clear errors on save button click as well.
						
						var cell = $(e.currentTarget);
						var currentRadioSelection = cell.find("input.hidSelectedOption").val();
						
						//hide readonly info message
						detailsRow.find("#readonlyMsg .formSuggestions").hide();
						
						if(cell.data("WINPresent")){
							$("#detailsField").hide();
							$("#detailsMessage").show();
						} else {
							$("#detailsField").show();
							$("#detailsMessage").hide();
							// Make current selection and update display
							
							//radio buttons are checked in beforeSlideDown for IE6 and IE7 due to browser bug
							detailsRow.find('#rad' + currentRadioSelection).attr('checked', 'checked');
							detailsRow.data("lastClicked",currentRadioSelection);
							
							//clear value and errors from the input field
							$("#voiceBlockNumber").removeClass("error").val("").siblings("label").remove();
							
							// Setup the block number display
							if(currentRadioSelection === 'BlockSelected') {
								
								if(cell.data("blockListActive") == false){
									detailsRow.find("#blockSelectedWrapper ul.formSuggestions").show();
								} else {
									detailsRow.find("#blockSelectedWrapper ul.formSuggestions").hide();
								}
								
								//TODO: remove this since loading occurs when drawer is closed. Ajax can be moved to afterSlideDown callback
								// Set the loading message before the ajax call
								//var loadingMessage = $('<p id="loadingListMessage">Loading...</p>');
								//detailsRow.find('#radBlockSelected').parents('.checks').after(loadingMessage);
								
								// Populate the blocked list
								var hidBlockListVal = cell.find("input.hidBlockList").val();
								if(hidBlockListVal.length > 0){
									var optionList		= "";
									var blockList		= hidBlockListVal.split(',').sort();
									var blockListLength = blockList.length;
									
									for (var i=0; i<blockListLength; i++) {
										optionList += '<option value="' + blockList[i] + '">' + blockList[i] + '</option>\n';
									}
								
									blockListSelect.html(optionList);
								} else {
									blockListSelect.empty();
								}
								
								// Populate the archived list
								var hidArchiveListVal = cell.find("input.hidArchiveList").val();
								if(hidArchiveListVal.length > 0){
									var optionList	= "";
									var archiveList = hidArchiveListVal.split(',');
									var archiveListLength = archiveList.length;
									
									for (var i=0; i<archiveListLength; i++) {
										optionList += '<option value="' + archiveList[i] + '">' + archiveList[i] + '</option>\n';
									}
								
									archiveListSelect.html(optionList);
								} else {
									archiveListSelect.empty();
								}
								
								// Remove the loading message and show the blocked list
								//loadingMessage.remove();
								
								blockListBox.show();
							} else if (currentRadioSelection === 'BlockAllInbound' || currentRadioSelection === 'BlockAll'){
								detailsRow.find("#readonlyMsg .formSuggestions").show();
								
								//replace [SOC type name] with proper text
								
								var warningMsg = detailsRow.find('#readonlyMsg ul li');
								var warningMsgText = warningMsg.text();
								var SOCtype = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal['"+currentRadioSelection+"']");
								
								warningMsg.text(warningMsgText.replace(/\$[a-zA-Z0-9_\.\-\s]*\$/g, SOCtype));
								
								blockListBox.hide();
							} else {
								blockListBox.hide();
							}
							archiveListBox.hide();
							$("#btnRemoveBlockedNumber").show();
						
							//update the originalFormData string with our fresh server data and sort it
							originalFormData += "&" + cell.find("input:hidden").serialize();
							originalFormData = sortQueryString(originalFormData);
							
							if(cell.hasClass("readonly")){
								detailsRow.find("input.radio, select, input#voiceBlockNumber").attr("disabled","disabled");
								detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber").addClass("disabled");
							} else {
								detailsRow.find("input.radio:not(#radBlockAllInbound,#radBlockAll), select, input#voiceBlockNumber").removeAttr("disabled","disabled");
								detailsRow.find("#btnAddBlockedNumber, #btnRemoveBlockedNumber").removeClass("disabled");
							}
						}
						if(cell.hasClass("readonly") && currentRadioSelection == "BlockNone"){
							//cell.scrollTo();
							return false;
						}
					},
					beforeSlideDown: function(e){
						if($.browser.msie && $.browser.version < 8){
							var cell = $(e.currentTarget);
							var currentRadioSelection = "#rad" + cell.find("input.hidSelectedOption").val();
						
							detailsRow.find(currentRadioSelection).attr('checked', 'checked');
						}
					},
					beforeToggle: function(e){
						var detailsRow = $("#deviceDetailsRow");
						var currentCell = detailsRow.data("cell");
						var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
						var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
						
						if(currentCell.hasClass("readonly") && currentCell.find("input.hidSelectedOption").val() == "BlockNone"){
							return false;
						}
						
						if(currentRadioSelection == "BlockSelected"){
							var currentBlockList = $.trim(currentCell.find("input.hidBlockList").val());
							if(currentBlockList == ""){
								alert("You must enter at least one number to be blocked");
								$("#radBlockSelected").scrollTo();
								$("#voiceBlockNumber").focus();
								return false;
							}
						}
					}
				});

				// Click events for show/hide of archived list
				btnAccessArchiveList.toggle( 
					function() {
						var cell = detailsRow.data("cell");
						if(cell.data("omnitureFlag").btnAccVal == false){
							/* Omniture for adding number in  Block voice added by Venkat */
							var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");
							if($("#selfrmPrefSelectAccount").length > 0){
								var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
								var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
								if(typeof(voiceOmitureArchiveList) != "undefined"){
									voiceOmitureArchiveList(subId, banId);
								}
							} else {
								if(typeof(voiceOmitureArchiveList) != "undefined"){
									voiceOmitureArchiveList(subId);
								}
							}
							cell.data("omnitureFlag").btnAccVal = true;
								
						}/* End of omniture code*/
						btnRemoveNumber.fadeOut();
						archiveListBox.fadeIn();
						return false;
					},
					function(){
						btnRemoveNumber.fadeIn();
						archiveListBox.fadeOut();
						return false;
					}
				);
				btnHideArchiveList.bind('click', function() {
					btnRemoveNumber.fadeIn();
					btnAccessArchiveList.trigger("click");
					return false;
				});
							
				// Bind radio button events				
				$("#deviceDetailsWrapper input.radio").bind("click", function(e) {
					var radio = $(this);
					var cell = detailsRow.data('cell');
					var currentVoiceOption = cell.find("input.hidSelectedOption").val();
					
					if(detailsRow.data("lastClicked") == undefined){
						detailsRow.data("lastClicked",currentVoiceOption);
					}
					
					if (radio.val() != detailsRow.data("lastClicked")) {
						
						// If current selection is a list then trigger confirm alert that list will be lost
						if (currentVoiceOption === 'BlockSelected') {
							var blockList = cell.find("input.hidBlockList");
							
							if (blockList.length > 0 && blockList.val() != "") {
								var radVoicetSelection = $("#rad"+currentVoiceOption);
								var listText = $('#radBlockSelected').attr("alt");
								
								alertMsg = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.deleteVoiceListMessage");
								alertMsg = alertMsg.replace(/\[type\]/g, listText);
								
								if (confirm(alertMsg)) {
									// Empty the hidden phone list
									blockList.val("");
									
									//empty the visible select box list
									blockListSelect.empty();
								}
								else {
									e.preventDefault();
									radVoicetSelection.attr('checked','checked');
									return;
								}
							}
						}
						//clear any errors that might have been left in the add number input
						$("#deviceDetailsWrapper input.text").removeClass("error").val("").next().remove();
						
						updateCellStatus(cell, radio.val());
						cell.find('input.hidSelectedOption').val(radio.val());
						
						// Show/Hide the select list
						if (radio.attr("id") == "radBlockSelected") {
							
							// Populate the blocked list
							var hidBlockListVal = cell.find("input.hidBlockList").val();
							if(hidBlockListVal.length > 0){
								var optionList		= "";
								var blockList		= hidBlockListVal.split(',').sort();
								var blockListLength = blockList.length;
								
								for (var i=0; i<blockListLength; i++) {
									optionList += '<option value="' + blockList[i] + '">' + blockList[i] + '</option>\n';
								}
							
								blockListSelect.html(optionList);
							} else {
								blockListSelect.empty();
							}
							
							if(cell.data("blockListActive") == false){
								detailsRow.find("#blockSelectedWrapper ul.formSuggestions").show();
							} else {
								detailsRow.find("#blockSelectedWrapper ul.formSuggestions").hide();
							}
							
							// Populate the archived list
							var hidArchiveListVal = cell.find("input.hidArchiveList").val();
							if (hidArchiveListVal.length > 0) {
								var optionList = "";
								var archiveList = hidArchiveListVal.split(',');
								var archiveListLength = archiveList.length;
								
								for (var i = 0; i < archiveListLength; i++) {
									optionList += '<option value="' + archiveList[i] + '">' + archiveList[i] + '</option>\n';
								}
								
								archiveListSelect.html(optionList);
							}
							else {
								archiveListSelect.empty();
							}
							archiveListBox.hide();
							
							blockListBox.slideDown();
							//The below JS is for showing alert message when block list is there at the time  selecting 'Block list' option from other options. 
							var currentCell = detailsRow.data("cell");
							var blockListEmpty = currentCell.data("originalItemList")
							if(blockListEmpty != undefined){
								alert("We are still in the process of completing your last transaction, come back after 15 minutes");
								var lastClicked = detailsRow.data("lastClicked");
								$("#rad"+lastClicked).attr('checked','checked');
								cell.find('input.hidSelectedOption').val(lastClicked);
								blockListBox.slideUp();
								var hidOriginalSel = cell.find("input.hidOriginalOption").val();
								
								if(hidOriginalSel == lastClicked){
									var subDeselId = cell.attr('id');
									$("#manageUserRequests td#"+subDeselId).removeClass('active');
								}
							}
						}
						else {
							if (blockListBox.is(":visible")) {
								blockListBox.slideUp();
								archiveListBox.hide();
							}
						}
						detailsRow.data("lastClicked", radio.val());
					}
				});

				// Trigger a click on the 'add number' button when the enter/return key is pressed
				addNumberInput.bind('keypress', function(e) {
					if (e.keyCode == 13) {
						btnAddBlockedNumber.trigger('click');
						return false;
					}
				});
				
				// Bind 'add number' to list button
				btnAddBlockedNumber.bind("click", function() {
					var cell = detailsRow.data("cell");
					
					//remove errors
					addNumberInput.removeClass('error').siblings("label").remove();
					var newAddNumberInput = addNumberInput.val();
					newAddNumberInput = newAddNumberInput.replace(/\s+/g,"");
					//return if input is empty
					if (newAddNumberInput.length == 0) {
						addNumberInput.trigger("blur").val("").focus();
						return;
					}
					
					//validate this field
					var blockVoiceValidForm = Sprint.fn.validateForm(frmPreferences, preferencesFormFields);
					
					if (blockVoiceValidForm == true) {

						/* Omniture for adding number in  Block voice added by Venkat */
						if(cell.data("omnitureFlag").btnAddVal == false){
							var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");
							if($("#selfrmPrefSelectAccount").length > 0){
								var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
								var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
								if(typeof(voiceOmitureBlockAddNumber) != "undefined"){
									voiceOmitureBlockAddNumber(subId, banId);
								}
							} else {
								if(typeof(voiceOmitureBlockAddNumber) != "undefined"){
									voiceOmitureBlockAddNumber(subId);
								}
							}
							cell.data("omnitureFlag").btnAddVal = true;
						}/* End of omniture code*/
						//see if the limit has been reached
						var max = cell.data("blockLimit") || $("#hidBlockLimit").val() || 50;
						var itemListCount = blockListSelect.find("option").length;
						
						if(max <= itemListCount){
							return alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
						} else {
							var newOption			= $('<option value="' + addNumberInput.val() + '">' + addNumberInput.val() + '</option>');
							var hidBlockList		= cell.find('input.hidBlockList');
							var hidBlockListString	= hidBlockList.val();
													
							blockListSelect.append(newOption);
							
							if(hidBlockListString == "") {
								hidBlockList.val(addNumberInput.val());
								//cell.data("originalItemList","");
							} else {
								hidBlockList.val(hidBlockListString + "," + addNumberInput.val());
							}
							
							addNumberInput.val("");
							compareLists(cell);
						}
					}
					else {
						frmPreferences.showFormErrors({
							errorData: blockVoiceValidForm,
							showInline: true,
							showSummary: false
						});
					}
				});

				// Bind remove items from list button
				btnRemoveNumber.bind("click", function(e) {
					//remove number from list and hidden input list
					var selectedListItems = blockListSelect.find("option:selected");
					
					if(selectedListItems.length > 0){
						var cell = detailsRow.data("cell");
						var hidArchiveList = cell.find('input.hidArchiveList');
						var hidBlockList = cell.find('input.hidBlockList');
						var hidArchiveListString = hidArchiveList.val();
						var hidBlockListString = hidBlockList.val();
						
						// Remove the number from the hidden block list input
						selectedListItems.each(function(){
							var $this = $(this);
							var $thisVal = $this.val();
							
							// Remove the number from the hidden block list input
							hidBlockListString = hidBlockListString.replace($thisVal,"");
							
							if(hidArchiveListString == "") {
								hidArchiveList.val($thisVal);
								
								// Add the numbers to the archive list
								archiveListSelect.append($this);
							} else {
								//check for duplicates before adding
								var validDevice = true;
								var archiveList = hidArchiveListString.split(',');
								var archiveListCount = archiveList.length - 1;
								var simplifiedFieldValue = $.trim($thisVal).replace(/\(|\)|\s|\.|\-/g, '');
								
								for (var i = archiveListCount;validDevice && i >= 0; i--) {
									validDevice = $.trim(archiveList[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								}
								/* Ominiture for removing Number in  Block voice added by Venkat */
								if(validDevice){
									if(cell.data("omnitureFlag").btnRemVal == false){
										var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											if(typeof(voiceOmitureBlockRemoveNumber) != "undefined"){
												voiceOmitureBlockRemoveNumber(subId, banId);
											}
										} else {
											if(typeof(voiceOmitureBlockRemoveNumber) != "undefined"){
												voiceOmitureBlockRemoveNumber(subId);
											}
										}
										cell.data("omnitureFlag").btnRemVal = true;
									}
									hidArchiveList.val(hidArchiveListString + "," + $thisVal);
									
									// Add the numbers to the archive list
									archiveListSelect.append($this);
								} else {
									// remove the number from the block list since it's already in the archive list
									$this.remove();
								}
							}
						});
						
						//clean up the itemListString by removing any extra commas at the start, middle and end of the string
						hidBlockListString = hidBlockListString.replace(/,+/g,",").replace(/(^,|,+$)/,"");
						hidBlockList.val(hidBlockListString);
						
						//compare lists to see if this device should be flagged as updated
						compareLists(cell);
					}
					return false;
				});

				// Bind move items from archive to block list button
				btnMoveNumber.bind("click", function(e) {
					e.preventDefault();
					var cell = detailsRow.data("cell");
					var selectedListItems = archiveListSelect.find("option:selected");
					
					if(selectedListItems.length > 0){
						var hidArchiveList = cell.find('input.hidArchiveList');
						var hidBlockList = cell.find('input.hidBlockList');
						var hidArchiveListString = hidArchiveList.val();
						var hidBlockListString = hidBlockList.val();
						var exceptionAlertFlag = false;
						
						// Update the hidden list inputs
						selectedListItems.each(function(i) {
							var $this = $(this);
							var $thisVal = $this.val();
							
							//check if this number is on the exception list
							if(preferencesFormFields.voiceBlockNumber.customValidationRule($this) == false){
								exceptionAlertFlag = true;
								$this.attr("disabled","disabled").removeAttr("selected");
								return;
							}
							
							// Remove the number from the hidden archive list input
							hidArchiveListString = hidArchiveListString.replace($thisVal,"");
							
							// Add to block list
							if(hidBlockListString === '') {
								hidBlockList.val($thisVal);
								hidBlockListString = $thisVal;
								// Add the numbers to the block list
								blockListSelect.append($this);
							} else {
								//check for duplicates before adding
								var validDevice = true;
								var blockList = hidBlockListString.split(',');
								var blockListCount = blockList.length - 1;
								var simplifiedFieldValue = $.trim($thisVal).replace(/\(|\)|\s|\.|\-/g, '');
								//save the index at which the duplicate value was found
								var i;
								
								for (i = blockListCount;validDevice && i >= 0; i--) {
									validDevice = $.trim(blockList[i]).replace(/\(|\)|\s|\.|\-/g, '') !== simplifiedFieldValue;
								}
								if(validDevice){
									/* ominture Integration for move number from archive list Added by venkat */
									if(cell.data("omnitureFlag").btnMovVal == false){
										var subId = $("#manageUserRequests td.myDeviceColumn.selected").attr("id");
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											if(typeof(voiceOmitureCallArchiveNumber) != "undefined"){
												voiceOmitureCallArchiveNumber(subId, banId);
											}
										} else {
											if(typeof(voiceOmitureCallArchiveNumber) != "undefined"){
												voiceOmitureCallArchiveNumber(subId);
											}
										}
										cell.data("omnitureFlag").btnMovVal = true;
									}
									/* end of omniture*/

									//see if the limit has been reached
									var max = cell.data("blockLimit");
									var itemListCount = blockListSelect.find("option").length;
							
									if(max <= itemListCount){
										alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.itemListLimit"));
										return false;
									} else {
										hidBlockList.val(hidBlockListString + "," + $thisVal);
										hidBlockListString = hidBlockListString + "," + $thisVal;
										// Add the numbers to the block list
										blockListSelect.append($this);
									}
								} else {
									// remove the number from the archive list since it's already in the block list
									$this.remove();
									//TODO: verify that hidBlockList is always in the same order as the <option>'s in selBlockedList
									$("#selBlockedList option:eq("+i+")").attr("selected","selected");
								}
							}
						});
						
						if(exceptionAlertFlag){
							alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.phoneNumbersUnblockable"));
						}
						
						//clean up the hidArchiveListString by removing any extra commas at the start, middle and end of the string					
						hidArchiveListString = hidArchiveListString.replace(/,+/g,",").replace(/^,/,"").replace(/,+$/,"");
						hidArchiveList.val(hidArchiveListString);
						
						//compare lists to see if this device should be flagged as updated
						compareLists(cell);
					}
					
					return false;
				});
				
				if(cells.length > 0){
					if(cells.length <= 6){
						setUpCells();
					} else {
						// Set up pagination
						$("#manageUserRequests").sortableTable({
							pagination: true,
							paginationBelow: false,
							rowsPerPage: 3,
							afterPageUpdate: function(){
								setUpCells();
							}
						});
					
						// Pagination page number click event
						$("ul.pageList li a").bind("click", function(e){
							if(closeIntercept()){
								// If user selects "OK" then remove previous page settings
								var cell = $("#manageUserRequests td.myDeviceColumn");
								$("#deviceDetailsWrapper").slideUp().removeClass("readonly");
								detailsRow.data("cell").find("div.accountPhoneBottom").removeClass("readonly");
								detailsRow.data("cell", detailsRow).appendTo($("#deviceDetailsTable"));
								
								// Remove errorText and updateText
								frmPreferences.prev().find("ul.formErrors").remove();
								frmPreferences.prev().find("div.updateMessage").remove();
								
								// Remove updated icons, error icons and ajax form data	
								cell.removeData("ajaxSuccess").removeClass("active selected restricted").find("input").remove();
								
							} else {
								e.preventDefault();
								$(this).blur();
								return false;
							}
						});
					}
				}
			}
			
			// ------------------------------- //
			// END: block text/voice messaging //
			//							       //
			// START: airave datails	       //
			// ------------------------------- //
			
			else if(frmPreferences.hasClass("airaveDetails")){
				
				//set preferencesFormFields for all tabs
				preferencesFormFields = {
					txtRestrictedDevice: {
						name: "txtRestrictedDevice",
						type: "phoneNumber",
						required: false,
						fieldLabel: Sprint.fn.getContentString("formFieldErrors.phoneFieldLabel"),
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.phoneNumberInvalid"),
						customValidationRule: function(field){
							var fieldValue = field.val();
							
							//allow instructional text to pass validation
							if(fieldValue == Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber")){
								return true;
							} else {
								return Sprint.formFieldTypes.phoneNumber.test(fieldValue);
							}
						}
					},
					txtPreferencesStreetAddress: {
						name: "txtPreferencesStreetAddress",
						type: "streetAddress",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid")
					},
					txtPreferencesStreetAddressApartment: {
						name: "txtPreferencesStreetAddressApartment",
						type: "text",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.streetApartmentDepartmentEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.streetApartmentDepartmentInvalid")
					},
					txtPreferencesUrbanization: {
						name: "txtPreferencesUrbanization",
						type: "text",
						required: false,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.addressUrbanizationEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.addressUrbanizationInvalid")
					},
					txtPreferencesCity: {
						name: "txtPreferencesCity",
						type: "city",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.cityEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.cityInvalid")
					},
					selPreferencesState: {
						name: "selPreferencesState",
						type: "select",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.stateEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.stateInvalid")
					},
					txtPreferencesZipCode: {
						name: "txtPreferencesZipCode",
						type: "zipCode",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.zipCodeInvalid")
					},
					chk911Terms: {
						name: "chk911Terms",
						type: "checkbox",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.termsOfServiceNoCheck"),
						invalidErrorMessage: Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.termsOfServiceNoCheck")
					}
				};
				
				var getTabDetails = function (tabName){
					tabName = tabName.toLowerCase();
					var getTabURL = $("#hidAiraveTabUrl").val();
					var tabSelectedContent = $("#tabsDetails div.selected");
					var macID = $("#hidMacID").val();
					var groupName = "";
					
					$.ajax({
						data: "getTab="+tabName+"&subscriberID="+subscriberID+"&userAccountID="+userAccountID+"&macID="+macID,
						dataType: "html",
						type: "POST",
						url: getTabURL,
						async: false,
						success: function(tabData){
							//append ajax HTML and setup components
							tabSelectedContent.html(tabData).setupComponents();
							
							var currentForm = tabSelectedContent.find("form");
							currentForm.data("omniture_MDNNumber_triggered",false);
							currentForm.data("omniture_CheckboxMDNNumber_triggered",false);
							currentForm.data("omniture_AccessRadioAllow_triggered",false);
							currentForm.data("omniture_AccessRadioRestricted_triggered",false);
							
							//setup validation and events for tabs
							if(tabName == "settings"){
								/* to be complete in later interation
								$("#btnManageAta").bind("click", function(e){
									e.preventDefault();
									if(closeIntercept()){
										window.location = "/global/mysprint/mypreferences";
									}
								});
								*/
							} 
							else if (tabName == "access"){
								var inputLimit = 50;
								var deviceList = $("#restrictedList input.text");
								var checkboxList = $("#restrictedList input.checkbox");
								var noDevices = true;
								for(var i=deviceList.length-1; i>=0; i--) {
									var $input = $(deviceList[i]);
									var inputName = $input.attr("name");
									var newValidationObject = Sprint.fn.cloneObject(preferencesFormFields.txtRestrictedDevice);
									newValidationObject.name = inputName;
									preferencesFormFields[inputName] = newValidationObject;
									
									if($input.val() != ""){
										noDevices = false;
									} 
									/*
									else {
										//$input.next().attr("disabled","disabled");
									}
									*/
								}
								
								// Add "Enter 10-digit Sprint phone number" text to first empty input and bind focus event
								var firstEmptyInput = $("#restrictedList input.text[value='']:first");
								var enterPhoneNumString = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber");
								
								if(firstEmptyInput.length > 0 && firstEmptyInput.val() != enterPhoneNumString){
									$("#restrictedList").data("hasInstructionalText",true);
									firstEmptyInput.val(enterPhoneNumString).css("color","#666666").bind("focus.instruction", function(){
										$("#restrictedList").data("hasInstructionalText",false);
										$(this).val("").css("color","").unbind("focus.instruction");
									});
								}
								
								deviceList.bind("keypress",function(){
									if(typeof(omniture_MDNNumber) != "undefined" && currentForm.data("omniture_MDNNumber_triggered") == false){
										omniture_MDNNumber();
										//unbind all text inputs in the restricted list so tracking isn't triggered again
										$("#restrictedList input.text").unbind("keypress");
										currentForm.data("omniture_MDNNumber_triggered",true);
									}
								});
								checkboxList.bind("click",function(){
									if(typeof(omniture_CheckboxMDNNumber) != "undefined" && currentForm.data("omniture_CheckboxMDNNumber_triggered") == false){
										omniture_CheckboxMDNNumber();
										//unbind all checkbox inputs in the restricted list so tracking isn't triggered again
										$("#restrictedList input.checkbox").unbind("click");
										currentForm.data("omniture_CheckboxMDNNumber",true);
									}
								});
								
								if($("#radRestrict").is(":checked")){
									$("#restrictedList").show();
									// turn off omniture tracking for the option that's selected
									currentForm.data("omniture_AccessRadioRestricted_triggered",false);
								} else {
									currentForm.data("omniture_AccessRadioAllow_triggered",false);
								}
								$("#radRestrict").bind("click",function(){
									$("#restrictedList").slideDown();
									if(typeof(omniture_AccessRadio) != "undefined" && currentForm.data("omniture_AccessRadioRestricted_triggered") == false){
										omniture_AccessRadio("Restricted Access");
										currentForm.data("omniture_AccessRadioRestricted_triggered",true);
									}
								});
								$("#radAllowAll").bind("click",function(){
									$("#restrictedList").slideUp();
									if(typeof(omniture_AccessRadio) != "undefined" && currentForm.data("omniture_AccessRadioAllow_triggered") == false){
										omniture_AccessRadio("Allow all");
										currentForm.data("omniture_AccessRadioAllow_triggered",true);
									}
								});
								
								if($("#restrictedList input.text").length >= inputLimit){
									$("#lnkAddMoreDevices").hide();
								}
								
								$("#lnkAddMoreDevices").bind("click",function(e){
									e.preventDefault();
									
									//add several more input form elements
									//slide down and then fade in new elements
									
									//return if limit has been reached
									if($("#restrictedList input.text").length >= inputLimit){
										return false;
									}
									
									var additionalDevices = "";
									
									var numDevicesToAdd = 10;
									for(var i = 1; i<=numDevicesToAdd; i++) {
										var deviceList = $("#restrictedList div.restrictedDevice input.text");
										var index = deviceList.length + i;
										
										//new input dom node - removed disabled="disabled" from checkbox
										var emptyDevice = $('<div class="restrictedDevice">' +
											'<input type="text" class="text" name="txtRestrictedDevice_'+index+'" id="txtRestrictedDevice_'+index+'" />' +
											'<input type="checkbox" class="checkbox" name="chkRemoveDevice_'+index+'" id="chkRemoveDevice_'+index+'" value="remove" />' +
										'</div>');
										
										//create a validation object for this input
										var inputName = "txtRestrictedDevice_"+index;
										var newValidationObject = Sprint.fn.cloneObject(preferencesFormFields.txtRestrictedDevice);
										newValidationObject.name = inputName;
										preferencesFormFields[inputName] = newValidationObject;
										
										//add our new dom elements to additionalDevices container
										if(additionalDevices.length == 0){
											additionalDevices = emptyDevice;
										} else {
											additionalDevices = additionalDevices.add(emptyDevice);
										}
									}
									
									var newTextInputs = additionalDevices.find("input.text");
									
									//bind validation to our new inputs
									newTextInputs.bind("blur",function(event){
										singleFieldValidation.call(this,event,currentForm);
									});
									
									var firstEmptyInput = $("#restrictedList input.text[value='']:first");
									//if all the inputs on the page have a value then add the instructional text to the first new text input
									if(firstEmptyInput.length == 0 && !$("#restrictedList").data("hasInstructionalText")){
										firstEmptyInput = $(newTextInputs[0]);
										$("#restrictedList").data("hasInstructionalText",true);
										firstEmptyInput.val(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber")).css("color","#666666").bind("focus.instruction", function(){
											$("#restrictedList").data("hasInstructionalText",false);
											$(this).val("").css("color","").unbind("focus.instruction");
										});
									}
									var enterPhoneNumString = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber");
								
									if(firstEmptyInput.length == 0 && firstEmptyInput.val() != enterPhoneNumString){
										firstEmptyInput.val(enterPhoneNumString).css("color","#666666").bind("focus.instruction", function(){
											$(this).val("").css("color","").unbind("focus.instruction");
										});
									}
									
									if(currentForm.data("omniture_MDNNumber_triggered") == false){
										additionalDevices.find("input.text").bind("keypress",function(){
											if(typeof(omniture_MDNNumber) != "undefined" && currentForm.data("omniture_MDNNumber_triggered") == false){
												omniture_MDNNumber();
												//unbind all text inputs in the restricted list so tracking isn't triggered again
												$("#restrictedList input.text").unbind("keypress");
												currentForm.data("omniture_MDNNumber_triggered",true);
											}
										});
									}
									
									if(currentForm.data("omniture_CheckboxMDNNumber_triggered") == false){
										additionalDevices.find("input.checkbox").bind("click",function(){
											if(typeof(omniture_CheckboxMDNNumber) != "undefined" && currentForm.data("omniture_CheckboxMDNNumber_triggered") == false){
												omniture_CheckboxMDNNumber();
												//unbind all checkbox inputs in the restricted list so tracking isn't triggered again
												$("#restrictedList input.checkbox").unbind("click");
												currentForm.data("omniture_CheckboxMDNNumber",true);
											}
										});
									}
										
									//add the empty fields to the originalFormData
									originalFormData += "&" + additionalDevices.find("input").serialize();
									
									var restrictedList = $("#restrictedList fieldset:first");
									additionalDevices.hide().appendTo(restrictedList).slideDown('normal', function(){
										//hide "add more" link if limit has been reached
										if($("#restrictedList input.text").length >= inputLimit){
											$("#lnkAddMoreDevices").hide();
										}
									});
								});
								
							} 
							else if (tabName == "services"){
								$("#selPreferencesState").bind("change",function(e){
									if ($("#selPreferencesState option:selected").val() == "PR"){
										$("#urbanization").slideDown();
										preferencesFormFields.txtPreferencesUrbanization.required = true;
									} else {
										if($("#urbanization").is(":visible")){
											$("#urbanization").slideUp();
											preferencesFormFields.txtPreferencesUrbanization.required = false;
										}
									}
								});
								
								$("#chk911Terms").bind("click",function(){
									if($(this).is(":checked")){
										$("#btnSubmitAiraveDetails").removeClass("disabled");
									} else {
										$("#btnSubmitAiraveDetails").addClass("disabled");
									}
								});
								
							} 
							else if (tabName == "zipcode"){
								
							}
							
							//set originalFormData Object
							originalFormData = tabSelectedContent.find("form").serialize();
							
							//setup text validation
							currentForm.find("input.text").bind("blur", function(event){
								var $this = $(this);
								singleFieldValidation.call(this,event,currentForm);
								if(currentForm.hasClass("airaveTabAccess")){
									if(!$this.hasClass("error") && $this.val() != "" && $this.siblings("input").attr("disabled")){
										//if there is an original value for this device then we can enable the remove checkbox
										//user cannot remove a device that is not in the originalFormData object
										var originalNumber = Sprint.fn.getURLParameter(originalFormData,$this.attr("id"));
										if(originalNumber.length > 0){
											$this.siblings("input").removeAttr("disabled");
										}
									} else if ($this.hasClass("error") && $this.val() != ""){ //removed || $this.val() == ""
										$this.siblings("input").val([]).attr("disabled","disabled");
									}
								}
							});
							
						},
						
						error: function(e){
							tabSelectedContent.html(Sprint.fn.getContentString("ajax.error") + e.status);
						}
					});
				}
				
				var currentTab = $("#hidAiraveCurrentTab").val().toLowerCase();
				var subscriberID = $("#hidSubscriberID").val();
				var userAccountID = $("#hidUserAccountID").val();
				
				//Setup the tabs
				$("#tabsDetails").tabbedContent({
					indexClass: "tabs",
					beforeSwitch: function(event){
						if(closeIntercept()){
							//dump changes and remove errors
							var frmAiraveTab = $("#manageAiraveDetails #tabsDetails div.selected form");
							$("#preferencesModal").find("ul.formErrors, label.error").remove();
							frmAiraveTab.parent().find("ul.formErrors, label.error").remove();
							frmAiraveTab.find(".error").removeClass("error");
							$("#preferencesModal").find("div.updateMessage").remove();
							if (frmAiraveTab.hasClass("airaveTabAccess")){
								//uncheck all checkboxes
								var checkboxes = $("#restrictedList input.checkbox");
								checkboxes.removeAttr("checked");
							}
							else if (frmAiraveTab.hasClass("airaveTabServices")){
								$("#chk911Terms").removeAttr("checked");
							}
							
							//restore original form data
							var dataToRestore = Sprint.fn.deserialize(originalFormData);
							for(i in dataToRestore){
								var inputByID = $("#"+i);
								if(inputByID.length > 0){
									// restore data for text inputs, serialize() replaces spaces with "+" characters, revert them back to spaces
									inputByID.val(dataToRestore[i].replace(/[\+]+/g," "));
								} else {
									// restore data for radio buttons
									var inputByName = frmAiraveTab.find("input[name="+i+"]");
									if(inputByName.length > 0){
										inputByName.each(function(){
											if($(this).val() == dataToRestore[i]){
												$(this).attr("checked","checked");
											} else {
												$(this).removeAttr("checked");
											}
										});
									}
								}
							}
						} else {
							//stop and let the user save
							return false;
						}
					},
					afterSwitch: function(){
						var selectedTab = $("#manageAiraveDetails ul.tabIndex li.selected");
						//var selectedIndex = $.inArray(selectedTab[0],$("#manageAiraveDetails ul.tabIndex li"));
						var tabContent = $("#tabsDetails div.selected");
						var tabName = selectedTab.attr("id").replace(/title/i,"").toLowerCase();
						var hidAiraveTabUrl;
						
						//Based on the tab selection ajax request should get page based on the user selection.
						if(tabName == "settings"){
							hidAiraveTabUrl = $("#hidAiraveSettingsTabUrl").val();
						} else if(tabName == "access"){
							if($("#radAllowAll").is(":checked")){
								$("#restrictedList").slideUp();
							}
							hidAiraveTabUrl = $("#hidAiraveAccessTabUrl").val();
							if($("#radRestrict").is(":checked")){
								$("#restrictedList").show();
							}
							// Add "Enter 10-digit Sprint phone number" text to first empty input and bind focus event
							var firstEmptyInput = $("#restrictedList input.text[value='Enter 10-digit Sprint phone number']:first");
							var enterPhoneNumString = Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber");
							if(firstEmptyInput.val() == enterPhoneNumString){
								firstEmptyInput.val(enterPhoneNumString).css("color","#666666").bind("focus.instruction", function(){
									$("#restrictedList").data("hasInstructionalText",false);
									$(this).val("").css("color","").unbind("focus.instruction");
								});
							}
						} else if(tabName == "services"){
							hidAiraveTabUrl = $("#hidAiraveServiceTabUrl").val();
						}  else if(tabName == "zipcode"){
							hidAiraveTabUrl = $("#hidAiraveZipCodeTabUrl").val();
						} else {
							//default tab is settings
							hidAiraveTabUrl = $("#hidAiraveSettingsTabUrl").val();
						}
						
						$("#hidAiraveTabUrl").val(hidAiraveTabUrl);
						$("#hidAiraveCurrentTab").val(tabName);
						
						//if no form in this tab then the tab has not been fetched by ajax yet
						if(tabContent.find("form").length <= 0){
							getTabDetails(tabName);
						} else {
							//ajax data has been fetched, but we still need to set the originalFormData
							originalFormData = tabContent.find("form").serialize();
						}
						
						if(tabName == "services"){
							$("#btnSubmitAiraveDetails").addClass("disabled");
							//if state = PR then show urbanization and make it required
							if ($("#selPreferencesState option:selected").val() == "PR"){
								$("#urbanization").show();
								preferencesFormFields.txtPreferencesUrbanization.required = true;
							} else {
								$("#urbanization").hide();
								preferencesFormFields.txtPreferencesUrbanization.required = false;
							}
						} else {
							$("#btnSubmitAiraveDetails").removeClass("disabled");
						}
					}
				});
				
				// scroll left nav to selected airave device for long lists
				var airaveNav = $("#prefsNav ul.airaveNav");
				var ariaveItems = airaveNav.children();
				var airaveSelected = airaveNav.find("li[class~=selected]");
				if(ariaveItems.length > 20 && airaveSelected.length > 0){
					if($.inArray(airaveSelected.get(0),ariaveItems) >= 20){
						airaveSelected.scrollTo({
							target:"#prefsNav ul.airaveNav",
							topOffset:airaveNav.offset().top + 2
						});
					}
				}
				
				//bind click event for save button
				$("#btnSubmitAiraveDetails").bind("click", {form:$("#frmPreferences")},function(e){
					if(!$(this).hasClass("disabled")){
						processPreferencesForm(e);
					}
				});
			}
			// -------------------- //
			// END: airave datails  //
			// -------------------- //
			
			else if(frmPreferences.hasClass("airaveSummary")){
				//This for redirecting the efemto page if efemto is equal to 1 added by venkat
				var hidEfemtoCount = $("#hidEfemtoList").val();
				if(hidEfemtoCount == "onlyOneEFemto"){
					window.location = $("#hidEfemtoUrl").val();
					Sprint.modal.elem.closeModal();
				}
				var hidShowMessage = $("input#hidShowMessage").val();
				var hidErrorMessage = $("input#hidErrorMessage").val();
				if(hidShowMessage == "true"){
					$("div#showAccountError").replaceWith('<div id="showAccountError" style="display:block;">'+hidErrorMessage+'</div>');
				}

				var deviceList = $("#airaveDeviceList div.airaveDeviceSummary");
				if(deviceList.length > 10){
					$("#airaveDeviceTable").sortableTable({
						pagination: true,
						paginationBelow: false,
						rowsPerPage: 10
					});
				}
			}
		}
		
			
		//This function will be called by all forms within the preferences modal framework.
		function processPreferencesForm(event) {

		/* TECH IMPLEMENTATION, keep this commented out
			//Start Omniture Transaction Tracking on saving model : Ashish
			var omniture_currentPage=$('#OmnitureTransactionVar').val();
			if(omniture_currentPage == 'ProfileSetting')
				{
					omniture_StartChangeProfileSetting="true";
					omniture_StartTrackTranaction("false","close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'PhoneChecks')
				{
					omniture_StartPhoneChecks="true";
					omniture_StartTrackTranaction("false","close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'ChangeContactInfo')
				{
					omniture_StartChangeContactInfo="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'AddAccount')
				{
					omniture_StartAddAccount="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'ManageAccounts')
				{
					omniture_StartNickname="true";
					omniture_StartTrackTranaction("false","close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'RemovePhone')
				{
					omniture_StartRemovePhone="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'EditSecuritySettings')
				{
					omniture_StartEditSecuritySettings="true";
					omniture_StartTrackTranaction("false","close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'ChangeBillDelivery')
				{
					omniture_StartChangeBillDelivery="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'VMPasscodeResetAcc')
				{
					omniture_StartUpdatePassCodeAcc="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'VMPasscodeResetSubs')
				{
					omniture_StartUpdatePassCodeSubs="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'EmailServerPasscodeReset')
                {
                        omniture_StartEmailUpdatePassCode="true";
                        omniture_StopTrackTranaction("close_txn");
                        $('#OmnitureTransactionVar').val("Blank");
                }
			else if(omniture_currentPage == 'AccountAccess')
				{
					omniture_StartAccountAccess="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'AboutYourself')
				{
					omniture_StartAboutYourself="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'AutoPay')
				{
					omniture_StartAutoPay="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'Email')
				{
					omniture_StartEmail="true";
					omniture_StartTrackTranaction("false","close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'NotiicationSettings')
				{
					omniture_StartNotiicationSettings="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'AboutDevice')
				{
					omniture_StartAboutDevice="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'ContectAccess')
				{
					omniture_StartContectAccess="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			else if(omniture_currentPage == 'WebAccess')
				{
					omniture_StartWebAccess="true";
					omniture_StopTrackTranaction("close_txn");
					$('#OmnitureTransactionVar').val("Blank");
				}
			// End Omniture Transaction Tracking on saving model
		*/
			
			event.preventDefault();
			var validForm;
			var isBlackBoxError = false;
			var frmPreferences = (event.data) ? event.data.form : $("#frmPreferences");
			
			//Get rid of any existing error messages
			$("#preferencesModal").find("ul.formErrors, label.error").remove();
			frmPreferences.parent().find("ul.formErrors, label.error").remove();
			var errorCells = frmPreferences.find("#manageUserRequests td.error:visible");
			errorCells.each(function(){
				var cell = $(this);
				disableCell(cell,"","reset");
				//flag error items with a data attribute
				cell.data("hasError",true);
			});

			frmPreferences.find(".error").removeClass("error");
			
			// Hide all special error padding for sortable tables. This allows for the inline error messages
			// to appear in the sortable table and the alignment of the sibling TDs to maintain the same
			// vertical alignment.
			$("#preferencesModal").find("td.cellErrorPadding").removeClass("cellErrorPadding");
			
			if (frmPreferences.hasClass("airaveDetails")){
				var frmAiraveTab = $("#manageAiraveDetails #tabsDetails div.selected form");
				
				//Get rid of any existing error messages in Airave Form
				frmAiraveTab.find(".error").removeClass("error");
				
				if (frmAiraveTab.serialize() == originalFormData) {
					//There are no changes, show the success message and then jump out of this function
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
					
					return;
				}
			}
			
			// Because the reset radio button is selected by default and it still needs to submit even when there isn't any change.
			// One Touch Settings should always be submitted
			if (frmPreferences.hasClass("resetVoicemailDevicePasscode") || frmPreferences.hasClass("oneTouchSettings")) {
				originalFormData = "";
			}
			
			if (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices")){
				if(frmAiraveTab.find("input:not(.checkbox), select").serialize() == originalFormData){
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
				
					return;
				}
			}

			//Check to see if there are changes or not
			if (frmPreferences.serialize() == originalFormData && errorCells.length <= 0) {
				if (frmPreferences.hasClass("accountContactInformation")) {
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessageAcntContactInfo"));
				} else if (frmPreferences.hasClass("profileSettings")){
					if(frmPreferences.find("[name='txtPreferencesUserName']").val().toLowerCase() == frmPreferences.find("[name='txtPreferencesDisplayName']").val().toLowerCase()){
						var errorMessage = Sprint.fn.getContentString("formFieldErrors.usernameMatchesDisplayname");
						showErrorMessage(errorMessage);
					}else {
						//There are no changes, show the success message and then jump out of this function
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
					}
				} else {
					//There are no changes, show the success message and then jump out of this function
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));	
				}
				frmPreferences.parent().find("ul.formSuggestions").remove();
				frmPreferences.find("label.suggestion").remove();
				return;
			}
			
			//Do some save-warning for the Manage User Profiles form (for Business users)
			if (frmPreferences.hasClass("allowOtherPeopleBusiness") || frmPreferences.hasClass("allowOtherPeople")) {
				
				//Determine which fields have changed in this form...
				var currentData = Sprint.fn.deserialize(frmPreferences.serialize());
				var dataToCheck = Sprint.fn.cloneObject(originalDataObject);
				var confirmMessage = "";
				
				//loop through the current data to see if there are additional fields that weren't in the original data - if so, add them to the dataToCheck object
				for (var key in currentData) {
					if (!dataToCheck[key]) {
					
						//Add this field to the dataToCheck object
						dataToCheck[key] = Sprint.fn.cloneObject(currentData[key]);
						
						//now, delete them from the currentData object so that it recognizes it as a changed value
						delete currentData[key];
					}
				}

				//loop through the original data to determine which fields have changed in the currentData object. If a field hasn't changed, delete it from the currentData object.
				for (var key in dataToCheck) {
				
					//If the values match, remove this field from the object to validate (this field value hasn't changed, so don't validate)
					if (currentData[key] && (dataToCheck[key] == currentData[key])) {
						//Remove the value from the dataToCheck object
						delete dataToCheck[key];
					}
					else {
						var currentRow = frmPreferences.find("[name='"+key+"']").parents("tr");
						var currentUser;
						
						if (frmPreferences.hasClass("allowOtherPeopleBusiness")) {
							currentUser = $.trim(currentRow.find("td.name a:first").text());
						}
						else if (frmPreferences.hasClass("allowOtherPeople")) {
							currentUser = $.trim(currentRow.find("td dl.summaryHeading dt").text());
						}
						
						var currentUserRole = currentRow.find("td.role");
						var deleteProfile = false;

						if (currentUserRole.find("select").length > 0) {
							if (currentUserRole.find("select").val() == "deleteProfile") {
								deleteProfile = true;
							}
							currentUserRole = $.trim(currentUserRole.find("option[value='"+currentUserRole.find("select").val()+"']").text());
						}
						else {
							currentUserRole = $.trim(currentUserRole.text());
						}
					
						if (String(key).indexOf("chkFlagged") > -1) {
							//Unflagged, show request ignored message
							confirmMessage += "- Ignore request from "+currentUser+"\n";	
						}
						else if (deleteProfile) {
							//Delete profile
							confirmMessage += "- Delete profile for "+currentUser+"\n";
						}
						else {
							//User role changed, show changed message
							confirmMessage += "- Change role for "+currentUser+" from: "+$.trim(currentRow.find("td.role select option[value='"+dataToCheck[key]+"']").text())+" to: "+currentUserRole+"\n";
						}
					}
				}
				
				if (!confirm("You are about to save the following changes:\n\n"+confirmMessage+"\nContinue?")) {
					return;
				}
			}
			
			else if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
				var validDeviceNum = {};
				var deviceNumError = {};
				var deviceValidationPath = $("#hidDeviceValidationPath").val();
				
				//var enableSnare = ($("#enableSnare").val() == "true")?true:false;
				var enableSnare = true;
				
				if (enableSnare) {
					var blackBoxValue = Sprint.getBBdata();
				} else {
					var blackBoxValue = {blackbox:"undefined"};
				}
				
				// removed blackBoxValue.finished value check - just checking that the variable is set now
				if(blackBoxValue){
					
				$('label.error[for="txtDeviceNumber"]').remove();
				//validate just the device number on client
				var validDeviceNumber = Sprint.fn.validateForm(frmPreferences, {
					txtDeviceNumber: {
						name: "txtDeviceNumber",
						type: "phoneNumber,ESN,MEID,BAN,DAC,MAC",
						required: true,
						emptyErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberEmpty"),
						invalidErrorMessage: Sprint.fn.getContentString("formFieldErrors.accountNumberInvalid")
					}
				});
				
				if (validDeviceNumber == true) {
					var fieldValue = $("#txtDeviceNumber").val();
				
					$.ajax({
						data: "validateAccountNum=true&txtDeviceNumber="+$("#txtDeviceNumber").val()+"&txtZip="+$("#txtZip").val()+"&txtPin="+$("#txtPin").val()+"&ioBlackBox="+blackBoxValue.blackbox+"&validateBlackBox=true",
						dataType: "json",
						type: "POST",
						url: deviceValidationPath,
						async: false,
						success: function(result){
							if (result.validated == false) {
									
									// When device number is DAC, show error on PIN field (CS361992)
									if (result.isDAC) {
										deviceNumError = {
											txtPin: {
												errorMessage: result.errorMessage,
												name: "txtPin"
											}
										};
									} 
									else if(result.typeMismatch){
										deviceNumError = {
											txtZip: {
												errorMessage: result.errorMessage,
												name: "txtZip"
											},
											txtPin: {
												errorMessage: result.errorMessage,
												name: "txtPin"
											}
										};
									}
									else if(result.zipError){
										deviceNumError = {
											txtZip: {
												errorMessage: result.errorMessage,
												name: "txtZip"
											}
										};
									}
									else if(result.pinError){
										deviceNumError = {
											txtPin: {
												errorMessage: result.errorMessage,
												name: "txtPin"
											}
										};
									}
									else {
										deviceNumError = {
											txtDeviceNumber: {
												errorMessage: result.errorMessage,
												name: "txtDeviceNumber"
											}
										};
								}
									isBlackBoxError = result.isBlackBoxError;
							}
								
						if(!isBlackBoxError){
							validDeviceNum = result;
									if (validDeviceNum.deviceNumType == 'dac' || validDeviceNum.isDAC) {
								preferencesFormFields.txtPin.required = false;
								preferencesFormFields.txtTaxIdNumber.required = true;
								preferencesFormFields.txtZipCode.required = true;
								if (result.validated == true) {
									if (!$("#createPin").is(".open")) {
										$("#needPinLink").trigger("click");
										
										// Force Form to NOT submit or Error check for this drawer animation
										preferencesFormFields.txtTaxIdNumber.required = false;
										preferencesFormFields.txtZipCode.required = false;
										$("#txtTaxIdNumber").val("");
										validDeviceNum.validated = false;
									}
								}
							}
							else {
								preferencesFormFields.txtPin.required = true;
								preferencesFormFields.txtTaxIdNumber.required = false;
								preferencesFormFields.txtZipCode.required = false;
							}
								}
						},
						error: Sprint.fn.ajaxError
					});
				}
				}
			}
			
			else if (frmPreferences.hasClass("resetVoicemailAccountPasscode")) {
				//Make sure at least one of the checkboxes for the number to change is checked and more than one search result is present
				if ($("#manageVoicemailAccount tbody tr").length > 1 && frmPreferences.find("input[type='checkbox']:checked").length < 1) {
					showErrorMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.resetVoicemailAccountPasscodeNoChecksChecked"));
					return;
				}
			}
			else if (frmPreferences.hasClass("communicationEmailSettings")) {
				var currentFormData = $("#frmPreferences").serialize();
				
				if(currentFormData.match(/_DARGS/)){
					currentFormData = currentFormData.substring(0, currentFormData.lastIndexOf("&_DARGS"));
				}
					
				//trim account value from currentFormData
				var currentAccount = $("#selfrmPrefSelectAccount").serialize();
				if(currentAccount != null && currentAccount != "") { // change by Pankaj Gupta
					currentFormData = currentFormData.replace("&" + currentAccount,"");
				}
					
				if(currentFormData == originalFormData){
					//There are no changes, show the success message and then jump out of this function
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
				
					return;
				}
			}
			else if (frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockTexts") || frmPreferences.hasClass("bulkBlockVoice")) {
				var updatedCells = $("#manageUserRequests td.active");
				if(updatedCells.length <= 0 && errorCells.length <= 0){
					//There are no changes, show the success message and then jump out of this function
					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
				
					return;
				}
				if(frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("bulkBlockTexts")){
					var detailsRow = $("#deviceDetailsRow");
					var currentCell = detailsRow.data("cell");
					var cellId = currentCell.attr("id");
					var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
					var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
					
					if(currentRadioSelection == "BlockSelected"){
						var currentBlockList = $.trim(currentCell.find("#hidBlockList_"+cellId+"").val());
						if(currentBlockList == ""){
							alert("Sorry! You must have at least one number in your block list in order to save a list. Enter a number or select another setting and click Save.");
							$("#radBlockSelected").scrollTo();
							$("#txtBlockNumber").focus();
							return;
						}
					}else if(currentRadioSelection == "AllowSelected"){
						var currentBlockList = $.trim(currentCell.find("#hidAllowList_"+cellId+"").val());
						if(currentBlockList == ""){
							alert("Sorry! You must have at least one number in your allow list in order to save a list. Enter a number or select another setting and click Save.");
							$("#radAllowSelected").scrollTo();
							$("#txtAllowNumber").focus();
							return;
						}
					}
				}
				if(frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockVoice")){
					var detailsRow = $("#deviceDetailsRow");
					var currentCell = detailsRow.data("cell");
					var originalRadioSelection = currentCell.find("input.hidOriginalOption").val();
					var currentRadioSelection = currentCell.find("input.hidSelectedOption").val();
					
					if(currentRadioSelection == "BlockSelected"){
						var currentBlockList = $.trim(currentCell.find("input.hidBlockList").val());
						if(currentBlockList == ""){
							alert("Sorry! You must have at least one number in your block list in order to save a list. Enter a number or select another setting and click Save.");
							$("#radBlockSelected").scrollTo();
							$("#voiceBlockNumber").focus();
							return;
						}
					}
				}
			}
			
			if (frmPreferences.hasClass("emailSettings")) {
				//force validation to run on email address
				if($("#deviceDetailsWrapper").is(":visible")){
					$("#txtCommEmail").triggerHandler("blur");
				}
				var emailError = $("#manageUserRequests td.emailError");
				
				if(emailError.length > 0){
					var errorData = {};
					emailError.each(function(){
						var hidCommEmail = $(this).find("input.hidCommEmail").val();
						var ErrorMessage = Sprint.fn.getContentString("formFieldErrors.emailAddressInvalid");
						if(hidCommEmail.length <= 0){
							ErrorMessage = Sprint.fn.getContentString("formFieldErrors.emailAddressEmpty");
						}
						var errorKey = "hidCommEmail_" + $(this).attr("id");
						errorData[errorKey] = {
							errorMessage: "",
							fieldLabel:ErrorMessage,
							name:"txtCommEmail"
						};
					});
					
					validForm = errorData;
				} else {
					//Check to see if there are changes or not after trimming floating form data
						
					var currentFormData = $("#frmPreferences").serialize();
					//var detailFormString = "&" + $("#deviceDetailsWrapper input,#deviceDetailsWrapper select").serialize();
					
					//need to extract the floating form elements from the serialized string before looking for changes
					if(currentFormData.lastIndexOf("&txtCommEmail") >= 0){
						var extractFormData = currentFormData.substring(currentFormData.lastIndexOf("&txtCommEmail"), currentFormData.lastIndexOf("&sel3rdParty=") + 17);
						if(/s$/.test(extractFormData)){
							//if the end of our string ends in "s" then the last value is false and needs the "e" added
							extractFormData += "e";
						}
					}
					
					//also need to extract quick fill checkbox input
					if(currentFormData.lastIndexOf("chkQuickFillEmail") >= 0){
						currentFormData = currentFormData.replace(/&?chkQuickFillEmail=[a-zA-Z0-9_\-\.\%]*/,"");
					}
					
					currentFormData = currentFormData.replace(extractFormData,"");
					
					//sort form data so they are compared properly
					currentFormData = sortQueryString(currentFormData);
					originalFormData = sortQueryString(originalFormData);
					if(currentFormData == originalFormData){
						//There are no changes, show the success message and then jump out of this function
						$("#chkQuickFillEmail").attr('checked', false);
						if($("#deviceDetailsWrapper").is(":visible")){
							$("#deviceDetailsRow").data("cell").trigger("click");
						}
						showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
					
						return;
					}
					validForm = true;
				}
				
			} else {
				if(!isBlackBoxError){
					//Try and validate the form			
					//Create a new object as a copy of the preferencesFormFields object, and remove any values that haven't been changed (they don't need validation)
					var dataToValidate = Sprint.fn.cloneObject(preferencesFormFields);
					// Remove need for validation from the field that's not the preferred (checked) security notifcation method.
					if (frmPreferences.hasClass("communicationEmailSettings")) {
		                if ($("#radCommunicationSecurityEmail").is(":checked"))
							delete dataToValidate["txtCommunicationSecurityText"];
		               else if ($("#radCommunicationSecurityText").is(":checked"))
							delete dataToValidate["txtCommunicationSecurityEmail"];
					}
					
					if($("#unlockAccountModule").length <= 0 || ($("#unlockAccountModule").length > 0 && $("#frmPreferences").length > 0)) {
				
						for (var key in preferencesFormFields) {
							
							//If the values match, remove this field from the object to validate (this field value hasn't changed, so don't validate)... as long as the field isn't an empty required field.
							if ((originalDataObject[preferencesFormFields[key].name] == encodeURIComponent(frmPreferences.find("[name='"+preferencesFormFields[key].name+"']").val())) && !(frmPreferences.find("[name='"+preferencesFormFields[key].name+"']").val() == "" && preferencesFormFields[key].required)) {
		
								//Remove the value from the dataToValidate object (as long as the modified flag isn't set to true and the field isn't a match field)
								if (preferencesFormFields[key].modified != true && preferencesFormFields[key].type != "match") {
									delete dataToValidate[preferencesFormFields[key].name];
								}
							}
						}
					}
					validForm = Sprint.fn.validateForm((frmAiraveTab)?frmAiraveTab:frmPreferences, dataToValidate);
				}
			}
			
			if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
				if (validDeviceNum.validated == false) {
					validForm = false;
				}
			}
			
			if (validForm == true) {

				//Start Omniture Transaction Tracking on saving model : Ashish
				var omniture_currentPage=$('#OmnitureTransactionVar').val();
				if(omniture_currentPage == 'ProfileSetting')
					{
						omniture_StartChangeProfileSetting="true";
						omniture_StartTrackTranaction("false","close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'PhoneChecks')
					{
						omniture_StartPhoneChecks="true";
						omniture_StartTrackTranaction("false","close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'ChangeContactInfo')
					{
						omniture_StartChangeContactInfo="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'AddAccount')
					{
						omniture_StartAddAccount="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'ManageAccounts')
					{
						omniture_StartNickname="true";
						omniture_StartTrackTranaction("false","close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'RemovePhone')
					{
						omniture_StartRemovePhone="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'EditSecuritySettings')
					{
						omniture_StartEditSecuritySettings="true";
						omniture_StartTrackTranaction("false","close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'ChangeBillDelivery')
					{
						omniture_StartChangeBillDelivery="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'VMPasscodeResetAcc')
					{
						omniture_StartUpdatePassCodeAcc="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'VMPasscodeResetSubs')
					{
						omniture_StartUpdatePassCodeSubs="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'AccountAccess')
					{
						omniture_StartAccountAccess="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'AboutYourself')
					{
						omniture_StartAboutYourself="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'AutoPay')
					{
						omniture_StartAutoPay="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'Email')
					{
						omniture_StartEmail="true";
						omniture_StartTrackTranaction("false","close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'NotiicationSettings')
					{
						omniture_StartNotiicationSettings="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'AboutDevice')
					{
						omniture_StartAboutDevice="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'ContectAccess')
					{
						omniture_StartContectAccess="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					}
				else if(omniture_currentPage == 'WebAccess')
					{
						omniture_StartWebAccess="true";
						omniture_StopTrackTranaction("close_txn");
						$('#OmnitureTransactionVar').val("Blank");
					} // added as part of defect fix IM24682
			
			
				
				// End Omniture Transaction Tracking on saving model

				// Variable to keep track of the removed accounts
				var removedAccts = "";
 				// My Device Specific Check
 				if (frmPreferences.hasClass("myDevice")) {
	 				var myDeviceDynamic3 = $("#myDeviceDynamic3");
	 				var fieldValue = $("input[name='radMyDeviceAttachedOption']:checked").val();
	 				
	 				if (fieldValue == "1") {
	 					// If the user chose the first radio button, there shouldn't be any changes to save.
	 					showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.noChangesToSaveMessage"));
	 					return;
	 				}
					else if (fieldValue == "2") {
						// If the user chose the second radio button, ask them to confirm if they want to remove
						// the device, if so remove the device and reload the modal. Otherwise, do nothing.
						if (!confirm('Are you sure you want to remove this device?\n\nYou won\'t have access to special sections of our site, like My device and media.')) {
							return;
						}
	 				}
	 				else if (fieldValue == "3" || ((fieldValue == undefined || fieldValue == "4") && $("#hidMyDeviceFormValidate").val() == "true")) {
	 					// Check if the current device is attached on another my sprint account. If so, get
	 					// confirmation from the user prior to attaching. If the device is not attached to
	 					// another sprint account, then allow the save.
	 					var exitValidation = false;
	 					var deviceToCheck = "&txtPhoneEsn=" + $("#txtPhoneEsn").val();
	 					if (fieldValue == "3") {
	 						deviceToCheck = "&txtNewDevice=" + $("#txtNewDevice").val();
	 					}
	 					
	 					$.ajax({
							data: "hidPreferencesFormID=myDevice&canAttachDeviceCheck=true" + deviceToCheck,
							type: "GET",
							url: frmPreferences.attr("action"),
							async: false,
							cache: false, // by sujeeth
							dataType: "json",
							success: function(data) {
								if (data.errorMessage != null) {
									frmPreferences.showFormErrors({
										errorData: {
											txtValidationCode: {
												fieldLabel: " ",
												name: "txtValidationCode",
												errorMessage: data.errorMessage
											},
											txtEsn: {
												fieldLabel: " ",
												name: "txtEsn",
												errorMessage: data.errorMessage
											}
										},
										summaryAnchor: frmPreferences.prev(),
										showInline: false,
										showSummaryPlain: true
									});
									exitValidation = true;
								}
								else if (!data.validated) {
									// We can't attach this device without confirmation to do so from the user.
									if (!confirm('Are you sure you want to switch to this device?\n\nThis device already displays for another My Sprint user. After you make this change, he/she will not be able to see it.')) {
										exitValidation = true;
									}
								} else if (data.validated) {
									if (data.redirectUrl) {
										// Close the current modal
										Sprint.modal.elem.closeModal();
										window.onbeforeunload = null;
										window.location = data.redirectUrl;
									}
								}
							},
							error: Sprint.fn.ajaxError
						});
						
						if (exitValidation) {
							return;
						}
	 				}
	 				else if ((fieldValue == undefined || fieldValue == "4") && $("#hidMyDeviceFormValidate").val() == "false") {
						var exitSave = true;
						$.ajax({
							data: "hidPreferencesFormID=myDevice&validatePhoneEsn=true&txtPhoneEsn=" + $("#txtPhoneEsn").val(),
							type: "GET",
							url: frmPreferences.attr("action"),
							async: false,
							cache: false,
							dataType: "json",
							success: function(data) {
								if (data.validated) {
									if (data.validationRequired) {
										showSuccessMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.findMyDeviceValidation"));
										
										$.get(data.responseUrl, function(content) {
											// TODO: does content need to be $(content) ?
											myDeviceDynamic3.empty().append($(content));
											
											// Update tooltip bindings
											myDeviceDynamic3.setupComponents();
											
											// Unhide the div
											myDeviceDynamic3.show();
											Sprint.modal.elem.sizeModal();
											
											// Do some validation on the form fields on tab-out
											myDeviceDynamic3.find("input.text, select").bind("blur", singleFieldValidation);
											
											// Add my device dynamic fields to data object
											myDeviceDynamic3.find("input,select").each(function () {
												originalDataObject[this.id] = this.value;
											});
											
											// Add SIM device bindings
											myDeviceDynamic3.find(".simDeviceInstructions").hide();
											myDeviceDynamic3.find("#selDeviceType").bind("change", function() {							
												var currentValue = $(this).val();
												// Show the appropriate instructions:
												myDeviceDynamic3.find(".simDeviceInstructions").hide();
												myDeviceDynamic3.find("#simInstructions" + currentValue).slideDown();
											});
											
											// Set the form access to be validate the next time
											$("#hidMyDeviceFormValidate").val("true");
											
											// Update the object data for this field
											originalDataObject["txtPhoneEsn"] = $("#txtPhoneEsn").val();
											
											// Resend validation code
											$("#resendCode").unbind("click").bind("click", function(event) {
												event.preventDefault();
												$.ajax({
													data: "ajax=true&resendValidation=true",
													type: "GET",
													url: $(this).attr("href"),
													async: false,
													cache: false, //by sujeeth
													dataType: "json",
													success: function(data) {
														// Remove error/success messages
														frmPreferences.prev().find(".updateMessage").remove();
														frmPreferences.prev().find(".formErrors").remove();
															
														if (data.validated) {
															showSuccessMessage(data.responseMessage);
														} else {
															
															frmPreferences.showFormErrors({
																errorData: {
																	hidMyDeviceFormValidate: {
																		name: "hidMyDeviceFormValidate",
																		errorMessage: data.errorMessage
																	}
																},
																summaryAnchor: frmPreferences.prev(),
																scrollToSummary: false,
																showInline: false
															});
														}
													},
													error: Sprint.fn.ajaxError
												});
											});
										});
									} else {
										exitSave = false;
									}
								}
								else {
									//Remove success messages
									frmPreferences.prev().find(".updateMessage").remove();
									
									//Form has errors, show messages.
									frmPreferences.showFormErrors({
										errorData: {
											txtPhoneEsn: {
												name: "txtPhoneEsn",
												errorMessage: data.errorMessage
											}
										},
										summaryAnchor: frmPreferences.prev(),
										scrollToSummary: false
									});
								}
							},
							error: Sprint.fn.ajaxError
						});
						
						if (exitSave) {
							// We don't want the current save event to occur since the dynamic content
							// was just loaded and they need to be filled in by the user.
							return;
						}
					}
				} 
				// GT: Loyalty anniversary phone field validation
				else if (frmPreferences.hasClass("anniversaryGift")) {

					var frmPreferencesContainer = frmPreferences.parent(".containerThreeColumnRt");
					var dataToSend = "hasAnniversaryPhoneNumber=false";
					var giftType=document.getElementsByName("annivGift");

									
					if (frmPreferences.find("input#rad25Bonus").is(":checked")) {
						dataToSend = "hasAnniversaryPhoneNumber=true"+"&"+"annivGift="+frmPreferences.find("input#rad25Bonus").val()+"&phoneNumber="+ frmPreferences.find("input#txtAnniversaryPhoneNumber").val();
						}
					else if (frmPreferences.find("input#rad5Credit").is(":checked")) {
						dataToSend = dataToSend+"&"+"annivGift="+frmPreferences.find("input#rad5Credit").val();
					} 
					
					var ajaxValidated = true;
				
					$.ajax({
						data: dataToSend,
						type: "POST",
						url: frmPreferences.find("#anniversaryGiftAction").val(),
						dataType: "json",
						async: false,
						success: function(data) {
							if (data.validated) {							
								$.ajax({
									url: data.responseUrl,
									dataType: "html",
									success: function(dataRes) {
										frmPreferencesContainer.empty().html(dataRes);
										var frmConfirm25 = $("#frmPreferences");
										var confirmBt = frmConfirm25.find("#btn25AnniversaryConfirm");
										var backBt = frmConfirm25.find("#btn25AnniversaryBack");
										
										confirmBt.createHighResButtons();
										backBt.createHighResButtons();
										
										confirmBt.bind("click", function(event) {
											event.preventDefault();
											var frmConfirm25Action = $("#frmPreferences");
											$.ajax({	
												url: frmConfirm25Action.find("#anniversaryConfirmGiftAction").val(),
												dataType: "json",
                                                async: false,
												success: function(data25Confirm) {
													   if(data25Confirm.validated)
													      {
														      $.ajax({
														                url: data25Confirm.responseUrl,
																		dataType: "html",
																		success: function(dataRes) 
																	    { 	 
																				frmPreferencesContainer.empty().html(dataRes);
																		}
																	});
														  }
														 else if(!data25Confirm.validated)
													       {
															   // $('#btn25AnniversaryBack').removeClass("error");
                                                               // var errorContainerConfirm = '<label class="error" for="btn25AnniversaryBack">'+data25Confirm.errorMessage+'</label>';
															   //$('#btn25AnniversaryBack').addClass('error').parent().after(errorContainerConfirm);
													       } 
                                                    
                                    										
												},
												error: Sprint.fn.ajaxError
											});
										});
																		
									},
									error: Sprint.fn.ajaxError
								});
							}
							else if(!data.validated){
								frmPreferences.showFormErrors({
									errorData:
										{
											txtAnniversaryPhoneNumber: {
												name: "txtAnniversaryPhoneNumber",
												errorMessage: data.errorMessage
											}
										},
									showSummary: false,
									showInline: true,
									showSummaryPlain: false
								});
								//var errorContainer = '<label class="error" for="txtAnniversaryPhoneNumber">'+data.errorMessage+'</label>';
								//$('#txtAnniversaryPhoneNumber').addClass('error').parent().after(errorContainer);
								$('#btnSubmitPreferencesModal_disabled').remove();
								$('#btnSubmitPreferencesModal').show();
								ajaxValidated = false;
							}
						},
						error: Sprint.fn.ajaxError
					});
					if(!ajaxValidated){
						//exit out of form save function
						return;
					}
				}
				else if (frmPreferences.hasClass("manageAccounts")) {
					var removeItems = $("#frmPreferences").find("td.remove > input:checked");
					if (removeItems.length > 0) {
						// Remove success/error messages
						frmPreferences.prev().find(".updateMessage").remove();
						
						if (!confirm(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.removeAccountsCheck"))) {
							return;
						}
						
						// Remove all rows that were checked for removal
						removeItems.each(function() {
							if (removedAccts != "") {
								removedAccts += ",";
							}
							removedAccts += $(this).parent().parent().attr("id");
							$(this).parent().parent().remove();
						});
						removedAccts = "&removedAccounts=" + removedAccts;
						
						// If the signin radio button that was checked is removed, check the first one
						// on the list.
						if (frmPreferences.find("input[name='signin_request']:checked").length == 0) {
							frmPreferences.find("input[name='signin_request']:first").attr("checked", "checked");
						}
						
						/* Custom string sort function that will sort a string normally, but have empty values appear last (instead of first with the normal array.sort() function) */
						var customStringSort = function (a, b) {
							if (a[0] == "" && b[0] == "") {
								//If both elements are equal
								return 0;
							}
							else if (a[0] != "" && b[0] == "") {
								//a[0] has characters, and b[0] does not. A should come first...
								return -1;
							}
							else if (a[0] == "" && b[0] != "") {
								//b[0] has characters, and a[0] does not. B should come first...
								return 1;
							}
							else {
								//both a[0] and b[0] have characters and are not equal, do a normal sort.
								return (a[0] > b[0])?1:(a[0] < b[0])?-1:0;
							}
						}
					
						// Recreate the sortable table
						$("#manageUserRequests").sortableTable({
							reverseSort: true,
							pagination: true,
							paginationBelow: false,
							rowsPerPage: 8,
							excludeColumns: [3, 4],
							columnValueFunctions: [
								function(cell) {
									return cell.find("input").val();
								},
								function(cell) {
									return cell.text();
								},
								function(cell) {
									return cell.text();
								}
							],
							customSortFunctions: [
								customStringSort,
								customStringSort,
								customStringSort					
							],
							beforeSort: function() {
							
								//Check to see if changes have been made to the form data already, if so, reset the dataChanged variable to true
								if (originalFormData != frmPreferences.serialize()) {
									dataChanged = true;
								}
							},
							afterSort: function() {
							
								//If the data didn't change at all before the table got re-sorted, re-set the originalFormData variable to reflect the new sort order.
								if (!dataChanged) {
									originalFormData = frmPreferences.serialize();
								}
							}
						});
					}
				}
				var frmPreferencesData = frmPreferences.serialize()+removedAccts+"&btnSubmitPreferencesModal="+frmPreferences.find("#btnSubmitPreferencesModal_original").val(); //Must include the form's button value in order to work with ATG
				var frmPreferencesURL = frmPreferences.attr("action");
				var submittedSubscIDs = ''; // omniture code for Email & Sprint notifications model : Pankaj Gupta
				
				// omniture code for my deivces :Start: Ashish
				if ($("#txtNewDevice").val() != undefined) {
					var omniture_subValue="txtNewPhoneSubID"+$("#txtNewDevice").val();
					if(document.getElementById(omniture_subValue) !=  undefined)
					{
						var omniture_subID=document.getElementById(omniture_subValue).value;
						if(document.getElementById("selSelectAccount") != undefined){
							var omniture_selectAcc=document.getElementById("selSelectAccount").value;
							if(omniture_subID != "") {
								if (typeof(Analytics) !== "undefined") {
									Analytics.eCareATG.trackTransactions("About Device","Complete",omniture_subID,omniture_selectAcc);
								}
							}
						}
					}
				}
				// omniture code for my deivces :Start: Ashish
				
				//only submit the devices that have been updated for email settings
				if (frmPreferences.hasClass("emailSettings")) {
					frmPreferencesData = "";
					var cells = $("#manageUserRequests td.myDeviceColumn");
					cells.each(function(){
						var cell = $(this);
						if (cell.hasClass("active") || cell.hasClass("serverError")){
							frmPreferencesData += "&" + cell.find("input.hidCommEmail").serialize();
							frmPreferencesData += "&" + cell.find("input.hidCommOptions").serialize();
							
							if(submittedSubscIDs != '') {
								submittedSubscIDs += ',';
							}
							submittedSubscIDs += cell.attr('id');
						}
					});
					frmPreferencesData += "&hidPreferencesFormID="+$("#hidPreferencesFormID").val()+"&btnSubmitPreferencesModal="+frmPreferences.find("#btnSubmitPreferencesModal_original").val(); //Must include the form's button value in order to work with ATG
					
					// omniture code for Email & Sprint notifications model :Start: Pankaj Gupta
					if (typeof(Analytics) !== "undefined") {
						Analytics.eCareATG.trackTransactions("Email & Sprint notifications","Complete",submittedSubscIDs,$("#currentAccountNumber").val());
					}
					// omniture code for Email & Sprint notifications model :End: Pankaj Gupta
				}
				else if(frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("bulkBlockTexts")){
					frmPreferencesData = "";
					var cells = $("#manageUserRequests td.myDeviceColumn:visible:not(.readonly)");
					var cellIDs = "";
					cells.each(function(i){
						var cell = $(this);
						var cellId = cell.attr("id");
						if(cell.data("hotlined") != true && cell.data("suspended") != true && (cell.hasClass("active") || cell.data("hasError"))){
							
							if(cellIDs != ""){
								cellIDs += ",";
							}
							cellIDs += cell.attr("id");
							
							if(cell.data("hasError")){
								//remove hasError flag
								cell.removeData("hasError");
							} else {
	
								var hidOriginalOpt = cell.find("input.hidOriginalOption");
								var hidSelectedOpt = cell.find("input.hidSelectedOption");
								frmPreferencesData += "&" + hidOriginalOpt.serialize() + "&" + hidSelectedOpt.serialize();
								frmPreferencesData += "&mdn_" + cellId + "=" + $("#mdn_"+cellId+"").val();
								if(hidSelectedOpt.val() == "BlockSelected"){
									frmPreferencesData += "&hidItemList_"+cellId+"="+$("#hidBlockList_"+cellId+"").val();
								}else if(hidSelectedOpt.val() == "AllowSelected"){
									frmPreferencesData += "&hidItemList_"+cellId+"="+$("#hidAllowList_"+cellId+"").val();
								}
								
								if($("#status_"+cellId+"").length > 0){
									frmPreferencesData += "&status_" +cellId+ "="+$("#status_"+cellId+"").val();
								}	
								
							}
						}
					});
					/* Omniture for save button action in  block text  settings added by Venkat */
					var subIds = cellIDs.split(",");
					var subIdLen = subIds.length;
					var subscriberId = cellIDs;
					if(subIdLen > 1){
						subscriberId = 'Multiple';
					}

					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
						if(typeof(textMessageStartTrackTransactions) != "undefined"){
							textMessageStartTrackTransactions(subscriberId, banId);
						}
					} else {
					    if(typeof(textMessageStartTrackTransactions) != "undefined"){
							textMessageStartTrackTransactions(subscriberId);
						}
					}
					frmPreferencesData += "&hidPreferencesFormID="+$("#hidPreferencesFormID").val() + "&subscriberIDs=" + cellIDs;
				} 
				else if(frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockVoice")){
					//only sending data for devices that are not readonly/disabled, hotlined, or suspended
					frmPreferencesData = "";
					var cells = $("#manageUserRequests td.myDeviceColumn:visible:not(.readonly)");
					var cellIDs = "";
					cells.each(function(i){
						var cell = $(this);
						var cellId = cell.attr("id");
						
						if(cell.data("hotlined") != true && cell.data("suspended") != true && (cell.hasClass("active") || cell.data("hasError"))){
							
							if(cellIDs != ""){
								cellIDs += ",";
							}
							cellIDs += cell.attr("id");
							
							if(cell.data("hasError")){
								//remove hasError flag
								cell.removeData("hasError");
							} else {
								var hidOriginalOpt = cell.find("input.hidOriginalOption");
								var hidSelectedOpt = cell.find("input.hidSelectedOption");
								
								if(hidSelectedOpt.val() == "BlockSelected"){
									
									var hidBlockList = cell.find("input.hidBlockList");
									if(hidBlockList.val().length <= 0){
										frmPreferencesData += "&removedAllNumbers_" + cellId +"=true"; 
									}
									
									//create an "added" and "removed" list based on original value compairison to current val
									var originalListData = cell.data("originalItemList");
									var removedList = "";
									var origRemainingList = "";
									var exceptionNumbers = "";
									
									if(originalListData && originalListData.length > 0){
									
										var origNumbersArray = cell.data("originalItemList").split(",");
										var addedList = cell.find("input.hidBlockList").val();
										var loopLength = origNumbersArray.length;
										
										for (var i=0; i<loopLength; i++) {
											var origNum = origNumbersArray[i];
											
											if(addedList.match(origNum)){
												//remove any original list numbers from the block list so we're left with just newly added numbers
												addedList = addedList.replace(origNum,"");
												
												//put the matched original number into a new list to compare to the exception list later
												if(origRemainingList == ""){
													origRemainingList = origNum;
												} else {
													origRemainingList += ","+origNum;
												}
												
											} else {
												//if the original number cannot be found in the block list then it's been removed. Add it to the removed list
												if(removedList == ""){
													removedList = origNum;
												} else {
													removedList += ","+origNum;
												}
											}
										}
										
										//check the remaining original block list numbers to see if they appear in the exception list and save them to a new list
										if(origRemainingList.length > 0){
											var origRemainingArray = origRemainingList.split(",");
											var origRemainingLength = origRemainingArray.length;
											var exceptionList = cell.find("input.hidExceptionList").val();
											
											for (var i=0; i<origRemainingLength; i++) {
												var origRemainingNum = origRemainingArray[i];
												if(exceptionList.match(origRemainingNum)){
													if(exceptionNumbers == ""){
														exceptionNumbers = origRemainingNum;
													} else {
														exceptionNumbers += ","+origRemainingNum;
													}
												}
											}
										}
										
										//clean up the itemListString by removing any extra commas at the start, middle and end of the string
										addedList = addedList.replace(/,+/g,",").replace(/^,/,"").replace(/,+$/,"");
										
									}
									else {
										var addedList = cell.find("input.hidBlockList").val();
									}
									
									//add hidden inputs except for hidExceptionList which won't change
									frmPreferencesData += "&hidRemovedNumbers_" + cellId + "=" + removedList.replace(/\(|\)|\s|\.|\-/g, '') + 
														  "&hidAddedNumbers_" + cellId + "=" + addedList.replace(/\(|\)|\s|\.|\-/g, '') +
														  "&hidExceptionNumbers_" + cellId + "=" + exceptionNumbers.replace(/\(|\)|\s|\.|\-/g, '') +
														  "&" + hidOriginalOpt.serialize() + "&" + hidSelectedOpt.serialize();
								} else {
									//only add the original option and the selected option values
									frmPreferencesData += "&" + hidOriginalOpt.serialize() + "&" + hidSelectedOpt.serialize();
								}
								// add mdn number to all active cells being submitted
								frmPreferencesData += "&mdn_" + cellId + "=" + cell.find("div.deviceNumber").text();
								if($("#status_"+cellId+"").length > 0){
									frmPreferencesData += "&status_" +cellId+ "="+$("#status_"+cellId+"").val();
								}
							}
						}
					});
					/* Omniture for save button action in  block voice  settings added by Venkat */
					var subIds = cellIDs.split(",");
					var subIdLen = subIds.length;
					var subscriberId = cellIDs;
					if(subIdLen > 1){
						subscriberId = 'Multiple';
					}

					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
						if(typeof(voiceControlStartTrackTransactions) != "undefined"){
							voiceControlStartTrackTransactions(subscriberId, banId);
						}
					} else {
						if(typeof(voiceControlStartTrackTransactions) != "undefined"){
							voiceControlStartTrackTransactions(subscriberId);
						}
					}

					frmPreferencesData += "&hidPreferencesFormID="+$("#hidPreferencesFormID").val() + "&subscriberIDs=" + cellIDs;
				}
				// Submit only the device that has updated one touch settings
				else if (frmPreferences.hasClass("oneTouchSettings")) {
					/* Omniture for ontouch button action in  oneTouch settings added by Venkat */
					var cellId = $("#manageUserRequests td.selected").find('input.hidSubscriberID').val();
					var onTouchVal = $("#manageUserRequests td.selected").find('input.hidCommOptions').val();
					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
						if(onTouchVal == "btnSubmitOneTouchOff"){
							if(typeof(oneTouchOFFStartTrackTransactions) != "undefined"){
								oneTouchOFFStartTrackTransactions(cellId, banId);
							}
						}
						else if(onTouchVal == "btnSubmitOneTouchOn"){
							if(typeof(oneTouchONStartTrackTransactions) != "undefined"){
								oneTouchONStartTrackTransactions(cellId, banId);
							}
						}
					} else {
						if(onTouchVal == "btnSubmitOneTouchOff"){
							if(typeof(oneTouchOFFStartTrackTransactions) != "undefined"){
								oneTouchOFFStartTrackTransactions(cellId);
							}
						}
						else if(onTouchVal == "btnSubmitOneTouchOn"){
							if(typeof(oneTouchONStartTrackTransactions) != "undefined"){
								oneTouchONStartTrackTransactions(cellId);
							}
						}
					}
					var hidCommInput 			= $("#manageUserRequests td.selected").find('input.hidCommOptions');
					var hidDeviceCommInputVal	= hidCommInput.serialize();
					var hidSubscriberInput		= $("#manageUserRequests td.selected").find('input.hidSubscriberID')
					var hidSubscriberInputVal	= hidSubscriberInput.serialize();
					
					
					frmPreferencesData = hidSubscriberInputVal;
					frmPreferencesData += '&' + hidDeviceCommInputVal;
					frmPreferencesData += "&hidPreferencesFormID=" + $("#hidPreferencesFormID").val();
				}
				
				else if(frmAiraveTab){
					var airaveData;
					if(frmAiraveTab.hasClass("airaveTabAccess")){
						//filter data to only submit the inputs that have been updated or checked
						//TODO: filter out duplicate values?
						var prevTextInput; //used to cache text input when executing the filter method below
						var updatedInputs = $("#restrictedList input.text, #restrictedList input.checkbox");
						/* removed filter that returns only items that have been updated. Instead we submit all form data.
						.filter(function(index){
							
							var $input = $(this);
							if($input.is(":checked") && !$input.attr("disabled") && prevTextInput.val() != ""){
								
								return true;
							}
							
							if ($input.hasClass("text")){
								prevTextInput = $input;
								var originalNumber = Sprint.fn.getURLParameter(originalFormData,$input.attr("id"));
								if ($input.val() != originalNumber && originalNumber != undefined){
									return true;
								}
							}
						});
						*/
						
						airaveData = updatedInputs.serialize().replace(/\(|\)|\s|\.|\-/g, '') + "&" + $("input[name=radAccountAccess]").serialize();
					} else {
						airaveData = frmAiraveTab.serialize();
					}
					frmPreferencesURL = frmAiraveTab.attr("action");
					frmPreferencesData = airaveData+"&hidPreferencesFormID="+$("#hidPreferencesFormID").val()+"&airaveTab="+frmAiraveTab.attr("class"); // don't know if btnSubmitPreferencesModal_original is actually needed in airave
				}
				// Add MDN numbers for block permissions
				else if(frmPreferences.hasClass("blockPermissions")){
					//frmPreferencesData = "";
					var cells = $("#manageUserRequests td.active");
					cells.each(function(){
						var cell = $(this);
						frmPreferencesData += "&mdn_"+ cell.attr("id") +"="+ cell.find("div.deviceNumber").text();
					});

					/* Omniture for save button action in  block permissions  settings added by Venkat */
					var txtBlockedPhones = $("#txtBlockedPhones").val();
					var subIds = txtBlockedPhones.split(",");
					var subIdLen = subIds.length;
					var subscriberId = '';
					if(subIdLen > 1){
						subscriberId = 'Multiple';
					} else {
						var splitSubId = txtBlockedPhones.split(":");
						subscriberId = splitSubId[0];
					}

					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");

						if(typeof(permissionStartTrackTransactions) != "undefined"){
							permissionStartTrackTransactions(subscriberId, banId);
						}
					} else {
						
						if(typeof(permissionStartTrackTransactions) != "undefined"){
							permissionStartTrackTransactions(subscriberId);
						}
					}
				} else if(frmPreferences.hasClass("blockPictureMail")){
					/* Omniture for save button action in  block picture mail  settings added by Venkat */
					var txtBlockedPhones = $("#txtBlockedPhones").val();
					var subIds = txtBlockedPhones.split(",");
					var subIdLen = subIds.length;
					var subscriberId = '';
					if(subIdLen > 1){
						subscriberId = 'Multiple';
					} else {
						var splitSubId = txtBlockedPhones.split(":");
						subscriberId = splitSubId[0];
					}

					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");

						if(typeof(pictureMailStartTrackTransactions) != "undefined"){
							pictureMailStartTrackTransactions(subscriberId, banId);
						}
					} else {
						
						if(typeof(pictureMailStartTrackTransactions) != "undefined"){
							pictureMailStartTrackTransactions(subscriberId);
						}
					}
				
				} else if(frmPreferences.hasClass("blockDataAccess")){

					/* Omniture for save button action in  block data Access  settings added by Venkat */
					var txtBlockedPhones = $("#txtBlockedPhones").val();
					var subIds = txtBlockedPhones.split(",");
					var subIdLen = subIds.length;
					var subscriberId = '';
					if(subIdLen > 1){
						subscriberId = 'Multiple';
					} else {
						var splitSubId = txtBlockedPhones.split(":");
						subscriberId = splitSubId[0];
					}

					if($("#selfrmPrefSelectAccount").length > 0){
						var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
						var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
						if(typeof(dataAccessStartTrackTransactions) != "undefined"){
							dataAccessStartTrackTransactions(subscriberId, banId);
						}
					} else {
						if(typeof(dataAccessStartTrackTransactions) != "undefined"){
							dataAccessStartTrackTransactions(subscriberId);
						}
					}
				
				} 
				var bulkfrmPreferences = $("form#bulkfrmPreferences");
				if(bulkfrmPreferences.hasClass("subscriberStatus")){
					frmPreferencesData = '';
					var bulkCntrl = bulkfrmPreferences.find("input#hidPreferencesFormID").val();
					var selectedOption = bulkfrmPreferences.find("input.hidSelectedOption").val()
					
					frmPreferencesData += "hidPreferencesFormID="+bulkCntrl+"&subscriberIDs="+$("input#hidSubscriberlist").val()+"&"+$("input.hidSelectedOption, input.hidMdnNum, #hidBanSelectAll").serialize()+"&hidBulkActiveCount="+$("#hid_SubscriberCount").val()+"&banNumber="+$("input#hidBanNumber").val()+"&nodeID="+$("input#hidnodeID").val();
					if(bulkCntrl == "bulkVoiceControl"){
						if(selectedOption == "BLOCKLIST"){
							frmPreferencesData += "&hidItemList="+$("input#hidBlockList").val();
						}
					} else if(bulkCntrl == "bulkTextControl"){
						if(selectedOption == "BLOCKLIST" || selectedOption == "ALLOWLIST"){
							frmPreferencesData += "&"+$("input#hidItemList").serialize();
						}
					}
				}
				
								//disable the save button as to avoid multiple requests for all my preference modal save actions
				//grab the high rez anchor save button
				var prefSaveBtn = $("#btnSubmitPreferencesModal");
				var disabledPrefSaveBtn;
				if (!prefSaveBtn.hasClass("disabled")){
					//clone it and disable the button only if not disabled
					disabledPrefSaveBtn = prefSaveBtn.clone().attr({"id":"btnSubmitPreferencesModal_disabled","href":"javascript:void(0)"});
					//hide the save button and add the disabled button to the DOM as a sibling
					prefSaveBtn.hide().after(disabledPrefSaveBtn);
					//show the disabled button and set the value of the internal span to saving
					disabledPrefSaveBtn.addClass("disabled").find("span span span span").text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.saving"));
				}
				
				
				//DO AJAX CALL TO SAVE PREFERENCES...
				$.ajax({
					data: frmPreferencesData,
					type: "POST",
					url: frmPreferencesURL,
					dataType: "json",
					async: false,
					success: function(data) {
						if (data.validated) {
							// make sure showSuccessMessage isn't called for certain modal
							if (frmPreferences.hasClass("blockDigitalMedia") || frmPreferences.hasClass("blockWebAccess")) {
							
								var selectedCells = $("#manageUserRequests td.myDeviceColumn div.accountPhoneContent:visible");
								selectedCells.each(function(){

									var checkIcon = $(this);
									var cell = checkIcon.parent();
									
									if(cell.data("isBlocked") == true){
										//toggle unblocked items that have been selected
										cell.addClass("blocked").addClass("active").data("isBlocked",true);
										
										cell.find('.currentAccountPhone').html("" +
										"<img src=\"/global/images/icons/ico_blocked.gif\" alt=\"Blocked Device\" />" + 
										"<br />Blocked");
										
									} else {
										cell.find("div.currentAccountPhone").remove();
										//toggle blocked items that have been selected
										cell.removeClass("blocked").removeClass("active").data("isBlocked",false);
									}
									//cell.removeClass("active");
									
									//clear block phone list
									//$("#txtBlockedPhones").val("");
								});
							} else	if (!frmPreferences.hasClass("anniversaryGift") && !frmPreferences.hasClass("emailSettings") && !frmPreferences.hasClass("blockTexts") && !frmPreferences.hasClass("addNewAccountDL")) {
								if(frmPreferences.hasClass("oneTouchSettings")){
									var cellId = hidSubscriberInput.val()
									/* Omniture for ontouch button action in  onTouch settings added by Venkat */
									var cellId = $("#manageUserRequests td.selected").find('input.hidSubscriberID').val();
									var onTouchVal = $("#manageUserRequests td.selected").find('input.hidCommOptions').val();
									if($("#selfrmPrefSelectAccount").length > 0){
										var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
										var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
										if(onTouchVal == "btnSubmitOneTouchOff"){
											if(typeof(oneTouchOFFStartTrackTransactions) != "undefined"){
												oneTouchOFFEndTrackTransactions(cellId, banId);
											}
										}
										else if(onTouchVal == "btnSubmitOneTouchOn"){
											if(typeof(oneTouchONStartTrackTransactions) != "undefined"){
												oneTouchONEndTrackTransactions(cellId, banId);
											}
										}
									} else {
										if(onTouchVal == "btnSubmitOneTouchOff"){
											if(typeof(oneTouchOFFStartTrackTransactions) != "undefined"){
												oneTouchOFFEndTrackTransactions(cellId);
											}
										}
										else if(onTouchVal == "btnSubmitOneTouchOn"){
											if(typeof(oneTouchONStartTrackTransactions) != "undefined"){
												oneTouchONEndTrackTransactions(cellId);
											}
										}
									}
								} else if(frmPreferences.hasClass("blockPictureMail")){
										/* Omniture for save button action in  block picture mail  settings added by Venkat */
										var txtBlockedPhones = $("#txtBlockedPhones").val();
										var subIds = txtBlockedPhones.split(",");
										var subIdLen = subIds.length;
										var subscriberId = '';
										if(subIdLen > 1){
											subscriberId = 'Multiple';
										} else {
											var splitSubId = txtBlockedPhones.split(":");
											subscriberId = splitSubId[0];
										}
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");

											if(typeof(pictureMailEndTrackTransactions) != "undefined"){
												pictureMailEndTrackTransactions(subscriberId, banId);
											}
										} else {

											if(typeof(pictureMailEndTrackTransactions) != "undefined"){
												pictureMailEndTrackTransactions(subscriberId);
											}
										}
								} else if(frmPreferences.hasClass("blockDataAccess")){
										/* Omniture for save button action in  block data Access  settings added by Venkat */
										var txtBlockedPhones = $("#txtBlockedPhones").val();
										var subIds = txtBlockedPhones.split(",");
										var subIdLen = subIds.length;
										var subscriberId = '';
										if(subIdLen > 1){
											subscriberId = 'Multiple';
										} else {
											var splitSubId = txtBlockedPhones.split(":");
											subscriberId = splitSubId[0];
										}
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");

											if(typeof(dataAccessEndTrackTransactions) != "undefined"){
												dataAccessEndTrackTransactions(subscriberId, banId);
											}
										} else {
											if(typeof(dataAccessEndTrackTransactions) != "undefined"){
												dataAccessEndTrackTransactions(subscriberId);
											}
										}
								} else if(frmPreferences.hasClass("blockPermissions")){
										/* Omniture for save button action in  block permssions  settings added by Venkat */
										var txtBlockedPhones = $("#txtBlockedPhones").val();
										var subIds = txtBlockedPhones.split(",");
										var subIdLen = subIds.length;
										var subscriberId = '';
										if(subIdLen > 1){
											subscriberId = 'Multiple';
										} else {
											var splitSubId = txtBlockedPhones.split(":");
											subscriberId = splitSubId[0];
										}
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");

											if(typeof(permissionEndTrackTransactions) != "undefined"){
												permissionEndTrackTransactions(subscriberId, banId);
											}
										} else {
											if(typeof(permissionEndTrackTransactions) != "undefined"){
												permissionEndTrackTransactions(subscriberId);
											}
										}
								}
								showSuccessMessage(data.responseMessage);
							}
							
							// Ensures that any form suggestions gets cleared
							if (frmPreferences.hasClass("accountContactInformation") || (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices"))) {
								var form = frmPreferences.hasClass("accountContactInformation") ? frmPreferences : frmAiraveTab;
								frmPreferences.parent().find("ul.formSuggestions").remove();
								form.find("label.suggestion").remove();
							}
							
							if (frmPreferences.hasClass("emailSettings") || frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockTexts") || frmPreferences.hasClass("bulkBlockVoice")){
								// close any open drawers, set class to default
								if($("#deviceDetailsWrapper").is(":visible")){
									$("#deviceDetailsRow").data("cell").trigger("click");
								}
								
								var $drawerRow = $("#deviceDetailsRow");
								$drawerRow.data("cell", $drawerRow);
								
								var cells = $("#manageUserRequests td.myDeviceColumn:visible");
								cells.removeClass("active selected serverError");
							}
							
							
							// My Phone and Media Confirmation Modal
							if (frmPreferences.hasClass("myDevice") && data.responseUrl) {
								Sprint.modal.elem.closeModal();
								launchPreferencesModal(data.responseUrl);
								
								// Re-size the modal
								$("#preferencesModal").width(300);
								Sprint.modal.elem.sizeModal();
								
								// The Enter key should close the modal then redirect the user
								$(document).bind("keydown", function(event) {
									if (event.keyCode == 13) {
										$("a.closeModal").click();
									}
								});	
								
								return;
							}
							
							// GT: Have to make sure showSuccessMessage isn't called for the anniversary gift modal
							if (!frmPreferences.hasClass("anniversaryGift") && !frmPreferences.hasClass("emailSettings") && !frmPreferences.hasClass("addNewAccountDL")) {
								showSuccessMessage(data.responseMessage);
							}
							
							if (frmPreferences.hasClass("emailSettings")){
							
								//close any open drawers, set class to default
								if($("#deviceDetailsWrapper").is(":visible")){
									$("#deviceDetailsRow").data("cell").trigger("click");
								}
								
								var $drawerRow = $("#deviceDetailsRow");
								$drawerRow.data("cell", $drawerRow);
								
								var cells = $("#manageUserRequests td.myDeviceColumn:visible");
								cells.removeClass("active selected serverError");
								
								if(data.responseMessage && !data.deviceErrors){
									omniture_EmailSprintnotifications="true";
									omniture_StartTrackTranaction("false","close_txn");
									$('#OmnitureTransactionVar').val("Blank");
					
									showSuccessMessage(data.responseMessage);
								} else {
									//hide success message
									frmPreferences.prev().find(".updateMessage").remove();
									
									//Create error message for devices
									if(data.deviceErrors){
										var errorNum = data.deviceErrors.length;
										var serverErrorObj = {};
										for (var error in data.deviceErrors) {
											serverErrorObj[error] = {
												name: error,
												errorMessage: data.deviceErrors[error].errorMessage
											}
										}
										frmPreferences.showFormErrors({
											errorData: serverErrorObj,
											summaryAnchor: frmPreferences.prev(),
											showInline: false,
											showSummaryPlain: true,
											scrollToSummary: true
										});
										
										//rebind the error message click event
										var errorMsg = $("#preferencesModal ul.formErrors li a");
										errorMsg.each(function(i){
											var errorId = $(this).attr("href").replace(/^.{0,}#/,"");
											var subscriberId = data.deviceErrors[errorId].subscriberId;
											var errorCell = $("#" + subscriberId);
											updateCell(errorCell,"serverError");
										}).unbind("click").die("click").bind("click",function(e){
											e.preventDefault();
											
											//extract subscriber ID from the href link 
											var errorId = $(this).attr("href").replace(/^#/,"");
											var subscriberId = data.deviceErrors[errorId].subscriberId;
											var errorCell = $("#" + subscriberId);
											var parentRow = errorCell.parent();
											
											if(parentRow.css("display") == "none"){
												var allRows = $("#manageUserRequests > tbody > tr:not(#deviceDetailsRow)");
												var rowIndex = $.inArray(parentRow.get(0),allRows) + 1;
												var pageIndex = Math.ceil(rowIndex/5) - 1;
												var pageList = $("ul.pageList li:not(.pagePrev,.pageNext)");
												pageList.eq(pageIndex).find("a").trigger("click");
											}
											
											if(errorCell.is(".selected")){
												errorCell.scrollTo();
											} else {
												if($("#deviceDetailsWrapper").css("display") == "none"){
													errorCell.trigger("click");
													errorCell.animate({left: 0}, 500,function(){
														errorCell.scrollTo();
													});
												} else {
													errorCell.trigger("click");
													errorCell.animate({left: 0}, 1000,function(){
														errorCell.scrollTo();
													});
												}
											}
										});
									}
								}
							}
							
							// Ensures that any form suggestions gets cleared
							if (frmPreferences.hasClass("accountContactInformation") || (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices"))) {
								var form = frmPreferences.hasClass("accountContactInformation") ? frmPreferences : frmAiraveTab;
								frmPreferences.parent().find("ul.formSuggestions").remove();
								form.find("label.suggestion").remove();
							}
								
							//If we're on the Account PIN page, re-set the PIN field to masked-mode (if it's not masked).
							if (frmPreferences.hasClass("accountPIN")) {
								if (frmPreferences.find("#txtPreferencesAccountPIN").attr("type") == "text") {
									frmPreferences.find("#revealAccountPIN a").trigger("click");
								}
							}
							// END Merged from 10.4
							
							//If we're on the Manage User Profiles page (for business users), clear the flagged rows that have been ignored and delete rows for profiles that have been deleted.
							else if (frmPreferences.hasClass("allowOtherPeopleBusiness")) {
								var manageUserRequests = frmPreferences.find("#manageUserRequests");
								manageUserRequests.find("tr.ignored td.flag").empty();
								manageUserRequests.find("tr").each(function() {
									var thisRow = $(this);
									var thisRowSelectID = thisRow.find("td.role select").attr("id");
								
									if (thisRow.find("td.role select").val() == "deleteProfile") {
										thisRow.remove();
									}
									else if (thisRowSelectID && thisRow.find("td.role select").val() != originalDataObject[thisRowSelectID]) {
										//this row role value has changed, clear this row's flag (also clear the "requiresAttention" class)
										thisRow.find("td.flag").empty();
										thisRow.removeClass("requiresAttention");
									}
								});
								
								if (manageUserRequests.data("resetPagination")) {
									manageUserRequests.data("resetPagination")();
									//Go to the current page if it still exists... if not, go to the last page
									if (manageUserRequests.data("currentPage") > manageUserRequests.data("totalPages")) {
										//Go to the last page
										manageUserRequests.data("switchToPage")(manageUserRequests.data("totalPages"));
									}
									else {
										//Switch to current page
										manageUserRequests.data("switchToPage")(manageUserRequests.data("currentPage"))
									}
								}
							}
							
							//If we're on the Manage User Profiles page (for consumers), clear the flagged rows that have been ignored
							else if (frmPreferences.hasClass("allowOtherPeople")) {
								var manageRequests = frmPreferences.find("#manageRequests");
								
								manageRequests.find("tr.ignored td.flag").empty();
								manageRequests.find("tr.ignored td label.check").remove();
								manageRequests.find("tr").each(function() {
									var thisRow = $(this);
									var thisRowSelectID = thisRow.find("td.role select").attr("id");
									
									if (thisRow.find("td.role select").val() == "deleteProfile") {
										thisRow.remove();
									}
									else if (thisRowSelectID && thisRow.find("td.role select").val() != originalDataObject[thisRowSelectID]) {
										//this row role value has changed, clear this row's flag & ignore checkbox (also clear the "requiresAttention" class)
										thisRow.find("td.flag").empty();
										thisRow.find("td label.check").remove();
										thisRow.removeClass("requiresAttention");
									}
								});
								
								if (manageRequests.data("resetPagination")) {
									manageRequests.data("resetPagination")();
									//Go to the current page if it still exists... if not, go to the last page
									if (manageRequests.data("currentPage") > manageRequests.data("totalPages")) {
										//Go to the last page
										manageRequests.data("switchToPage")(manageRequests.data("totalPages"));
									}
									else {
										//Switch to current page
										manageRequests.data("switchToPage")(manageRequests.data("currentPage"))
									}
								}
							}
							
							//If we're on the "Reset Voicemail Passcode" page, un-check any checkboxes on save, and clear out passcode fields.
							else if (frmPreferences.hasClass("resetVoicemailAccountPasscode")) {
								$("#manageVoicemailAccounts input[type='checkbox']").removeAttr("checked");
								$("#changePasscode").find("input[type='text'], input[type='password']").val("");
							}
							
							else if (frmPreferences.hasClass("blockDataAccess") || frmPreferences.hasClass("blockPictureMail") || frmPreferences.hasClass("blockPermissions")) {
								var selectedCells = $("#manageUserRequests td.myDeviceColumn div.accountPhoneSelected:visible");
								selectedCells.each(function(){
									var checkIcon = $(this);
									var cell = checkIcon.parent();
									if(cell.data("isBlocked") == true){
										//toggle blocked items that have been selected
										cell.removeClass("blocked").data("isBlocked",false);
									} else {
										//toggle unblocked items that have been selected
										cell.addClass("blocked").data("isBlocked",true);
									}
									cell.removeClass("active");
									
									//clear block phone list
									$("#txtBlockedPhones").val("");
								});
							}
							else if (frmPreferences.hasClass("emailSettings")){
								
								// create success message or error summary
								if(data.responseMessage && !data.deviceErrors){
									showSuccessMessage(data.responseMessage);
								} else {
									//remove success message
									frmPreferences.prev().find(".updateMessage").remove();
									
									//Create error message for devices
									if(data.deviceErrors){
										var errorNum = data.deviceErrors.length;
										var serverErrorObj = {};
										for (var error in data.deviceErrors) {
											serverErrorObj[error] = {
												name: error,
												errorMessage: data.deviceErrors[error].errorMessage
											}
										}
										frmPreferences.showFormErrors({
											errorData: serverErrorObj,
											summaryAnchor: frmPreferences.prev(),
											showInline: false,
											showSummaryPlain: true,
											scrollToSummary: true
										});
										
										//rebind the error message click event
										var errorMsg = $("#preferencesModal ul.formErrors li a");
										errorMsg.each(function(i){
											var errorId = $(this).attr("href").replace(/^.{0,}#/,"");
											var subscriberId = data.deviceErrors[errorId].subscriberId;
											var errorCell = $("#" + subscriberId);
											updateCell(errorCell,"serverError");
										}).unbind("click").die("click").bind("click",function(e){
											e.preventDefault();
											
											//extract subscriber ID from the href link 
											var errorId = $(this).attr("href").replace(/^#/,"");
											var subscriberId = data.deviceErrors[errorId].subscriberId;
											var errorCell = $("#" + subscriberId);
											var parentRow = errorCell.parent();
											
											if(parentRow.css("display") == "none"){
												var allRows = $("#manageUserRequests > tbody > tr:not(#deviceDetailsRow)");
												var rowIndex = $.inArray(parentRow.get(0),allRows) + 1;
												var pageIndex = Math.ceil(rowIndex/5) - 1;
												var pageList = $("ul.pageList li:not(.pagePrev,.pageNext)");
												pageList.eq(pageIndex).find("a").trigger("click");
											}
											
											if(errorCell.is(".selected")){
												errorCell.scrollTo();
											} else {
												if($("#deviceDetailsWrapper").css("display") == "none"){
													errorCell.trigger("click");
													errorCell.animate({left: 0}, 500,function(){
														errorCell.scrollTo();
													});
												} else {
													errorCell.trigger("click");
													errorCell.animate({left: 0}, 1000,function(){
														errorCell.scrollTo();
													});
												}
											}
										});
									}
								}
							}else if (frmPreferences.hasClass("communicationEmailPassword")){
								if(data.responseMessage && !data.deviceErrors){
									omniture_StartEmailUpdatePassCode="true";
									omniture_StopTrackTranaction("close_txn");
									$('#OmnitureTransactionVar').val("Blank");
									showSuccessMessage(data.responseMessage);
								} 
							}
							
							// Ensures that any form suggestions gets cleared
							if (frmPreferences.hasClass("accountContactInformation") || (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices"))) {
								var form = frmPreferences.hasClass("accountContactInformation") ? frmPreferences : frmAiraveTab;
								frmPreferences.parent().find("ul.formSuggestions").remove();
								form.find("label.suggestion").remove();
							}
								
							//If we're on the Account PIN page, re-set the PIN field to masked-mode (if it's not masked).
							if (frmPreferences.hasClass("accountPIN")) {
								if (frmPreferences.find("#txtPreferencesAccountPIN").attr("type") == "text") {
									frmPreferences.find("#revealAccountPIN a").trigger("click");
								}
							}
							//If we're on the Manage User Profiles page (for business users), clear the flagged rows that have been ignored and delete rows for profiles that have been deleted.
							else if (frmPreferences.hasClass("allowOtherPeopleBusiness")) {
								var manageUserRequests = frmPreferences.find("#manageUserRequests");
								manageUserRequests.find("tr.ignored td.flag").empty();
								manageUserRequests.find("tr").each(function() {
									var thisRow = $(this);
									var thisRowSelectID = thisRow.find("td.role select").attr("id");
								
									if (thisRow.find("td.role select").val() == "deleteProfile") {
										thisRow.remove();
									}
									else if (thisRowSelectID && thisRow.find("td.role select").val() != originalDataObject[thisRowSelectID]) {
										//this row role value has changed, clear this row's flag (also clear the "requiresAttention" class)
										thisRow.find("td.flag").empty();
										thisRow.removeClass("requiresAttention");
									}
								});
								
								if (manageUserRequests.data("resetPagination")) {
									manageUserRequests.data("resetPagination")();
									//Go to the current page if it still exists... if not, go to the last page
									if (manageUserRequests.data("currentPage") > manageUserRequests.data("totalPages")) {
										//Go to the last page
										manageUserRequests.data("switchToPage")(manageUserRequests.data("totalPages"));
									}
									else {
										//Switch to current page
										manageUserRequests.data("switchToPage")(manageUserRequests.data("currentPage"))
									}
								}
							}
							//If we're on the Manage User Profiles page (for consumers), clear the flagged rows that have been ignored
							else if (frmPreferences.hasClass("allowOtherPeople")) {
								var manageRequests = frmPreferences.find("#manageRequests");
								
								manageRequests.find("tr.ignored td.flag").empty();
								manageRequests.find("tr.ignored td label.check").remove();
								manageRequests.find("tr").each(function() {
									var thisRow = $(this);
									var thisRowSelectID = thisRow.find("td.role select").attr("id");
									
									if (thisRow.find("td.role select").val() == "deleteProfile") {
										thisRow.remove();
									}
									else if (thisRowSelectID && thisRow.find("td.role select").val() != originalDataObject[thisRowSelectID]) {
										//this row role value has changed, clear this row's flag & ignore checkbox (also clear the "requiresAttention" class)
										thisRow.find("td.flag").empty();
										thisRow.find("td label.check").remove();
										thisRow.removeClass("requiresAttention");
									}
								});
								
								if (manageRequests.data("resetPagination")) {
									manageRequests.data("resetPagination")();
									//Go to the current page if it still exists... if not, go to the last page
									if (manageRequests.data("currentPage") > manageRequests.data("totalPages")) {
										//Go to the last page
										manageRequests.data("switchToPage")(manageRequests.data("totalPages"));
									}
									else {
										//Switch to current page
										manageRequests.data("switchToPage")(manageRequests.data("currentPage"))
									}
								}
							
							}
							//If we're on the "Reset Voicemail Passcode" page, un-check any checkboxes on save, and clear out passcode fields.
							else if (frmPreferences.hasClass("resetVoicemailAccountPasscode")) {
								$("#manageVoicemailAccounts input[type='checkbox']").removeAttr("checked");
								$("#changePasscode").find("input[type='text'], input[type='password']").val("");
							}
							
							else if (frmPreferences.hasClass("blockDataAccess") || frmPreferences.hasClass("blockPictureMail") || frmPreferences.hasClass("blockPermissions")) {
								var selectedCells = $("#manageUserRequests td.myDeviceColumn div.accountPhoneSelected:visible");
								selectedCells.each(function(){
									var checkIcon = $(this);
									var cell = checkIcon.parent();
									if(cell.data("isBlocked") == true){
										//toggle blocked items that have been selected
										cell.removeClass("blocked").data("isBlocked",false);
									} else {
										//toggle unblocked items that have been selected
										cell.addClass("blocked").data("isBlocked",true);
									}
									cell.removeClass("active");
									
									//clear block phone list
									$("#txtBlockedPhones").val("");
								})
							}
							// END Merged from 10.4
							else if (frmPreferences.hasClass("emailSettings")){
								// uncheck quick fill checkbox
								$("#chkQuickFillEmail").attr('checked', false);
								
								//update hidden input data for all cells on page
								var cells = $("#manageUserRequests td.myDeviceColumn:visible");
								cells.each(function(){
									var cell = $(this);
									var $thisEmail = cell.find("input.hidCommEmail");
									var $thisOrigEmail = cell.data("originalEmail");
									var $thisCommOptions = cell.find("input.hidCommOptions");
										
									if(cell.data("originalEmail") != undefined){
										//if email was removed
										if($thisOrigEmail.length > 0 && $thisEmail.val().length == 0){
											//add warning message
											showWarningMessage(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.removedEmailAddressesWarning"));
										}
										
										//set original data to current value
										if($thisEmail.length > 0 && $thisEmail.hasClass("error") == false){
											cell.data("originalEmail",$thisEmail.val());
											//$thisEmail.remove();
										}
									}
										
									if(cell.data("originalOptions") != undefined){
										if($thisCommOptions.length > 0 && $thisCommOptions.hasClass("error") == false){
											var optionsArrayString = $thisCommOptions.val();
											var optionsArray = optionsArrayString.split(",");
											cell.data("originalOptions",optionsArray);
											//$thisCommOptions.remove();
										}
									}
								});
							} else if(frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("bulkBlockTexts")){
								// create success message or error summary
								if(data.responseMessage && !data.deviceErrors){
									if(frmPreferences.hasClass("bulkBlockTexts")){
										if($("#selfrmPrefSelectAccount").length > 0){
											var accountNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var accountId = accountNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											
											if(typeof(bulkTextsMessageEndTrackTransactions) != "undefined"){
												bulkTextsMessageEndTrackTransactions(accountId);
											}
										}
									
									} else {
										/* Omniture for save button action in  block text  settings added by Venkat */
										var subIds = cellIDs.split(",");
										var subIdLen = subIds.length;
										var subscriberId = cellIDs;
										if(subIdLen > 1){
											subscriberId = 'Multiple';
										}

										if($("#selfrmPrefSelectAccount").length > 0){
											
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											
											if(typeof(textMessageEndTrackTransactions) != "undefined"){
												textMessageEndTrackTransactions(subscriberId, banId);
											}
										} else {
											
										   if(typeof(textMessageEndTrackTransactions) != "undefined"){
												textMessageEndTrackTransactions(subscriberId);
											}
										}
									}
									showSuccessMessage(data.responseMessage);
								} else {
									showErrorMessage(data.responseMessage);
									
									for (var error in data.deviceErrors) {
										var thisError = data.deviceErrors[error];
										var cell = $("#" + thisError.subscriberId);
										updateCell(cell,"serverError");
										
										//add tooltip to cell
										if(thisError.errorMessage){
											cell.attr("tooltipCustom",thisError.errorMessage);
											cell.tooltip();
										}
										//revert the selected option back to the original but don't clear any stored item lists
										cell.find("input.hidSelectedOption").val(cell.find("input.hidOriginalOption").val());
									}
								}
								
								if(data.devices && data.devices.length > 0){
									//TODO: reverse loop may execute faster, cache device length to var
									for (var i=0; i<data.devices.length; i++) {
										var cell = $("#" + data.devices[i].subscriberID);
										if(cell.data("hotlined") != true && cell.data("suspended") != true){
											var hidOriginalOpt = cell.find("input.hidOriginalOption");
											var hidSelectedOpt = cell.find("input.hidSelectedOption");
											var hidOriginalOptVal = hidOriginalOpt.val();
											var hidSelectedOptVal = hidSelectedOpt.val();

											if(hidSelectedOptVal == "BlockSelected"){
												var hidItemList = cell.find("hidBlockList_"+cellId+"");
											} else if(hidSelectedOptVal == "AllowSelected"){
												var hidItemList = cell.find("#hidAllowList_"+cellId+"");
											} else{
												var hidItemList = cell.find("input.hidItemList");
											}

											if(data.devices[i].error){
												//add error to cell
												if(!cell.hasClass("readonly")){
													disableCell(cell,data.devices[i].errorMessage,"error");
												}
												hidOriginalOpt.val("");
												hidSelectedOpt.val("");
												hidItemList.val("");
											}
											//if (the submitted value is not equal to the original value AND the value submitted is different from returned value) OR 
											//   (the original value is the same as the submitted value AND the original value is different from returned value) OR
											//   (there is no submitted value AND there is no original value AND there is a returned value)
											// then update cell option
											
											/* why the monster condition?
											else if((hidSelectedOptVal != hidOriginalOptVal && hidSelectedOptVal != data.devices[i].selectedOption) || 
													(hidOriginalOptVal == hidSelectedOptVal && hidOriginalOptVal != data.devices[i].selectedOption) || 
													(hidSelectedOptVal == undefined && hidOriginalOptVal == undefined && data.devices[i].selectedOption != undefined)){
														
												hidOriginalOpt.val(data.devices[i].selectedOption);
												hidSelectedOpt.val(data.devices[i].selectedOption);
												if(data.devices[i].selectedOption && data.devices[i].selectedOption != "BlockNone"){
													cell.addClass("restricted");
												} else {
													cell.removeClass("restricted");
												}
											}
											*/
											else {
												hidOriginalOpt.val(data.devices[i].selectedOption);
												hidSelectedOpt.val(data.devices[i].selectedOption);
												if(data.devices[i].selectedOption && data.devices[i].selectedOption != "BlockNone"){
													cell.addClass("restricted");
												} else {
													cell.removeClass("restricted");
												}
											}
											
											//TODO: sort the lists before comparing strings???
											//This is commented for one of the account control gating defect 418714
											/*if(!data.devices[i].error && hidItemList.val() != data.devices[i].itemList){
												//update list values
												if(data.devices[i].itemList == undefined){
													hidItemList.val("")
												} else {
													hidItemList.val(data.devices[i].itemList);
												}
											}*/
										}
									}
								}
							}
							else if(frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockVoice")){
								// create success message or error summary
								if(data.responseMessage && !data.deviceErrors){
									if(frmPreferences.hasClass("bulkBlockVoice")){
										if($("#selfrmPrefSelectAccount").length > 0){
											var accountNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var accountId = accountNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											
											if(typeof(bulkVoiceMessageEndTrackTransactions) != "undefined"){
												bulkVoiceMessageEndTrackTransactions(accountId);
											}
										}
									
									}else{
										/* Omniture for save button action in  block voice  settings added by Venkat */
										var subIds = cellIDs.split(",");
										var subIdLen = subIds.length;
										var subscriberId = cellIDs;
										if(subIdLen > 1){
											subscriberId = 'Multiple';
										}
										
										if($("#selfrmPrefSelectAccount").length > 0){
											var banNum = $("select#selfrmPrefSelectAccount option:selected").text();
											var banId = banNum.replace(/([A-Z0-9_\.\-\s]*\(|\)$)/ig,"");
											if(typeof(voiceControlEndTrackTransactions) != "undefined"){
												voiceControlEndTrackTransactions(subscriberId, banId);
											}
										} else {
										   if(typeof(voiceControlEndTrackTransactions) != "undefined"){
												voiceControlEndTrackTransactions(subscriberId);
											}
										}
									}
									showSuccessMessage(data.responseMessage);
								} else {
									showErrorMessage(data.responseMessage);
									
									for (var error in data.deviceErrors) {
										var thisError = data.deviceErrors[error];
										var cell = $("#" + thisError.subscriberId);
										updateCell(cell,"serverError");
										
										//add tooltip to cell
										if(thisError.errorMessage){
											cell.attr("tooltipCustom",thisError.errorMessage);
											cell.tooltip();
										}
										//revert the selected option back to the original but don't clear any stored item lists
										cell.find("input.hidSelectedOption").val(cell.find("input.hidOriginalOption").val());
									}
								}
								if(data.devices && data.devices.length > 0){
									//TODO: reverse loop may execute faster, cache device length to var
									for (var i=0; i<data.devices.length; i++) {
										var cell = $("#" + data.devices[i].subscriberID);
										var hidOriginalOpt = cell.find("input.hidOriginalOption");
										var hidSelectedOpt = cell.find("input.hidSelectedOption");
										var hidOriginalOptVal = hidOriginalOpt.val();
										var hidSelectedOptVal = hidSelectedOpt.val();
										
										if(data.devices[i].error){
											//add error to cell
											if(!cell.hasClass("readonly")){
												disableCell(cell,data.devices[i].errorMessage,"error");
												//cell.data("ajaxSuccess",false);
											}
											hidOriginalOpt.val("");
											hidSelectedOpt.val("");
										}
										//if (the submitted value is not equal to the original value AND the value submitted is different from returned value) OR 
										//   (the original value is the same as the submitted value AND the original value is different from returned value) OR
										//   (there is no submitted value AND there is no original value AND there is a returned value)
										// then update cell option
										/*
										else if((hidSelectedOptVal != hidOriginalOptVal && hidSelectedOptVal != data.devices[i].selectedOption) || 
												(hidOriginalOptVal == hidSelectedOptVal && hidOriginalOptVal != data.devices[i].selectedOption) || 
												(hidSelectedOptVal == undefined && hidOriginalOptVal == undefined && data.devices[i].selectedOption != undefined)){
													
											hidOriginalOpt.val(data.devices[i].selectedOption);
											hidSelectedOpt.val(data.devices[i].selectedOption);
											if(data.devices[i].selectedOption && data.devices[i].selectedOption != "BlockNone"){
												cell.addClass("restricted");
											} else {
												cell.removeClass("restricted");
											}
										}
										*/
										else {
											hidOriginalOpt.val(data.devices[i].selectedOption);
											hidSelectedOpt.val(data.devices[i].selectedOption);
											if(data.devices[i].selectedOption && data.devices[i].selectedOption != "BlockNone"){
												cell.addClass("restricted");
											} else {
												cell.removeClass("restricted");
											}
											
											//clear ajax success so we can retrieve a fresh itemlist when drawer is expanded
											cell.data('ajaxSuccess', false);
											//remove the originalItemList so that it'll be re-cached
											cell.removeData("originalItemList");
										}
									}
								}
							}
							else if (frmAiraveTab && frmAiraveTab.hasClass("airaveTabSettings")) {
								//trigger omniture tracking on save with no errors
								if(typeof(omniture_StopTrackTransaction) != "undefined"){
									omniture_StopTrackTransaction();
								}
							}
							
							else if (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices")) {
								//trigger omniture tracking on save with no errors
								if(typeof(omniture_911AddressTab_confirm) != "undefined"){
									omniture_911AddressTab_confirm();
								}
								$("#chk911Terms").removeAttr("checked");
								$("#btnSubmitAiraveDetails").addClass("disabled");
								//alert(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.confirmValidAddress"));
								alert($("#ServiceAddressConfirmValidAddress").val());
							}
							
							else if (frmAiraveTab && frmAiraveTab.hasClass("airaveTabAccess")) {
								//remove devices that were checked
								var removeNumbers = $("#restrictedList input.checkbox:checked");
								removeNumbers.val([]).prev().val(""); //removed .attr("disabled","disabled")
								
								//sort our column so that inputs with values are at the top of the list
								var restrictedList = $("#restrictedList input.text");
								var emptySpot = $("#restrictedList input.text[value=]:first");
								var inputLimit = 50;
								
								if(emptySpot.length > 0){
									
									//find where the empty spot is in our collection
									var emptyIndex;
									$.grep(restrictedList,function(n,i){
										if (n == emptySpot.get(0)){
											emptyIndex = i;
										}
									});
									
									//move the inputs with values up the list
									var emptySpotEl = emptySpot.get(0);
									restrictedList.each(function(i){
										$input = $(this);
										//empty this input if it's equal to the instructional text
										if($input.val() == Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber")){
											$input.val("").css("color","").unbind("focus.instruction");
										}
										if($input.val().length > 0){
											if(emptyIndex < i){
												emptySpot.val($input.val());
												$input.val("");
												emptySpot = $("#restrictedList input.text[value=]:first");
											} 
										}
									});
								}
								
								var emptyInputs = "";
								var txtPhoneNumbers = $("#restrictedList div.restrictedDevice").filter(function(i){
									var $input = $(this).children("input.text");
									
									if($input.val().length > 0){
										return true;
									} else {
										if(emptyInputs.length <= 0){
											emptyInputs = $(this);
										} else {
											emptyInputs = emptyInputs.add(this);
										}
									}
								});
								
								var availableInputs = 10-(txtPhoneNumbers.length%10);
								
								if(emptyInputs.length > availableInputs){
									//trim excess empty inputs
									emptyInputs.not(":lt("+availableInputs+")").remove();
								}
								
								if(availableInputs > 0){
									//add instruction text to the first available empty input
									$(emptyInputs[0]).find("input.text").val(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber")).css("color","#666666").bind("focus.instruction", function(){
										$this = $(this);
										if($this.val() == Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.enterPhoneNumber")){
											$this.val("").css("color","").unbind("focus.instruction");
										}
									});
								}
								
								if($("#restrictedList input.text").length < inputLimit){
										$("#lnkAddMoreDevices").show();
								}
							}
							
							
							//reset the originalFormData variable to contain the new data that has just been saved
							if(frmPreferences.hasClass("airaveDetails")){
								originalFormData = frmAiraveTab.serialize();
							} 
							else if (frmPreferences.hasClass("emailSettings")){
								//only serialize visible inputs without disabled or error class
								var cells = $("#manageUserRequests td.myDeviceColumn:visible:not(.disabled,.error)");
								cells.removeData("prevEmailVal");
								originalFormData = $("#frmPreferences input").filter(function(index){
									$this = $(this);
									$parentCell = $this.parent();
									if($this.hasClass("hidCommEmail")){
										$parentCell.data("originalEmail",$this.val());
									}
									if($parentCell.hasClass("error disabled") == false && $this.attr("id") != "txtCommEmail"){
										return true;
									}
								});
								originalFormData=sortQueryString(originalFormData.serialize());
							}
							else if (frmPreferences.hasClass("communicationEmailSettings")){
								var currentFormData = $("#frmPreferences").serialize();
				
								if(currentFormData.match(/_DARGS/)){
									currentFormData = currentFormData.substring(0, currentFormData.lastIndexOf("&_DARGS"));
									 // change by Pankaj Gupta starts here
									var accountVal = $("#selfrmPrefSelectAccount").serialize();
									if (accountVal != "") {
										currentFormData = currentFormData.replace("&" + accountVal,"");
									}
									 // change by Pankaj Gupta ends here
								}
								
								originalFormData = currentFormData;
							}
							else {
								originalFormData = frmPreferences.serialize();
							}
							
							originalDataObject = Sprint.fn.deserialize(originalFormData);
							
							//Make sure the page knows that we've saved some preference changes.
							preferencesChangedAndSaved = true;
							
							//reset the onbeforeunload function
							window.onbeforeunload = null;
							
							// My Device Specific Check
							if (frmPreferences.hasClass("myDevice")) {
				 				var fieldValue = $("input[name='radMyDeviceAttachedOption']:checked").val();
				 				
				 				if (fieldValue == "2" || fieldValue == "3" || fieldValue == "4" || !fieldValue) {
				 					// Close the modal without reloading the parent page, then trigger a click to open the modal
				 					Sprint.modal.elem.closeModal();
				 					$("#devicesOnMyAccountLink").trigger("click");
				 				}
			 				}
			 				else if (frmPreferences.hasClass("manageAccounts")) {
			 					// If all the accounts were removed, close the modal and reload the landing page.
			 					if ($("#manageAccountsTableBody").find("tr").length == 0) {
				 					$("#modalHolder a.closeModal").trigger("click");
				 					location.reload(true);
				 				}
			 				}
							// if we're attaching a new account
							else if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL")) {
								//clear all the values so user can attach another account
								$("#txtDeviceNumber").val("");
								$("#txtPin").val("");
								$("#txtZip").val("");		
								$("#txtNickname").val("");
								$("#txtTaxIdNumber2, #txtTaxIdNumber4, #txtZipCode").val('');
								originalFormData = frmPreferences.serialize();
								originalDataObject = Sprint.fn.deserialize(originalFormData);
								
								if (frmPreferences.hasClass("addNewAccountDL")) {
									var frmPreferencesContainer = frmPreferences.parent(".containerThreeColumnRt");
									$.ajax({
										url: data.responseUrl,
										dataType: "html",
										success: function(dataRes) {	

											frmPreferencesContainer.empty().html(dataRes).setupComponents();

											var frmConfirm = $("#frmPreferences");
											var continueAddAccountBt = frmConfirm.find("#btnContinueAddAccount");

										},
										error: Sprint.fn.ajaxError
									});
								}
			 				}
							// if we're unlocking an account
							else if ($("#unlockAccountModule").length > 0 && $("#modalHolder").length == 0){
								location.reload(true);
			 				}
							
							if (bulkfrmPreferences.hasClass("subscriberStatus")){
								if(data.responseMessage && !data.deviceErrors){
									
									var accountId = $("input#hidBanNumber").val();
									var accCntrl = $("#hid_accFilter").val();
									if(typeof(bulkAccountStatusEndTrackTransactions) != "undefined"){
										bulkAccountStatusEndTrackTransactions(accCntrl, accountId);
									}
									showSuccessMessage(data.responseMessage);
									var bulkCntrl = bulkfrmPreferences.find("input#hidPreferencesFormID").val();
									$("div.editLink").remove();
									$("div#bulkListControl input[type='radio']").attr("disabled","disabled");
									if(bulkCntrl == "bulkVoiceControl"){
										$("div#blockSelectedWrapper").css({'opacity':'0.2'});
										$("div.buttons a").addClass("disabled");
									} else if(bulkCntrl == "bulkTextControl"){
										$("div#blockSelectedWrapper").css({'opacity':'0.2'});
										$("div#allowSelectedWrapper").css({'opacity':'0.2'});
										$("div.buttons a").addClass("disabled");
									}
									$("a#btnBulkListSave").removeClass('disabled').addClass('closeModal').removeAttr('id').find('span span span span').html('Done');									
									$("#accntCntrolSubsList a.closeModal").unbind("click").bind("click", function(event) {
										//Close the current modal
										if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
											TeaLeaf.Client.tlAddEvent(event);
										}
										Sprint.modal.elem.closeModal();

									});
								} else {
									showErrorMessage(data.responseMessage);
								}				
							}
			
						}
						else if (!data.validated) {
							frmPreferences.prev().find(".updateMessage").remove();
							
							if (frmPreferences.hasClass("blockDigitalMedia") || frmPreferences.hasClass("blockWebAccess")) {
								var errorDevices = data.errors.error.split(",");
								var numOfErrors  = errorDevices.length;
								for (var i = 0; i < numOfErrors; i++) {
									var eDevice = frmPreferences.find("#" + errorDevices[i]);
									
									// If it was already selected, then deselect it.
									if (eDevice.hasClass("active")) {
										eDevice.trigger("click");
									}
									
									// Disable the device and show it's error state
									eDevice.addClass("disabled").prepend( "<div class=\"currentAccountPhone\">" +
										"<img src=\"/global/images/icons/ico_error_sml.gif\" alt=\"Errorneous Device\" /></div>");
								}
								
								//Remove success messages
								frmPreferences.prev().find(".updateMessage").remove();
								
								//Form has errors, show messages.
								frmPreferences.showFormErrors({
									errorData:
										{
											txtBlockedPhones: {
												name: "txtBlockedPhones",
												errorMessage: data.errors.errorMessage
											}
										},
									summaryAnchor: frmPreferences.prev(),
									scrollToSummary: true,
									showInline: false,
									showSummaryPlain: true
								});
							}
							// GT: Address validation
							else if (frmPreferences.hasClass("accountContactInformation") || (frmAiraveTab && frmAiraveTab.hasClass("airaveTabServices"))) {
								var form = frmPreferences.hasClass("accountContactInformation") ? frmPreferences : frmAiraveTab;
								
								frmPreferences.parent().find(".updateMessage").remove();
								frmPreferences.parent().find(".formErrors").remove();
								frmPreferences.parent().find("ul.formSuggestions").remove();
								form.find("label.suggestion").remove();
								
								if (data.changesSuggested) {
									var serverSuggestionObj = {};
									if (data.txtPreferencesStreetAddressSuggestionMsg != undefined && data.txtPreferencesStreetAddressSuggestion != undefined) { 
										serverSuggestionObj.txtPreferencesStreetAddress = {
											name: "txtPreferencesStreetAddress",
											suggestionMessage: data.txtPreferencesStreetAddressSuggestionMsg,
											suggestedValue: data.txtPreferencesStreetAddressSuggestion
										}
									}
									
									if (data.txtPreferencesStreetAddressApartmentSuggestionMsg != undefined && data.txtPreferencesStreetAddressApartmentSuggestion != undefined) { 
										serverSuggestionObj.txtPreferencesStreetAddressApartment = {
											name: "txtPreferencesStreetAddressApartment",
											suggestionMessage: data.txtPreferencesStreetAddressApartmentSuggestionMsg,
											suggestedValue: data.txtPreferencesStreetAddressApartmentSuggestion
										}
									}
									
									if (data.txtPreferencesCitySuggestionMsg != undefined && data.txtPreferencesCitySuggestion != undefined) { 
										serverSuggestionObj.txtPreferencesCity = {
											name: "txtPreferencesCity",
											suggestionMessage: data.txtPreferencesCitySuggestionMsg,
											suggestedValue: data.txtPreferencesCitySuggestion
										}
									}
									
									if (data.txtPreferencesZipCodeSuggestionMsg != undefined && data.txtPreferencesZipCodeSuggestion != undefined) {
										serverSuggestionObj.txtPreferencesZipCode = {
											name: "txtPreferencesZipCode",
											suggestionMessage: data.txtPreferencesZipCodeSuggestionMsg,
											suggestedValue: data.txtPreferencesZipCodeSuggestion
										}
									}
									
									if (data.selPreferencesStateSuggestionMsg != undefined && data.selPreferencesStateSuggestion != undefined) {
										serverSuggestionObj.selPreferencesState = {
											name: "selPreferencesState",
											suggestionMessage: data.selPreferencesStateSuggestionMsg,
											suggestedValue: data.selPreferencesStateSuggestion
										}
									}
									
									form.showFormSuggestions({
										suggestionData: serverSuggestionObj,
										summaryAnchor: frmPreferences.prev(),
										scrollToSummary: true,
										suggestionSummaryMessage: data.suggestionSummaryMessage
									});
									
								} else if(data.responseMessage!=undefined){
									showErrorMessage(data.responseMessage);
								}
								
							}
							else if (frmAiraveTab && frmAiraveTab.hasClass("airaveTabAccess")) {
								//server error when saving phone number list
								if (data.errors != undefined){
									var serverErrorObj = {};
									for (var error in data.errors) {
										serverErrorObj[error] = {
											name: error,
											errorMessage: data.errors[error]
										}
									}
									
									//Form has errors, show messages.
									frmAiraveTab.showFormErrors({
										errorData: serverErrorObj,
										showSummary: false,
										scrollToSummary: false,
										showInline: true
									});
								}
								
								if(data.responseMessage!=undefined){
									showErrorMessage(data.responseMessage);
								}
									
							}
							else if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
								
								//check the number of attempts to register as reported by the server
								if (data.attempts < 4 || data.attempts == undefined) {
									//create error object based on server response
									var serverErrorObj = {};
									if (data.txtDeviceNumberError != undefined) {
										serverErrorObj.txtDeviceNumber = {
											name: "txtDeviceNumber",
											errorMessage: data.txtDeviceNumberError
										};
									}
									if (data.txtPinError != undefined) {
										serverErrorObj.txtPin = {
											name: "txtPin",
											errorMessage: data.txtPinError
										};
									}
									if (data.txtTaxIdNumberError != undefined) {
										serverErrorObj.txtTaxIdNumber = {
											name: "txtTaxIdNumber",
											errorMessage: data.txtTaxIdNumberError
										};
										$("#taxIdNumberWrapper input", frmPreferences).addClass("error");
									}
									if (data.txtZipCodeError != undefined) {
										serverErrorObj.txtZipCode = {
											name: "txtZipCode",
											errorMessage: data.txtZipCodeError
										};
									}
									//Form has errors, show messages.
									frmPreferences.showFormErrors({
										errorData: serverErrorObj,
										summaryAnchor: frmPreferences.prev(),
										scrollToSummary: true
									});
								} else {
									//redirect the user to customer service
									if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL")) {
										userAssistanceNeeded("addNewAccount", $("#manageAccountsModule"));
									}
									else if (frmPreferences.hasClass("unlockAccount")) {
										userAssistanceNeeded("unlockAccount", frmPreferences);
									}
								}
							}
							else if (frmPreferences.hasClass("blockDataAccess") || frmPreferences.hasClass("blockPictureMail") || frmPreferences.hasClass("blockPermissions")) {
								if(data.responseMessage){
									showErrorMessage(data.responseMessage);
								}else{
									if(data.errors){
										
										for (var error in data.errors) {
											var cell = frmPreferences.find("#" + error);
											
											// If it was already selected, then deselect it.
											if (cell.hasClass("active")) {
												cell.trigger("click");
											}
											
											// Disable the device and show it's error state
											cell.removeClass("disabled").addClass("error").unbind("click").find("div.currentPhoneDisabled").show();
											
											//add tooltip to cell
											if(data.errors[error].tooltipMessage){
												cell.attr("tooltipCustom",data.errors[error].tooltipMessage);
												cell.tooltip();
											}
										}
										
										//Remove success messages
										frmPreferences.prev().find(".updateMessage").remove();
										//Form has errors, show messages.
										frmPreferences.showFormErrors({
											errorData:
												{
													txtBlockedPhones: {
														name: "txtBlockedPhones",
														errorMessage: data.errorMessage
													}
												},
											summaryAnchor: frmPreferences.prev(),
											scrollToSummary: true,
											showSummaryPlain: true,
											showInline: false
										});
									}
								}
							}
							else if(frmPreferences.hasClass("oneTouchSettings")){

								var cell = hidSubscriberInput.parent();
								updateCell(cell,"serverError");
								
								//add tooltip to cell
								if(data.tooltipMessage){
									cell.attr("tooltipCustom",data.tooltipMessage);
									cell.tooltip();
								}
								showErrorMessage(data.responseMessage);
							}
							else {
								if(data.errorMessage){
									showErrorMessage(data.errorMessage);
								} else if (data.responseMessage){
									showErrorMessage(data.responseMessage);
								}
							}
						}
					},
					error: Sprint.fn.ajaxError,
					complete: function(data,status){
						// regardless of error or complete, enable the save button and kill the disabled clone
						disabledPrefSaveBtn.remove();
						prefSaveBtn.show();						
					}
				});
			}
			else { // validForm == false
			
				//Remove success messages
				frmPreferences.prev().find(".updateMessage").remove();
				
				if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
					if(validDeviceNum.validated == false){
						validForm = deviceNumError;
					}
				}
				
				if($("#txtPhoneEsn").val() == "" && $("#addDeviceMyPhoneMedia").length <= 0) {
					$("#myDeviceDynamic3").empty().hide();
					$("#hidMyDeviceFormValidate").val("false");
					
				} else {
					
					//Form has errors, show messages.
					if (frmPreferences.hasClass("airaveDetails")) {
						
						frmAiraveTab.showFormErrors({
							errorData: validForm,
							summaryAnchor: frmPreferences.prev(),
							scrollToSummary: true
						});
					} else {
						
						frmPreferences.showFormErrors({
							errorData: validForm,
							summaryAnchor: frmPreferences.prev(),
							scrollToSummary: true, 
							callback: function() {
								if (frmPreferences.hasClass("accountBillSettings")) {
									if ($("ul.formErrors li a").attr("href") == "#lblPreferencesSpanishAgree") {
										$("ul.formErrors li a").html(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.spanishAgreeInvalid"));
									}
								}
							}
						});
						
						// override the summary message for the validation code
						if (validForm["txtValidationCode"] != null) {
							$(".formErrors li").html(preferencesFormFields.txtValidationCode.summaryMessage);
						}
					}
					// GT: Move the error message outside the background box in anniversary gift modal
					/*
					if (frmPreferences.hasClass("anniversaryGift")) {
						var inlineError = frmPreferences.find("#anniversary25PhoneNumber label.error");
						frmPreferences.find("#anniversary25PhoneNumber label.error").remove();
						inlineError.insertAfter(frmPreferences.find("#anniversary25PhoneNumber"));
					}
					*/
					
					if (frmPreferences.hasClass("emailSettings")){
						//TODO: convert this to a general error message similar to blockText and blockVoice
						var txtCommEmail = $("#txtCommEmail");
						singleFieldValidation.call(txtCommEmail);
					
						//rebind the error message click event on email settings page
						var emailErrorMsg = $("#preferencesModal ul.formErrors li a[href=#lblCommEmail]");
						emailErrorMsg.unbind("click").bind("click",function(e){
							e.preventDefault();
							
							var errorIndex = $.inArray(e.target,emailErrorMsg);
							var errorCell = $("#manageUserRequests td.emailError").eq(errorIndex);
							var parentRow = errorCell.parent();
							
							if(parentRow.css("display") == "none"){
								var allRows = $("#manageUserRequests > tbody > tr:not(#deviceDetailsRow)");
								var rowIndex = $.inArray(parentRow.get(0),allRows) + 1;
								var pageIndex = Math.ceil(rowIndex/5) - 1;
								var pageList = $("ul.pageList li:not(.pagePrev,.pageNext)");
								pageList.eq(pageIndex).find("a").trigger("click");
							}
							
							if(errorCell.is(".selected")){
								txtCommEmail.scrollTo();
							} else {
								if($("#deviceDetailsWrapper").css("display") == "none"){
									errorCell.trigger("click");
									errorCell.animate({left: 0}, 500,function(){
										txtCommEmail.scrollTo();
									});
								} else {
									errorCell.trigger("click");
									errorCell.animate({left: 0}, 1000,function(){
										txtCommEmail.scrollTo();
									});
								}
							}
							
							return false;
						});
					}
				}
				
				if($("label.error[for='txtTaxIdNumber']").length > 1){
					frmPreferences.find("label.error[for='txtTaxIdNumber']:first").remove();
				}
				
				// check for errors on Tax Id and add error class to both inputs
				if (frmPreferences.hasClass("addNewAccount") || frmPreferences.hasClass("addNewAccountDL") || frmPreferences.hasClass("unlockAccount")) {
					if($("label.error[for='txtTaxIdNumber']").length > 0){
						$("#txtTaxIdNumber2").addClass("error");
						$("#txtTaxIdNumber4").addClass("error");
					}
				}
				
			} // END validForm
			
			// Manage Accounts specific modifications
			if (frmPreferences.hasClass("manageAccounts")) {
				// Remove all error message from the summary since we just need one error message to refer to all the
				// fields. Here we clone the first element and replace the text with a global error message text. This
				// will allow us to keep the event binded to the first error message, which onclick scrolls to the first
				// error field
				var firstElemClone = $("ul.formErrors > li:first").clone(true);
				firstElemClone.find("a").text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.nicknamesInvalid"));
				$("ul.formErrors").empty().append(firstElemClone);
				
				// Move the error label for each field to above the field, instead of the default behaviour of coming
				// after the field, and add padding to align the rows with error messages since the error label is added
				// inside the cell.
				frmPreferences.find("label.error").each(function() {
					var errorCellParent = $(this).parent();
					
					$(this).remove();
					$(this).addClass("cellError");
					errorCellParent.prepend($(this));
					
					// This allows for the inline error messages to appear in the sortable table
					// and the alignment of the sibling TDs to maintain the same vertical alignment.
					errorCellParent.siblings().each(function() {
						$(this).addClass("cellErrorPadding");
					});
				});
			}
		}
		

		
		//----------------------//
		//   Launch Modal       //
		//----------------------//
		
		function launchPreferencesModal(modalPath) {
			var preferencesModal = $("#preferencesModal");
			
			if (preferencesModal.length < 1) {
				//Because this modal is being loaded via AJAX, it won't exist in the markup already. Create the modal on the fly
				var newModal = $("<div class=\"modal\"></div>").appendTo("div.sprint div.body").hide();
				preferencesModal = $("<div id=\"preferencesModal\"></div>").appendTo(newModal);
			}
			
			var additionalPreferencesSetup = function () {
				//Add event handling to the preferences modal submit button
				preferencesModal.find("#btnSubmitPreferencesModal").unbind("click").bind("click", processPreferencesForm);
				
				var frmPreferences = $("#frmPreferences");
				currentPrefsNavSelectValue = $("#prefsModalHeader select#selPrefsNav").val();
				
				if ($("#prefsModalHeader #selPrefsModalAccountChange").length > 0) {
					currentAccountNavSelectValue = $("#prefsModalHeader #selPrefsModalAccountChange").val();
				}
				
				//Make sure that the form submission goes through the submit button's click event
				frmPreferences.bind("submit", function(event) {
					event.preventDefault();
					var prefModalBtn = preferencesModal.find("#btnSubmitPreferencesModal");
					//trigger the click event of the button only when the button is not display:none
					if (prefModalBtn.css("display").toLowerCase() != "none"){
						prefModalBtn.trigger("click");
					}
				});
					
				//Setup preferences nav accordions (for sub menus)
				var prefsNav = $("#prefsNav");				
				if (prefsNav.find("li.hasSubnav").length > 0) {
					prefsNav.accordion();
				}
				
				//Move the account drop-down (if it exists) into the header.
				$("#prefsModalHeader #prefsModalAccountChange").appendTo("#prefsModalHeader h2");

				//Event handling for the preferences navigation select menu & the account change drop-down menu
				$("#prefsModalHeader #selPrefsNav, #prefsModalHeader #selPrefsModalAccountChange").bind("change", function(event) {

					// TEALEAF SESSION TRACKING
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}

				    //Omniture code for Account Flip  :Start :  Ashish 
					if(typeof disableOmnitureTrnxnTrac != "undefined" && disableOmnitureTrnxnTrac ==  'false'){
						var  omniture_NewAccountNavSelectValue;
						if(document.getElementById("selPrefsModalAccountChange") != undefined){
							omniture_NewAccountNavSelectValue = document.getElementById("selPrefsModalAccountChange").value;
	
							if (omniture_NewAccountNavSelectValue.match("account=")){
								omniture_currentAccountNavSelectValue = omniture_NewAccountNavSelectValue.split('account=');
							}
							else if (omniture_NewAccountNavSelectValue.match("accountNo=")){
								omniture_currentAccountNavSelectValue = omniture_NewAccountNavSelectValue.split('accountNo=');
							}
							else {
								omniture_currentAccountNavSelectValue="";
							}
							if (omniture_currentAccountNavSelectValue != ""){
								var omniture_ModelName=$('#omniture_SelectedModel').val();
								var accNo=omniture_currentAccountNavSelectValue[1].split('&');
								if (omniture_ModelName != ""){
									if (typeof(Analytics) !== "undefined") {
										Analytics.eCareATG.trackTransactions(omniture_ModelName,"Complete","",accNo);
									}
								}
							}
						}
					}
				    //Omniture code for Account Flip :End
					
					if (closeIntercept()) {
						var modalPath = $(this).val();
						loadModalContent(modalPath);
					}
					else {
						//Reset the values to the previously selected items
						$("#prefsModalHeader #selPrefsNav").val(currentPrefsNavSelectValue);
						
						if ($("#prefsModalHeader #selPrefsModalAccountChange").length > 0) {
							$("#prefsModalHeader #selPrefsModalAccountChange").val(currentAccountNavSelectValue);
						}
					}
					
					return false;
				});
				
				// In some cases, we have a similar account type dropdown as above but positioned differently,
				// the code below handles such a case.
				// Default account value
				var currentAccountValue = $(".selSelectAccountWrapper select#selfrmPrefSelectAccount").val();
				
				// Event handling for the account change drop-down menu
				$(".selSelectAccountWrapper select#selfrmPrefSelectAccount").bind("change", function() {
					
					//Omniture code for account flip tracking in web/content access Start : Ashish
					if (typeof disableOmnitureTrnxnTrac != "undefined" && disableOmnitureTrnxnTrac == 'false'){
						var omniture_NewAccountNavSelectValue;
						if (document.getElementById("selfrmPrefSelectAccount") != undefined){
							omniture_NewAccountNavSelectValue = document.getElementById("selfrmPrefSelectAccount").value;

							if (omniture_NewAccountNavSelectValue.match("account=")){
								omniture_currentAccountNavSelectValue = omniture_NewAccountNavSelectValue.split('account=');
							}
							else {
								omniture_currentAccountNavSelectValue="";
							}
							if (omniture_currentAccountNavSelectValue != ""){
								var omniture_ModelName=$('#omniture_SelectedModel').val();
								var accNo=omniture_currentAccountNavSelectValue[1].split('&');
								if (omniture_ModelName != ""){
									if (typeof(Analytics) !== "undefined") {
										Analytics.eCareATG.trackTransactions(omniture_ModelName,"Complete","",accNo);
									}
								}
							}
						}
					}
					//Omniture code for account flip tracking in web/content access End : Ashish
					//Condition added for redirecting to efemto page from manage airave modal
					if (closeIntercept()) {
						var $this = $(this);
						var selected = $this.find("option:selected");
						
						if(selected.attr("label") == "efemto"){
							window.location = $this.val();
						} else {
							var modalPath = $this.val();
							loadModalContent(modalPath);
						}
					}
					else {
						//Reset the values to the previously selected items
						$(".selSelectAccountWrapper select#selfrmPrefSelectAccount").val(currentAccountValue);
					}
					
					return false;
				});
				
				//Store the current form data to a variable and check against it later
				originalFormData = frmPreferences.serialize();
				originalDataObject = Sprint.fn.deserialize(originalFormData);
				
				//Setup the form field validation object
				setupPreferencesFormFields(frmPreferences);
				
				//Do some validation on the form fields on tab-out
				// GT: Have to make sure validation on tab out isn't called for the anniversary gift modal
				// Need to do this because there seems to be a bug when you click Next, without tabbing out of
				// the field...you have to click Next twice.  The first time removes the error message, then
				// the second time goes to the next page.  So to avoid this, tab out validation was disabled
				// ONLY for anniversary gift modal.
				if (!frmPreferences.hasClass("anniversaryGift")) {
					frmPreferences.find("input.text:not(#txtDeviceNumber), select").bind("blur", singleFieldValidation);
				}
				
				//Setup click events for the elsewhere links (links that load different modals)
				preferencesModal.find("#somethingElse a, a.editLink").bind("click", function() {
					if (closeIntercept()) {
						var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).attr("href")), "modal");
						loadModalContent(modalPath);
					}
					
					return false;
				});
				
				frmPreferences.bind("change", function(event) {
					if (frmPreferences.serialize() != originalFormData) {
						window.onbeforeunload = function() {
							return Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.navigationInterceptMessage");
						};
					}
					else {
						window.onbeforeunload = null;
					}
				});
				
				//Re-size the modal if it's the Add Device flow for My Phone & Media
				if ($("#addDeviceMyPhoneMedia").length > 0) {
					$("#preferencesModal").width(540);
					Sprint.modal.elem.sizeModal();
				}
				
				// My Phone & Media Done Button
				$("#btnMyPhoneMediaCongratsDone").unbind("click").bind("click", function(event) {
					event.preventDefault();
					$("#modalHolder a.closeModal").click();
				});
			}
			
			var setUpPrefNavigation = function (){
				//Event handling for the modal navigation menu
				$("#prefsNav a, #btnAddNewAccount, #btnManageAccounts, #airaveDeviceList dl.summaryHeading dt a").bind("click", function(event) {
					window.scrollTo(0,0);
					// TEALEAF SESSION TRACKING
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}
				
					if (closeIntercept()) {
						if($("#prefsNav").hasClass("accNavBiz")){
					
							var modalPath = Sprint.fn.getQueryString($(this).attr("href")).slice(7);
							Sprint.ASLoadModalContent(modalPath);

								
						} else {
							if($("#prefsNav").hasClass("airaveNav")){
								var modalPath = Sprint.fn.getQueryString($(this).attr("href")).slice(7);
							} else {
								var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).attr("href")), "modal");
								if( modalPath && modalPath.indexOf('?')>0) { //modified by khadar
									modalPath += "&";
								} else {
									modalPath += "?";
								}
								modalPath += 'LinkTarget=' + escape(window.location.protocol + '//' + window.location.host + window.location.pathname + '&modal=' + modalPath);
							}
							//For redirecting efemto landing page from airave modal
							if($(this).parents("ul:first").hasClass("efemtoNav")){
								window.location = $(this).attr("href");

							}
							else if (!$(this).parent().hasClass("accordionHeader")) {
								loadModalContent(modalPath);
							} 
						}
					}
					
					return false;
				});
				
				if($("#prefsNav").hasClass("airaveNav")){
					if($("#prefsNav ul.subNav li").length > 1 && $("#hidPreferencesFormID").val() != "airaveSummary"){
						//there is more than one device on this account, click event on accordionHeader should take user back to summary
						$("#prefsNav div.accordionHeader a").unbind("click").bind("click", function(e){
							e.preventDefault();
							var accountNum = $("#hidUserAccountID").val();
							var modalPath = $(this).attr("href").slice(7);
							loadModalContent(modalPath);
							
							return false;
						});
					}
				}
			}
			
			var loadModalContent = function (modalPath) {
				var preferencesModal = $("#preferencesModal"); //Need to lookup this dom node with each request. This is to ensure that the node is available as it's constantly being updated/removed.
				
				//Load in the content via AJAX
				Sprint.modal.elem.loadModalContent(modalPath, preferencesModal);
				setUpPrefNavigation();
				try{
					additionalPreferencesSetup();
				} catch(e){
					alert(Sprint.fn.getContentString("modal.loadError")+e.message);
				}
			}
			/* Added  code for account hierarchy selector function in subscriber status */
			Sprint.ASLoadModalContent = function(modalPath){
				loadModalContent(modalPath);
			}
			/* End code for account hierarchy selector function in subscriber status */
			preferencesModal.openModal({
				ajaxContent: true,
				ajaxPath: modalPath,
				openCallback: function() {
					setUpPrefNavigation();
					additionalPreferencesSetup();					
				// Start tealeaf function for tracking model close : Ashish
				if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlProcessNode(document.body);
					}
				// End tealeaf function for tracking model close : Ashish
				}
			});
			
			
			//Re-set the click handler for the close button to go through the preferences closeIntercept function (doesn't support the modal closeCallback functionality, which isn't being used for prefs modal anyways)
			$("#modalHolder a.closeModal").unbind("click").bind("click", function(event) {
				
				// Start tealeaf function for tracking model close : Ashish
					if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
					}
				var frmPreferences = $("#frmPreferences");
				var frmPref = false;
				if(frmPreferences.hasClass("blockVoice") || frmPreferences.hasClass("bulkBlockVoice")){
					frmPref = true;
				} else if(frmPreferences.hasClass("oneTouchSettings")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockWebAccess")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockTexts") || frmPreferences.hasClass("bulkBlockTexts")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockPictureMail")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockDataAccess")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockDigitalMedia")){
					frmPref = true;
				} else if(frmPreferences.hasClass("blockPermissions")){
					frmPref = true;
				} else if(frmPreferences.hasClass("subscriberStatus")){
					frmPref = true;
				}

					
				// End tealeaf function for tracking model close : Ashish
				if (closeIntercept()) {
					//Close the current modal
					Sprint.modal.elem.closeModal();
					if(!frmPref){
						//Reload the page if changes to the user's preferences have been saved.
						if (preferencesChangedAndSaved) {
							setTimeout(function() {
								var url = window.location.toString();
								
								// get rid of the modal GET param so that it doesn't reopen when 
								// refreshing the page after closing the modal
								if (/modal=/.test(url)) {
									window.location = url.replace(/modal=.*?(&|$)/, '');
								}
								else {
									window.location.reload();
								}
							}, 1);
						}
					}
					
					// My Phone & Media Redirect After Success Message
					if (preferencesModal.find(".myPhoneMediaCongratulations").length > 0 ||
						preferencesModal.find("#frmPreferences").hasClass("myDevice")) {
						var redirectUrl = preferencesModal.find("a.redirect").attr("href");
						if (redirectUrl) {
							window.location = redirectUrl;
						}
					}
				}
				
				return false;
			});
			
			//Do the same for the ESC key event
			$(document).unbind("keydown").bind("keydown", function(key) {
				if (key.keyCode == 27) {
					if (closeIntercept()) {
						//Close the current modal
						$("#modalHolder a.closeModal").click();
						//Sprint.modal.elem.closeModal();
					}							
					return false;
				}
			});
		}
		
		Sprint.launchPreferencesModal = function(event) {
			// Start tealeaf function for tracking model close : Ashish
			if (typeof(TeaLeaf) != "undefined" &&  typeof(TeaLeaf.Client) != "undefined") {
						TeaLeaf.Client.tlAddEvent(event);
			}
				
			// End tealeaf function for tracking model close : Ashish
			event.preventDefault();
			
			//Determine the path for the content for the modal window by first getting the querystring of this href (Sprint.fn.getQueryString) and asking for the modal variable from the Sprint.fn.getURLParameter function.
			
			if ($(this).attr("href")) {
				var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).attr("href")), "modal");
			} else {
				var modalPath = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($(this).val()), "modal");
			}
			
			
			if( modalPath && modalPath.indexOf('?')>0) { //modified by khadar
				modalPath += "&";
			} else {
				modalPath += "?";
			}
			modalPath += 'LinkTarget=' + escape(window.location.protocol + '//' + window.location.host + window.location.pathname + '&modal=' + modalPath);
			launchPreferencesModal(modalPath);
		};
	
		$("a.launchPreferencesModal").bind("click", Sprint.launchPreferencesModal);
		
		$(window).bind("load", function() {
			//Check to see if the modal variable is set in the querystring, if so, open the preferences modal on page load.
			var querystring = Sprint.fn.getQueryString(String(window.location));
			if (querystring != "") {
			
				//Check to see if the modal variable is set
				modalPath = Sprint.fn.getURLParameter(querystring, "modal");
				if (modalPath) {
					launchPreferencesModal(modalPath);
				}
			}
		});
		
		
		
		//----------------------//
		//   Helper Functions   //
		//----------------------//
		
		function singleFieldValidation(event, form) {
			if(preferencesFormFields == undefined || preferencesFormFields == null) {
				return;
			}
			var currentField = $(this);
			var fieldToValidate = preferencesFormFields[currentField.attr("name")];
			if (!fieldToValidate) {
				//Don't bother validating if this field hasn't been defined
				return;
			}

			var frmPreferences = form || $("#frmPreferences");
			//If this field already has an error, clear the error first
			if (currentField.hasClass("error")) {
				currentField.removeClass("error");
				frmPreferences.find("label.error[for='"+currentField.attr("id")+"']").remove();
			}
			if (currentField.hasClass("suggestion")) {
				currentField.removeClass("suggestion");
				frmPreferences.find("label.suggestion[for='"+currentField.attr("id")+"']").remove();
			}
			
			//Don't bother running this validation if the original value of this field hasn't changed (we're escaping (or url encoding) the current value of this field because when serialize is called, it also escapes field values using Javascript's encodeURIComponent function)... as long as it's not a required field that's been left empty.
			if (originalDataObject[currentField.attr("name")] != encodeURIComponent(currentField.val()) || (currentField.val() == "" && fieldToValidate.required)) {
				
				//Validate this field
				var validField = Sprint.fn.validateForm(frmPreferences, {field: fieldToValidate});
				
				if (typeof(validField) != "boolean") {
					//There's an error with this field, show inline-only error messaging.
					frmPreferences.showFormErrors({					
						errorData: validField,
						showSummary: false
					});
				}
			}
		}
		
		function userAssistanceNeeded(forField,$target) {
			//user has attempted to validate more than three times and failed. Now we forward them to a file that will respond with how they may get assistance
			$.ajax({
				data: "field="+forField,
				dataType: "html",
				type: "POST",
				url: "/mysprint/registration/ajax/0.1.1_getUserAssistance.php",
				success: function(result) {
					$target.html(result);
					//TODO: bind events based on chat/care response
					if($("#modalHolder").length > 0){
						$("#modalHolder").scrollTo();
					} else {
						$target.parent().scrollTo();
					}
				},
				error: Sprint.fn.ajaxError
			});
		}
		

		function scrollToMessage(updateMessage) {
			//Scroll to the update message if it's not already in view
			var currentScrollTop = 0;
			var htmlScrollTop = $("html").scrollTop();
			var bodyScrollTop = $("body").scrollTop();

			//Determine the current scroll top position by checking both the html & body element's scrollTop positions (some browsers use html, some use body).
			if (htmlScrollTop > 0 || bodyScrollTop > 0) {
				if (htmlScrollTop > 0) {
					currentScrollTop = htmlScrollTop;
				}
				else if (bodyScrollTop > 0) {
					currentScrollTop = bodyScrollTop;
				}
			}
			if (updateMessage.offset().top < currentScrollTop) {
				updateMessage.scrollTo({speed: "medium"});
			}
		}
		
		function showSuccessMessage(message) {
			//Show success message:
			var header = $("#preferencesModal div.containerThreeColumnRt .headerWrapperPrimary");
			
			//Remove any current success/error messages
			header.find(".updateMessage").remove();
			var updateMessage = $("<div class=\"updateMessage\"><img class=\"messageIcon\" src=\"/global/images/icons/ico_confirmation_med.gif\" alt=\"Success\" /><div class=\"updateText\">"+message+"</div></div>");
			updateMessage.appendTo(header);
			scrollToMessage(updateMessage);
		}
		
		function showErrorMessage(message) {
			//Show error message:
			var header = $("#preferencesModal div.containerThreeColumnRt .headerWrapperPrimary");
			
			if(header.length == 0){
				header =  $("#preferencesModal div.containerThreeColumn .headerWrapperPrimary");
			}
			
			//Remove any current success/error messages
			header.find("div.updateMessage").remove();
			var updateMessage = $("<div class=\"updateMessage\"><img class=\"messageIcon\" src=\"/global/images/icons/ico_error_med.gif\" alt=\"Error\" /><div class=\"updateText\">"+message+"</div></div>");
			updateMessage.appendTo(header);
			scrollToMessage(updateMessage);
		}
		
		function showWarningMessage(message) {
			//Show warning message:
			var header = $("#preferencesModal div.containerThreeColumnRt .headerWrapperPrimary");
			
			//Remove any current success/error messages
			header.find("div.warningMessage").remove();
			var warningMessage = $('<div class="warningMessage"><ul class="formSuggestions"><li>'+message+'</li></ul></div>');
			warningMessage.appendTo(header);
			if(header.find("div.updateMessage").length <= 0){
				scrollToMessage(warningMessage);
			}
		}
		
		//events for Account Preferences - Unlock/Register Devices
		if($("#unlockAccountModule").length > 0){
			var frmPreferences = $("#frmUnlockAccount");
			
			//create faux originalDataObject
			var originalDataObject = {
				txtDeviceNumber: ".",
				txtPin: "."
			};
			
			//Add event handling to the preferences modal submit button
			frmPreferences.find("#btnSubmitUnlockAccount").unbind("click").bind("click", {form:frmPreferences},	processPreferencesForm);

			//Make sure that the form submission goes through the submit button's click event
			frmPreferences.bind("submit", function(event) {
				event.preventDefault();
				frmPreferences.find("#btnSubmitUnlockAccount").trigger("click");
			});
			
			//Setup the form field validation object
			setupPreferencesFormFields(frmPreferences);

			//Do some validation on the form fields on tab-out
			frmPreferences.find("input.text:not(#txtDeviceNumber)").bind("blur", function(event){
				singleFieldValidation.call(this,event,frmPreferences);
			});
		}
		
		function detailsRowReset(){
			var detailsRow = $("#deviceDetailsRow");
			$("#deviceDetailsWrapper").hide().removeClass("readonly");
			detailsRow.data("cell").find("div.accountPhoneBottom").removeClass("readonly");
			detailsRow.data("cell", detailsRow).removeData("lastClicked").appendTo($("#deviceDetailsTable"));
		}
		
		/* Table Row Drawer plugin
		 * operates on all specified TDs in a Table
		 * This plugin is intended to prevent duplicate code on limits and permissions modals.
		 * It is not loosly coupled from my preference pages and not intended for use outside of my preferences.
		 *
		 * usage example:
		 * $("#manageUserRequests").deviceDrawer({
		 * 		drawerRow: "#deviceDetailsRow",
		 * 		drawerWrapper: "#deviceDetailsWrapper",
		 * 		beforeSlideUp: function(e){
		 * 			var cell = $(e.currentTarget);
		 * 			alert(cell);
		 * 		}
		 * 	});
		 */		
		
		$.fn.extend({
			deviceDrawer: function(scriptOptions) {
				var defaults = {
					drawerRow: "#deviceDetailsRow", 				//string: selector for the drawer details row.
					drawerWrapper: "#deviceDetailsWrapper", 		//string: selector for the drawer wrapper which is the first div after drawerRow > td
					tableCells: "td.myDeviceColumn", 				//string: selector for the table cells that click events will be bound to
					numColumns: 3, 									//int: number of table rows in the parent table (including spacer cells)(not yet implemented)
					beforeSlideUp: null,							//function: callback triggered before the drawer is expanded - accepts "return false" value from callback to prevent animation and exit click event
					afterSlideUp: null,								//function: callback triggered after the drawer is retracted
					beforeSlideDown: null, 							//function: callback triggered before animation
					afterSlideDown: null,							//function: callback triggered after the drawer is expanded
					beforeToggle: null, 							//function: callback before drawer is toggled open or closed
					blockedClassName: "blocked", 					//string: css class name for blocked cells
					disabledClassName: "disabled", 					//string: css class name for disabled cells
					errorClassName: "error", 						//string: css class name for error cells
					selectedClassName: "selected", 					//string: css class name for selected cells
					leftColumnStyleName: "deviceDetailsTopLeft", 	//string: css class name
					rightColumnStyleName: "deviceDetailsTopRight", 	//string: css class name
					disableDrawer: false, 							//boolean: if cell is disabled then should drawer also be disabled
					slideDownSpeed: "normal",						//"slow", "fast", "normal", or milliseconds: speed of slide down animation
					slideUpSpeed: "normal",							//"slow", "fast", "normal", or milliseconds: speed of slide up animation
					slidePause:100									//"slow", "fast", "normal", or milliseconds: time to pause animation between slideUp of previous cell and slideDown of current cell
				};
				
				var options = $.extend(defaults, scriptOptions);
				
				var $table = $(this);
				var $drawerRow = $(options.drawerRow);
				var $drawerWrapper = $(options.drawerWrapper);
				var $td = $table.find(options.tableCells);
				
				//TODO: check for drawerWrapper -> if none then create div and insert after td.
				//TODO: set td colspan val to options.numColumns
				
				return $td.each(function() {
					var cell = $(this);
					var parentRow = cell.parent();
					
					$drawerRow.data("cell", $drawerRow);
					cell.bind("click",function(e){
						e.preventDefault();
						
						// If the cell isn't blocked or disabled or in error...
						if (!cell.hasClass(options.errorClassName) && !cell.hasClass(options.blockedClassName) && !cell.hasClass(options.disabledClassName)) {
							//stop previous animations
							$drawerWrapper.stop(true,true);
							
							var currentCell = $drawerRow.data("cell");
							if(currentCell && currentCell[0] === cell[0]){
								//the cell clicked is the currently selected cell so we toggle instead of opening
								if(options.beforeToggle){
									// CALLBACK: beforeToggle
									var callbackReturn = options.beforeToggle(e);
									if (callbackReturn == false){
										return
									}
								};
								if($drawerWrapper.is(":visible")){
									//toggle drawer closed
										if (!cell.hasClass(options.disabledClassName)) {
											cell.removeClass(options.selectedClassName);
										}
										$drawerWrapper.children(":first").removeClass(options.leftColumnStyleName).removeClass(options.rightColumnStyleName);
										
										//added for readonly drawer state
										if(currentCell.hasClass("readonly")){
											currentCell.find("div.accountPhoneBottom").removeClass("readonly");
										}
										$drawerWrapper.slideUp();
								} else {
									//toggle drawer open
										if (!cell.hasClass(options.disabledClassName)) {
											cell.addClass(options.selectedClassName);
										}
										//turn off left/right column style while form slides up
										if(cell.is(":first-child")){
											$drawerWrapper.children(":first").addClass(options.leftColumnStyleName);
										} else {
											$drawerWrapper.children(":first").addClass(options.rightColumnStyleName);
										}
										//added for readonly drawer state
										if(currentCell.hasClass("readonly")){
											currentCell.find("div.accountPhoneBottom").addClass("readonly");
										}
										$drawerWrapper.slideDown();
								}
								
							} else {
								// CALLBACK: beforeSlideUp
								if(options.beforeSlideUp){
									var callbackReturn = options.beforeSlideUp(e);
									if (callbackReturn == false){
										return
									}
								}
								//save our currently selected cell
								if($drawerRow.data("cell") == undefined){
									$drawerRow.data("cell", cell);
								} else {
									//remove selected class from previously selected cell
									currentCell.removeClass(options.selectedClassName);
									
									//added for readonly drawer state
									if(currentCell && currentCell.hasClass("readonly")){
										currentCell.find("div.accountPhoneBottom").removeClass("readonly");
									}
									
									//mark the clicked cell as the currently selected cell
									$drawerRow.data("cell",cell);
								}
								
								//remove left/right column styles. They will be added back in the slideUp callback
								$drawerWrapper.children(":first").removeClass(options.leftColumnStyleName).removeClass(options.rightColumnStyleName);
								
								if(cell.hasClass("readonly")){
									cell.find("div.accountPhoneBottom").removeClass("readonly");
								}
								
								$drawerWrapper.slideUp(options.slideUpSpeed, function() {
									
									if(cell.hasClass("readonly")){
										$drawerWrapper.removeClass("readonly");
									}
									//CALLBACK: afterSlideUp
									if(options.afterSlideUp){
										var callbackReturn = options.afterSlideUp(e);
										if (callbackReturn == false){
											return
										}
									}
									
									//remove display:none that pagination adds
									$drawerRow.insertAfter(parentRow).removeAttr("style");
									
									$drawerWrapper.children(":first").addClass((cell.is(":first-child"))?options.leftColumnStyleName:options.rightColumnStyleName);
									
									$drawerWrapper.animate({left: 0}, options.slidePause,function(){
										//CALLBACK: beforeSlideDown
										if(options.beforeSlideDown){
											var callbackReturn = options.beforeSlideDown(e);
											if (callbackReturn == false){
												return
											}
										}
										
									//animate left to create a "pause" effect
									cell.addClass(options.selectedClassName);
									
									//added for readonly drawer state
									if(currentCell && currentCell.hasClass("readonly")){
										$drawerWrapper.removeClass("readonly");
									}
									
									if(cell.hasClass("readonly")){
										cell.find("div.accountPhoneBottom").addClass("readonly");
										$drawerWrapper.addClass("readonly");
									}
									
										$drawerWrapper.slideDown(options.slideDownSpeed,function(){
									if($("#modalOverlay").length > 0){
										//this callback extends the modal blocking layer in case the modal disclosure extends below the available vertical screen space
										var windowHeight = $(document).height(); 
										var modalHeight = $("#modalOverlay").height();
										if (windowHeight > modalHeight){
											$("#modalOverlay").height(windowHeight + 20);
										}
									}
									
									//CALLBACK: afterSlideDown
									if(options.afterSlideDown){options.afterSlideDown(e)}
								});
									});
								});
								
								// Custom event to retract the drawer without click event
								$drawerWrapper.bind("drawerSlideUp",function(e, delay) {
									$drawerWrapper.animate({left: 0},delay).slideUp().children(":first").removeClass(options.leftColumnStyleName).removeClass(options.rightColumnStyleName);
								});
							}
						}
					});
				});
			}
		});
		//this function extends the modal blocking layer in case the modal disclosure extends below the available vertical screen space
		function expandBlockingLayer(){
			if(Sprint.modal.elem.length > 0){
				var windowHeight = $(document).height();
				var modalHeight = $("#modalOverlay").height();
				if (windowHeight > modalHeight){
					$("#modalOverlay").height(windowHeight + 20);
				}
			
				Sprint.modal.elem.sizeModal();
			}
		}
		
		function getAccountDevices(target, tbodyClass){
			
			// Set to currentAccount from account select control
			var currentAccount;
			if($("#selfrmPrefSelectAccount").length > 0){
				currentAccount = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($("#selfrmPrefSelectAccount option:selected").val()), "account").toLowerCase();
			} else {
				currentAccount = "deviceUser";
			}

			var deviceUrl = $("#ajaxUrlForAccountSubsList").val(); // change by Pankaj Gupta
			if(tbodyClass == undefined || tbodyClass == null || tbodyClass == ""){
				tbodyClass = "";
			}
			//trigger ajax call to fetch subscriber list from server
			$.ajax({
				data: "form=" + $("#frmPreferences").attr("class") + "&account=" + currentAccount,
				dataType: "json",
				type: "POST",
				url: deviceUrl,
				async: false,
				success: function(result){
					//assign the result to deviceData to be accessible later
					deviceData = result;
					
					if(deviceData.devices){
						var deviceCount = deviceData.devices.length;
					} else {
						var deviceCount = 0;
					}
					
					if(deviceCount > 0){
						//parse results
						var subscriberTable = $('<table id="manageUserRequests"><tbody class="myDeviceTableBody'+tbodyClass+'"></tbody></table>');
						var subscriberTableTbody = subscriberTable.find("tbody");
						var subscriberTableRow;
						var subscriberTableCell = $('<td class="myDeviceColumn"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
						var separator = $('<td class="separator"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
						var emptyCell = $('<td class="emptyCell"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
						
						//icon elements
						var updatedIcon = $('<div class="accountPhoneUpdated">' +
												  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.updated")+'" />'+
												  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.updated")+'</span></div>');
						var errorIcon = $('<div class="accountPhoneError">' +
													'<img src="/global/images/icons/ico_error_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.errorText")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.error")+'</span></div>');
						var selectedIcon = $('<div class="accountPhoneSelected">' +
												  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.selected")+'" />'+
												  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.selected")+'</span></div>');
						var blockedIcon = $('<div class="accountPhoneBlocked">' +
													'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.blocked")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.blocked")+'</span></div>');
						var restrictedIcon = $('<div class="accountPhoneRestricted">' +
													'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.restricted")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.restricted")+'</span></div>');
						
						for (var i=0; i<deviceCount; i++) {
							var device = deviceData.devices[i];
							var validPtn = '';
							if(device.deviceNumber.length == 10){
								var ptnNum = device.deviceNumber;
								validPtn = '('+ptnNum.substr(0,3)+')&nbsp;'+ptnNum.substr(3,3)+'-'+ptnNum.substr(6,4);
							}else{
								validPtn = device.deviceNumber;
							}
							var deviceSummary = $('<table><tr><td class="phoneImage"><img src="'+device.imageURL+'" class="pngFix" alt="'+device.deviceType+'" /></td><td class="phoneInfo"><div class="userName"><strong class="name">'+device.firstName+'</strong> <strong class="name">'+device.lastName+'</strong></div><div class="deviceNumber" style="display:none;">'+device.deviceNumber+'</div><div class="devicePhone">'+validPtn+'</div><div class="deviceType">'+device.deviceType+'</div></td></tr></table>	');
							
							var tableCell = subscriberTableCell.clone();
							if (target.hasClass("blockDataAccessWrapper") || target.hasClass("blockPictureMailWrapper") || target.hasClass("blockPermissionsWrapper")) {
								tableCell.prepend(selectedIcon.clone());
								tableCell.prepend(errorIcon.clone());
								tableCell.prepend(blockedIcon.clone());
							} 
							else if (target.hasClass("textMessagingWrapper") || target.hasClass("blockVoiceWrapper")){
								tableCell.prepend(restrictedIcon.clone());
								tableCell.prepend(updatedIcon.clone());
								tableCell.prepend(errorIcon.clone());
							}
							else {
								tableCell.prepend(updatedIcon.clone());
								tableCell.prepend(errorIcon.clone());
							}
							
							
							tableCell.attr("id",device.subscriberID);
							tableCell.find("div.accountPhoneContent").append(deviceSummary);
							
							// Set up hovers for ie6
							tableCell.hover(
								function() {
									$(this).addClass("hover");
								},
								function() {
									$(this).removeClass("hover");
								}
							);
							
							// flag suspended cells
							if(device.suspended){
								tableCell.data("suspended",true);
								tableCell.data("suspendedToolTip",device.tooltipMessage);
							} else {
								tableCell.data("suspended",false);
							}
							//(device.suspended)?tableCell.data("suspended",true):tableCell.data("suspended",false);
							
							if(currentAccount == "deviceUser"){
								target.data("deviceUser",true);
								if(device.isBlocked && device.isBlocked[0] == 1){
									tableCell.addClass("blocked");
									tableCell.data("isBlocked",true);
								}
							}
							
							if(i % 2 == 0){
								//create new table row, left column table cell, and spacer
								//var leftColumnCell = $('<td class="myDeviceColumn" id="'+device.subscriberID+'"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
								subscriberTableRow = $('<tr></tr>');
								subscriberTableRow.append(tableCell).append(separator.clone());
								if(deviceData.devices.length -1 == i){
									//check if this is the last device and create empty right column cell and append table row
									subscriberTableRow.append(emptyCell.clone());
									subscriberTableTbody.append(subscriberTableRow);
								}
							} else {
								//create right column table cell and append table row
								subscriberTableRow.append(tableCell);
								subscriberTableTbody.append(subscriberTableRow);
							}
						}
						
						//insert the table into the DOM
						target.html(subscriberTable);
						
						//apply ellipsis plugin to user names
						truncateCells(target);
						
						//if device limit flag is true (more than 100 subscribers) then show warning message
						if(deviceData.isDeviceLimit){
							//showErrorMessage(deviceData.deviceLimitMessage);
							$("#deviceLimitMsg").show();
						}
						
					} else {
						//append no devices available message and device list if applicable
						var noResultsText = "";
						if(deviceData.message){
							noResultsText += deviceData.message;
						}
						if(deviceData.itemList){
							noResultsText += "<b>" + deviceData.itemList + "</b>";
						}
						var noResultsMsg = $('<p>'+noResultsText+'</p>');
						target.html(noResultsMsg);
						$("#btnSubmitPreferencesModal").addClass("disabled");
						$("#btnSubmitPreferencesModal").unbind("click").bind("click", function(event) {event.preventDefault();});
					}
				},
				error: Sprint.fn.ajaxError
			});
		}
		function getBulkAccountDevices(target, tbodyClass){
			
			// Set to currentAccount from account select control
			var currentAccount;
			var subscriberData;
			if($("#selfrmPrefSelectAccount").length > 0){
				currentAccount = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($("#selfrmPrefSelectAccount option:selected").val()), "account").toLowerCase();
			} else {
				currentAccount = "deviceUser";
			}

			var deviceUrl = $("#ajaxUrlForAccountSubsList").val();
			if(tbodyClass == undefined || tbodyClass == null || tbodyClass == ""){
				tbodyClass = "";
			}
			//trigger ajax call to fetch subscriber list from server
			$.ajax({
				data: "form=" + $("#frmPreferences").attr("class") + "&account=" + currentAccount +"&"+$("#hidPreferencesFormID").serialize()+"&"+$("div.searchKeys input,div.searchKeys select,div.searchFilters select").serialize() +"&banNumber="+$("input#hid_selectedBan").val()+"&nodeID="+$("input#hid_nodeID").val(),
				dataType: "json",
				type: "POST",
				url: deviceUrl,
				async: false,
				success: function(result){
					//assign the result to deviceData to be accessible later
					deviceData = result;
					subscriberData =  result;
					if(deviceData.devices){
						var deviceCount = deviceData.devices.length;
					} else {
						var deviceCount = 0;
					}
					
					if(deviceCount > 0){
						//parse results
						var subscriberTable = $('<table id="manageUserRequests"><tbody class="myDeviceTableBody'+tbodyClass+'"></tbody></table>');
						var subscriberTableTbody = subscriberTable.find("tbody");
						var subscriberTableRow;
						var subscriberTableCell = $('<td class="myDeviceColumn"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
						var separator = $('<td class="separator"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
						var emptyCell = $('<td class="emptyCell"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
						
						//icon elements
						var updatedIcon = $('<div class="accountPhoneUpdated">' +
												  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.updated")+'" />'+
												  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.updated")+'</span></div>');
						var errorIcon = $('<div class="accountPhoneError">' +
													'<img src="/global/images/icons/ico_error_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.errorText")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.error")+'</span></div>');
						var selectedIcon = $('<div class="accountPhoneSelected">' +
												  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.selected")+'" />'+
												  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.selected")+'</span></div>');
						var blockedIcon = $('<div class="accountPhoneBlocked">' +
													'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.blocked")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.blocked")+'</span></div>');
						var restrictedIcon = $('<div class="accountPhoneRestricted">' +
													'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.restricted")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.restricted")+'</span></div>');
						var statusErrorIcon = $('<div class="accountPhoneStatusError">' +
													'<img src="/global/images/icons/ico_ac_error_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.statusError")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.statusError")+'</span></div>');
						var statusPendingIcon = $('<div class="accountPhoneStatusPending">' +
													'<img src="/global/images/icons/accountcontrols/ico_ac_pending_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.statusPending")+'" />'+
													'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.statusPending")+'</span></div>');
						for (var i=0; i<deviceCount; i++) {
							var device = deviceData.devices[i];
							var validPtn = '';
							if(device.deviceNumber.length == 10){
								var ptnNum = device.deviceNumber;
								validPtn = '('+ptnNum.substr(0,3)+')&nbsp;'+ptnNum.substr(3,3)+'-'+ptnNum.substr(6,4);
							}else{
								validPtn = device.deviceNumber;
							}
							var deviceSummary = $('<table><tr><td class="phoneImage"><img src="'+device.imageURL+'" class="pngFix" alt="'+device.deviceType+'" /></td><td class="phoneInfo"><div class="userName"><strong class="name">'+device.firstName+'</strong> <strong class="name">'+device.lastName+'</strong></div><div class="deviceNumber" style="display:none;">'+device.deviceNumber+'</div><div class="devicePhone">'+validPtn+'</div><div class="deviceType">'+device.deviceType+'</div></td></tr></table>');
							
							var tableCell = subscriberTableCell.clone();
							if (target.hasClass("blockDataAccessWrapper") || target.hasClass("blockPictureMailWrapper") || target.hasClass("blockPermissionsWrapper")) {
								tableCell.prepend(selectedIcon.clone());
								tableCell.prepend(errorIcon.clone());
								tableCell.prepend(blockedIcon.clone());
							} 
							else if (target.hasClass("textMessagingWrapper") || target.hasClass("blockVoiceWrapper")){
								tableCell.prepend(restrictedIcon.clone());
								tableCell.prepend(updatedIcon.clone());
								tableCell.prepend(errorIcon.clone());
								tableCell.prepend(statusPendingIcon.clone());
								//tableCell.prepend(statusErrorIcon.clone());
								
							}
							else {
								tableCell.prepend(updatedIcon.clone());
								tableCell.prepend(errorIcon.clone());
							}
							
							
							tableCell.attr("id",device.subscriberID);
							tableCell.find("div.accountPhoneContent").append(deviceSummary);
							
							// Set up hovers for ie6
							tableCell.hover(
								function() {
									$(this).addClass("hover");
								},
								function() {
									$(this).removeClass("hover");
								}
							);
							
							// flag suspended cells
							if(device.deviceCapable){
								tableCell.data("suspended",false);
							} else {
								tableCell.data("suspended",true);
								tableCell.data("suspendedToolTip",device.tooltipMessage);
							}
							
							if(device.suspended){
								tableCell.data("suspended",true);
								tableCell.data("suspendedToolTip",device.tooltipMessage);
							} 
							//(device.suspended)?tableCell.data("suspended",true):tableCell.data("suspended",false);
							
							if(currentAccount == "deviceUser"){
								target.data("deviceUser",true);
								if(device.isBlocked && device.isBlocked[0] == 1){
									tableCell.addClass("blocked");
									tableCell.data("isBlocked",true);
								}
							}
							
							if(i % 2 == 0){
								//create new table row, left column table cell, and spacer
								//var leftColumnCell = $('<td class="myDeviceColumn" id="'+device.subscriberID+'"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
								subscriberTableRow = $('<tr></tr>');
								subscriberTableRow.append(tableCell).append(separator.clone());
								if(deviceData.devices.length -1 == i){
									//check if this is the last device and create empty right column cell and append table row
									subscriberTableRow.append(emptyCell.clone());
									subscriberTableTbody.append(subscriberTableRow);
								}
							} else {
								//create right column table cell and append table row
								subscriberTableRow.append(tableCell);
								subscriberTableTbody.append(subscriberTableRow);
							}
						}
						
						//insert the table into the DOM
						target.html(subscriberTable);
						
						//apply ellipsis plugin to user names
						truncateCells(target);
						
						//if device limit flag is true (more than 100 subscribers) then show warning message
						if(deviceData.isDeviceLimit){
							//showErrorMessage(deviceData.deviceLimitMessage);
							$("#deviceLimitMsg").show();
						}
						
					} else {
						//append no devices available message and device list if applicable
						var noResultsText = "";
						if(deviceData.message){
							noResultsText += deviceData.message;
						}
						if(deviceData.itemList){
							noResultsText += "<b>" + deviceData.itemList + "</b>";
						}
						var noResultsMsg = $('<p>'+noResultsText+'</p>');
						target.html(noResultsMsg);
						$("#btnSubmitPreferencesModal").addClass("disabled");
						$("#btnSubmitPreferencesModal").unbind("click").bind("click", function(event) {event.preventDefault();});
					}
					expandBlockingLayer();
				},
				error: Sprint.fn.ajaxError
			});
			return subscriberData;
		}
		Sprint.fn.getBulkAccount =  function(target, result){
				var currentAccount;
				var subscriberData;
				if($("#selfrmPrefSelectAccount").length > 0){
					currentAccount = Sprint.fn.getURLParameter(Sprint.fn.getQueryString($("#selfrmPrefSelectAccount option:selected").val()), "account").toLowerCase();
				} else {
					currentAccount = "deviceUser";
				}
			//assign the result to deviceData to be accessible later
				deviceData = result;
				subscriberData = result;
				if(deviceData.devices){
					var deviceCount = deviceData.devices.length;
				} else {
					var deviceCount = 0;
				}
				
				if(deviceCount > 0){
					//parse results
					//var subscriberTable = $('<table id="manageUserRequests"><tbody class="myDeviceTableBody'+tbodyClass+'"></tbody></table>');
					var subscriberTable = target.find("table#manageUserRequests");
					var subscriberTableTbody = subscriberTable.find("tbody.myDeviceTableBody");
					var subscriberTableRow;
					var subscriberTableCell = $('<td class="myDeviceColumn"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
					var separator = $('<td class="separator"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
					var emptyCell = $('<td class="emptyCell"><img src="/global/images/template/common/pixel.gif" width="21px" alt="" /></td>');
					
					//icon elements
					var updatedIcon = $('<div class="accountPhoneUpdated">' +
											  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.updated")+'" />'+
											  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.updated")+'</span></div>');
					var errorIcon = $('<div class="accountPhoneError">' +
												'<img src="/global/images/icons/ico_error_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.errorText")+'" />'+
												'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.error")+'</span></div>');
					var selectedIcon = $('<div class="accountPhoneSelected">' +
											  '<img src="/global/images/icons/ico_confirmation_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.selected")+'" />'+
											  '<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.selected")+'</span></div>');
					var blockedIcon = $('<div class="accountPhoneBlocked">' +
												'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.blocked")+'" />'+
												'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.blocked")+'</span></div>');
					var restrictedIcon = $('<div class="accountPhoneRestricted">' +
												'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.restricted")+'" />'+
												'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.restricted")+'</span></div>');
					var statusErrorIcon = $('<div class="accountPhoneStatusError">' +
												'<img src="/global/images/icons/ico_ac_error_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.statusError")+'" />'+
												'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.statusError")+'</span></div>');
					var statusPendingIcon = $('<div class="accountPhoneStatusPending">' +
												'<img src="/global/images/icons/accountcontrols/ico_ac_pending_sml.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.statusPending")+'" />'+
												'<br /><span>'+Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.statusPending")+'</span></div>');
					for (var i=0; i<deviceCount; i++) {
						var device = deviceData.devices[i];
						var validPtn = '';
						if(device.deviceNumber.length == 10){
							var ptnNum = device.deviceNumber;
							validPtn = '('+ptnNum.substr(0,3)+')&nbsp;'+ptnNum.substr(3,3)+'-'+ptnNum.substr(6,4);
						}else{
							validPtn = device.deviceNumber;
						}
						var deviceSummary = $('<table><tr><td class="phoneImage"><img src="'+device.imageURL+'" class="pngFix" alt="'+device.deviceType+'" /></td><td class="phoneInfo"><div class="userName"><strong class="name">'+device.firstName+'</strong> <strong class="name">'+device.lastName+'</strong></div><div class="deviceNumber" style="display:none;">'+device.deviceNumber+'</div><div class="devicePhone">'+validPtn+'</div><div class="deviceType">'+device.deviceType+'</div></td></tr></table>');
						
						var tableCell = subscriberTableCell.clone();
						if (target.hasClass("blockDataAccessWrapper") || target.hasClass("blockPictureMailWrapper") || target.hasClass("blockPermissionsWrapper")) {
							tableCell.prepend(selectedIcon.clone());
							tableCell.prepend(errorIcon.clone());
							tableCell.prepend(blockedIcon.clone());
						} 
						else if (target.hasClass("textMessagingWrapper") || target.hasClass("blockVoiceWrapper") || target.hasClass("directConnectWrapper")){
							tableCell.prepend(restrictedIcon.clone());
							tableCell.prepend(updatedIcon.clone());
							tableCell.prepend(errorIcon.clone());
							tableCell.prepend(statusPendingIcon.clone());
							//tableCell.prepend(statusErrorIcon.clone());
							
						}
						else {
							tableCell.prepend(updatedIcon.clone());
							tableCell.prepend(errorIcon.clone());
						}
						
						
						tableCell.attr("id",device.subscriberID);
						tableCell.find("div.accountPhoneContent").append(deviceSummary);
						
						// Set up hovers for ie6
						tableCell.hover(
							function() {
								$(this).addClass("hover");
							},
							function() {
								$(this).removeClass("hover");
							}
						);
						
						// flag suspended cells
						if(device.deviceCapable){
							tableCell.data("suspended",false);
						} else {
							tableCell.data("suspended",true);
							tableCell.data("suspendedToolTip",device.tooltipMessage);
						}
						
						if(device.suspended){
							tableCell.data("suspended",true);
							tableCell.data("suspendedToolTip",device.tooltipMessage);
						}
						//(device.suspended)?tableCell.data("suspended",true):tableCell.data("suspended",false);
						
						if(currentAccount == "deviceUser"){
							target.data("deviceUser",true);
							if(device.isBlocked && device.isBlocked[0] == 1){
								tableCell.addClass("blocked");
								tableCell.data("isBlocked",true);
							}
						}
						
						if(i % 2 == 0){
							//create new table row, left column table cell, and spacer
							//var leftColumnCell = $('<td class="myDeviceColumn" id="'+device.subscriberID+'"><div class="accountPhoneTop"></div><div class="accountPhoneContent"></div><div class="accountPhoneBottom"></div></td>');
							subscriberTableRow = $('<tr></tr>');
							subscriberTableRow.append(tableCell).append(separator.clone());
							if(deviceData.devices.length -1 == i){
								//check if this is the last device and create empty right column cell and append table row
								subscriberTableRow.append(emptyCell.clone());
								subscriberTableTbody.append(subscriberTableRow);
							}
						} else {
							//create right column table cell and append table row
							subscriberTableRow.append(tableCell);
							subscriberTableTbody.append(subscriberTableRow);
						}
						//alert(subscriberTableRow.html());
					}
					
					//insert the table into the DOM
					//subscriberTableTbody.append(subscriberTable);
					
					//apply ellipsis plugin to user names
					truncateCells(target);
					
					//if device limit flag is true (more than 100 subscribers) then show warning message
					if(deviceData.isDeviceLimit){
						//showErrorMessage(deviceData.deviceLimitMessage);
						$("#deviceLimitMsg").show();
					}
					if(!deviceData.areMore){
						//showErrorMessage(deviceData.deviceLimitMessage);
						$("#subscriberListWrapper").before("<input type=\"hidden\" name=\"hid_isSubListComplete\" id=\"hid_isSubListComplete\" value=\"true\" />");
					}
					
					
					
					
				} 
			return subscriberData;
		}
		//modal helper functions
		
		//TODO: set url to hidden input value or form action
		// function to fetch single subscriber details and return JSON object
		// cell argument accepts either element id as string or jQuery object
		function getSubscriberDetails(cell, option){
			var subscriberData;
			var subscriberID;
			var ajaxData = "";
			
			if(typeof(cell) == "string"){
				subscriberID = cell;
			} else {
				subscriberID = cell.attr("id");
				//add mdn number to ajax data for block texts and block voice
				if(cell.find("input.hidMdnNum").val().length > 0){
					ajaxData += cell.find("input.hidMdnNum").serialize() + "&";
				}
			}
			
			ajaxData += "form=" + $("#frmPreferences").attr("class") + "&subscriberID=" + subscriberID + "&option=" + option;
			
			$.ajax({
				data: ajaxData,
				dataType: "json",
				type: "POST",
				url: $("#ajaxUrlForAccountSubsDetails").val(), //change by Pankaj Gupta
				async: false,
				success: function(data){
					subscriberData = data;
				},
				error: Sprint.fn.ajaxError
			});
			return subscriberData;
		}
		
		// function to fetch subscriber details and return JSON object
		function getPageDetails(subscriberIDs){
			var subscriberData;
			var ajaxData = "form=" + $("#frmPreferences").attr("class") + '&subscriberIDs=' + subscriberIDs;
			
			// Add MDN numbers for block permissions
			if($("#frmPreferences").hasClass("blockPermissions")){
				var cells = $("#manageUserRequests td.myDeviceColumn:visible");
				cells.each(function(){
					var cell = $(this);
					ajaxData += "&mdn_"+ cell.attr("id") +"="+ cell.find("div.deviceNumber").text();
				});
			}
			
			$.ajax({
				data: ajaxData,
				dataType: "json",
				type: "POST",
				url: $("#ajaxUrlForAccountSubsDetails").val(), //change by Pankaj Gupta
				async: false,
				success: function(data){
					subscriberData = data;
				},
				error: Sprint.fn.ajaxError
			});
			return subscriberData;
		}
		
		function blockCell(cell,tooltipMessage){
			if(!cell.hasClass("blocked")){
				updateCell(cell,"reset");
				var cellId = cell.attr("id");
				cell.addClass("blocked");
				var blockedIcon = $('<div class="currentAccountPhone">'+
										'<a href="#footnote_phoneID_'+cellId+'" class="footnoteAnchor">'+
											'<img src="/global/images/icons/ico_blocked.gif" alt="'+Sprint.fn.getContentString("mySprint.imageAltTags.blocked")+'" /><br />'+
										Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.blocked")+'</a>'+
										'<div class="footnotes" id="footnote_phoneID_'+cellId+'" style="display:none">'+
											tooltipMessage +
										'</div>'+
									'</div>');
				if (cell.hasClass("active")){
					//this cell may have been made active by clicking on the Quick Fill checkbox. If so remove data
					cell.removeClass("active").find("div.accountPhoneUpdated").hide();
					cell.find("input:hidden").remove();
				}
				cell.prepend(blockedIcon);
				cell.find("a.footnoteAnchor").tooltip();
			}
		}
		
		function updateCell(cell,state){
			//helper function to update the parent table cell's status based on the email input status
			//possible state values are "updated", "error", "reset", "serverError"
			switch(state) {
				case "updated":
					if(cell.hasClass("emailError")){
						cell.removeClass("emailError");
					}
					if(cell.hasClass("serverError")){
						cell.removeClass("serverError");
					}
					cell.destroyTooltip();
					cell.addClass("active");
					break;
				case "error":
					if(cell.hasClass("serverError")){
						cell.removeClass("serverError");
					}
					cell.addClass("active emailError");
					break;
				case "serverError":
					cell.addClass("serverError");
					break;
				case "reset":
					cell.removeClass("active emailError serverError");
					cell.destroyTooltip();
					break;
			}
		}
		
		function disableCell(cell,tooltipMessage,state){
			switch(state) {
				case "error":
					//cell.addClass("error").removeClass("active selected").unbind("click");
					cell.addClass("error").removeClass("active selected");
					break;
				case "readonly":
					cell.addClass("readonly").removeClass("active");
					break;
				case "reset":
					cell.removeClass("readonly error");
					cell.destroyTooltip();
					break;
				default:
					cell.addClass("disabled").removeClass("active selected");
			}
			
			//add tooltip to cell
			if(tooltipMessage.length > 0){
				cell.attr("tooltipCustom",tooltipMessage);
				cell.tooltip();
			}
		}
		
		function toggleCell(cell){
			// toggle blocked and selected icons
			var selectedIcon = cell.find("div.accountPhoneSelected");
			var blockedIcon = cell.find("div.accountPhoneBlocked");
			
			if(selectedIcon.is(":visible")){
				cell.removeClass("active");
			} else if (blockedIcon.is(":visible")){
				selectedIcon.find("span").text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.unblock"));
				cell.addClass("active");
			} else {
				cell.addClass("active");
				selectedIcon.find("span").text(Sprint.fn.getContentString("mySprint.myPreferences.preferencesModal.selected"));
			}
			
			var currentStatus;
			if(cell.data("isBlocked")){
				currentStatus = "unblock";
			} else {
				currentStatus = "block";
			}
			
			var bPhones  = $("#txtBlockedPhones").val();
			var phoneID =  cell.attr("id").replace(/phoneID_/, "");
			var phoneID1 =  phoneID + ":" +currentStatus;
			var phoneID2 = "," + phoneID + ":" +currentStatus;
			var phoneID3 = phoneID + ":" +currentStatus + ",";
			
			if(cell.hasClass("active")){
				// Add the phone ID for the selected phone from the list of blocked phones
				if (bPhones.search(phoneID1) == -1) {
					if (bPhones == "") {
						bPhones = phoneID1;
					}
					else {
						bPhones += phoneID2;
					}
				}
			} else {
				// Remove the phone ID for the deselected phone from the list of blocked phones
				if (bPhones.search(phoneID2) > -1) {
					bPhones = bPhones.replace(phoneID2, "");
				}
				else if (bPhones.search(phoneID3) > -1) {
					bPhones = bPhones.replace(phoneID3, "");
				}
				else {
					bPhones = bPhones.replace(phoneID1, "");
				}
			}
			$("#txtBlockedPhones").val(bPhones);
		}
		
		function updateCellStatus(cell, radioVal){
			var originalSelectionVal = cell.find("input.hidOriginalOption").val();
			
			if(radioVal == originalSelectionVal){
				if(radioVal == "BlockSelected" || radioVal == "AllowSelected"){
					compareLists(cell);
				} else {
					cell.removeClass("active");
				}
			} else {
				cell.removeClass('statusError');
				updateCell(cell,"updated");
			}
		}
		
		function compareLists(cell){
			// helper function to compare blocked/allowed lists to original data
			var itemListString;
			if($("#frmPreferences").hasClass("blockTexts") || $("#frmPreferences").hasClass("bulkBlockTexts")){
				itemListString = cell.find("input.hidItemList").val();
			} else if($("#frmPreferences").hasClass("blockVoice") || $("#frmPreferences").hasClass("bulkBlockVoice")){
				itemListString = cell.find("input.hidBlockList").val();
			} 
			
			if(cell.data("originalItemList") != ""){
				if(itemListString == cell.data("originalItemList")){
					cell.removeClass("active");
					return;
				}
				
				var itemListSorted = itemListString;
				if (itemListString.lastIndexOf(",") > 0){
					var itemListArray = itemListString.split(",").sort();
					itemListSorted = itemListArray.join(",");
				}
				
				if(itemListSorted == cell.data("originalItemList")){
					cell.removeClass("active");
				} else {
					updateCell(cell,"updated");
				}
			} else {
				// need to add updated state to cells that may not have an originalItemList
				updateCell(cell,"updated");
			}
		}
		
		function sortQueryString(string){
			//TODO: expose field, reverse, and primer to parent function if needed
			
			var sort_by = function(field, reverse, primer){
				//Use "KEY" as field argument to sort arrays by their key name instead of key values
				//primer can be used to sort by number instead of alpha, or manipulate values being sorted before sort
				//e.g. primer = parseInt
				//e.g. primer = function(a){return a.toLowerCase()}
				
				reverse = (reverse) ? -1 : 1;
				return function(a,b){
					if(field === "KEY"){
						for (key in a){
							a = key;
						}
						for (key in b){
							b = key;
						}
					} else {
						a = a[field];
						b = b[field];
					}

					if (typeof(primer) != 'undefined'){
						a = primer(a);
						b = primer(b);
					}
					
					 var returnVal = setTimeout(function(a,b){
					 	if (a<b) return reverse * -1;
						if (a>b) return reverse * 1;
						return 0;
					 }, 0);
					 
					return returnVal;
				}
			};
			var objectToArray = function(obj){
				var returnArray = new Array();
				var i = 0;
				for (key in obj){
					var thisObj = {};
					thisObj[key] = obj[key];
					returnArray[i] = thisObj;
					i++;
				}
				return returnArray;
			};
			var serializeArray = function(array){
				var returnString = "";
				for (var i=0; i<array.length; i++) {
					for (key in array[i]){
						returnString += "&" + key + "=" + array[i][key];
					}
				};
				return returnString.substring(1);
			};
			
			var tempArray = Sprint.fn.deserialize(string);
			
			tempArray = objectToArray(tempArray);
			tempArray = tempArray.sort(sort_by("KEY",false));
			
			return serializeArray(tempArray);
		}
	
		function truncateCells(container){
			var cells = container.find("td.myDeviceColumn");
			cells.each(function(){
				var cell = $(this);
				var phoneInfo = cell.find("td.phoneInfo");
				var firstName = cell.find("strong.name:first");
				var lastName = cell.find("strong.name:last");
				var phoneInfoWidth = 110; //phoneInfo.width() does not work in IE
				var firstNameWidth = firstName.width();
				var lastNameWidth = lastName.width();
				
				//truncate widths for long unbroken (no spaces) names
				if(firstNameWidth > phoneInfoWidth){
					firstName.css("display","block").ellipsis({forcedWidth:phoneInfoWidth});
				}
				if(lastNameWidth > phoneInfoWidth){
					lastName.css("display","block").ellipsis({forcedWidth:phoneInfoWidth});
				}
				
				//truncate height for long multi word names
				var userNameDiv = cell.find("div.userName");
				var phoneInfoHeight = phoneInfo.height();
				var firstNameHeight = firstName.height();
				var lastNameHeight = lastName.height();
				
				if(firstNameHeight > 14){
					if(firstNameHeight > 28 && lastName.text().length <= 0){
						firstName.addClass("multiline").css({display:"block",height:"28px"}).ellipsis({showTitle:true});
					}
					else if(lastName.text().length > 0){
						firstName.css("display","block").ellipsis();
						if(lastNameHeight > 14){
							lastName.css("display","block").ellipsis();
						}
					}
				}
				else if(lastNameHeight > 28){
					//first name fits one one line and we want to start last name on the first line as well.
					var firstNameText = firstName.text();
					var lastNameText = lastName.text();
					
					lastName.text(firstNameText + " " + lastNameText).addClass("multiline").css({display:"block",height:"28px"}).ellipsis({showTitle:true});
					
					//get text and trim out first name now that ellipsis have been applied
					var lastNameTrim = lastName.text();
					lastName.text(lastNameTrim.replace(firstNameText + " ", "")).css("display","inline");
				}
				lastName.css("display","inline");
			});
		}

	});

})(jQuery);
