gerd
11/8/2016 - 12:57 PM

createtemplateproviderProviders.js

/*
 * The Peer Groups js file would contain the logic of creating data tables for
 * the Peer Group panel in create Template Providers tab.
 * Author : turlra01
 * 
 **/
jQuery.namespace('lexisnexis.component');
lexisnexis.component.CreateTemplateProviderProviders = lexisnexis.component.tableNodes1.extend({

	/**
	 * On load initializing
	 */
	ready : function () {
		var cs = this;		
		cs.overrideFunctions();
		cs.data.tableId = cs.createTable('selectedProviders', cs.fetchResponse);
		cs.data.tableId = cs.createTable('availableProviders', cs.fetchResponse);
		
		cs.data.thresholdExceedMsg = "You have exceeded the 250 maximum number of Providers that you may add to the Selected Providers list. Please uncheck {0} name(s) from the Available Providers List";
		cs.bindMoveEvents();		
		cs.bindSearchEvents();
		cs.bindSearchEventsForDropDowns();
		cs.bindExcludeSelectedProvider();
		cs.bindDataSet();
		cs.providerSpecialties();
		cs.providerStates();
		cs.providerSubClients();
		/**
		 * Intiailizing the Validation of form elements
		 */
		//cs.validateFormElements();		
		
		LN.getPage().registerEvent(EVENT_TYPES.APPLY_BUTTON_CLICK, cs, cs.providersReload);
	},

	providersReload : function(cs) {
		cs.createTable('availableProviders', cs.fetchResponse);
		cs.createTable('selectedProviders', cs.fetchResponse);
		cs.clearOnReload();		
	},
	
	validateFormElements : function() {
/*    	$('#createTemplateForm').validate({
			focusInvalid : true,
			errorElement : 'div'
		});*/
		

	},

    displayMessage : function() {
        var cs = this;
        var msg = cs.data.thresholdExceedMsg.replace('{0}', cs.data.itemsToUncheck || 'some items from selected filter or modify the search to get apt count of');
        var msgModal = $("#selectedItemsCountMsgDiv").modal();
        msgModal.find('.modal-body').text(msg).end();     
    }, 
	
	/**
	 * Fetches the table response from the service
	 */
	fetchResponse : function(tableId) {
		var response = [];
		var sObj = [];
		var cs = this;

		if (tableId.match('availableProviders')) {
			cs.clearAvailable();
		}
		
		
		var responseObj = {
				'aoColumns' : [{
					sWidth : '5%',
					sClass : 'dt-left',
					bSortable : false,
					mRender : function(data, type, full) {
						var found = false;
						$.each(cs.data.availableCodes, function(index, obj) {
							if (obj.equals(full)) {
								found = true;
								return false;
							}
						});
						if (found) {
							return '<input type="checkbox" id="chkBox_' + data + '" value="' + data + '" checked>';
						}
						return '<input type="checkbox" id="chkBox_' + data + '" value="' + data + '">';
					}
				}, 
				{
					sWidth : '20%',
					sClass : 'dt-left',
					bSortable : false
				}, 
				{
					sWidth : '15%',
					sClass : 'dt-center',
					bSortable : false
				}, 
				{
					sWidth : '15%',
					sClass : 'dt-center',
					bSortable : false
				}, 
				{
					sWidth : '20%',
					sClass : 'dt-left',
					bSortable : false
				}, 
				{
					sWidth : '15%',
					sClass : 'dt-left',
					bSortable : false
				}, 
				{
					sWidth : '5%',
					sClass : 'dt-center',
					bSortable : false
				}, 
				{
					sWidth : '5%',
					sClass : 'dt-center',
					bSortable : false
				}],
				"sScrollXInner" : "110%",
				'dom' : 'rtiS',
				"sPaginationType" : "scrolling",
				"bDeferRender" : true,
				"paging" : true,
				"processing" : false,
				"bInfo" : false,
				's' : ['', 'Name', 'Provider ID', 'Sub-client Code', 'Specialty', 'City', 'State', 'Zip'],
				'fnDrawCallback' : function(oSettings) {
					cs.handleDrawCallback(oSettings, cs);
					cs.bindCheckboxMoveButtons('availableProviders', 'selectedProviders');
				}
		};
		
		if (tableId.match('availableProviders')) {
			var ajaxObj = {
					'ajax' : function(data, callback, settings) {
						var inputData = data;
						var startIndex = inputData.start ? inputData.start : 0;
						var searchJSON = cs.searchTermsJSON();
						var jsonString = {
								"startIndex" : startIndex,
								"searchTerms" : searchJSON
						};
						
						if (jsonString.searchTerms.ln_last_name.length < 2) {
							jsonString.searchTerms.ln_last_name = '';
						}
						LN.debug(JSON.stringify(jsonString));
						$.ajax({
							'url' : LN.getContextPath() + "/getProviderAvailableProviders" + "?dataSet=" + $('#dataSet').val(),
							'method' : 'POST',
							'dataType' : "json",
							'data' : "inputJson=" + JSON.stringify(jsonString),
							'beforeSend' : function() {
								LN.showAjaxIndicator($('#' + tableId).parent());
							},
							'complete' : function(xhr, status) {
								LN.hideAjaxIndicator($('#' + tableId).parent());
							},
							'error' : function(data) {
								LN.hideAjaxIndicator($('#' + tableId).parent());
							},
							'success' : function(data) {
								cs.data.totalRecords = data.iTotalRecords;
								
								if (cs.data.totalRecords > LN.THRESHOLD_LIMIT)
								{
									$("#availableProviders_selectAll").prop('disabled', true);
									$("#availableProviders_selectAll").attr('disabled', 'disabled');
								} 
								else
								{
									$("#availableProviders_selectAll").removeAttr('disabled');
									$("#availableProviders_selectAll").prop('disabled', false);								
								}
								callback({
									draw : inputData.draw,
									data : data.aaData,
									recordsTotal : data.iTotalRecords,
									recordsFiltered : data.iTotalRecords
								});
							}
						});
					},
					'language' : {
						"emptyTable" : "<div id=\"anyDefaultText\" class=\"text-muted pull-left\"><dfn>No match found</dfn></div>",
						"zeroRecords" : "<div id=\"anyDefaultText\" class=\"text-muted pull-left\"><dfn>No Providers Available</dfn></div>"
					}
			};
			$.extend(responseObj, ajaxObj);
		} else {
			$.extend(responseObj, {
				'aaData' : [],
				'ajax' : {
					'url' : LN.getContextPath() + "/getProviderSelectedProviders",
					'type' : 'POST',
					'dataType' : "json",
					'beforeSend' : function() {
						LN.showAjaxIndicator($('#' + tableId).parent());
					},
					'complete' : function() {
						LN.hideAjaxIndicator($('#' + tableId).parent());
					},
					'error' : function(data) {
						LN.hideAjaxIndicator($('#' + tableId).parent());
					}
				},
				"bDeferRender" : false,
				"serverSide" : false,
				'paging' : false,
				'dom': 'rt',
				'language' : {
					"emptyTable" : "<div id=\"anyDefaultText\" class=\"text-muted\"><dfn>All Providers</dfn></div>",
					"zeroRecords" : "<div id=\"anyDefaultText\" class=\"text-muted\"><dfn>All Providers</dfn></div>"
				},
				"fnRowCallback" : function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
					if (aData) {
						if (aData[8] && aData[8] == "0") {
							$(nRow).addClass('disabled');
							//$(nRow).find(':checkbox').attr('disabled', 'disabled');
						} else {
							$(nRow).removeClass('disabled');
							//$(nRow).find(':checkbox').removeAttr('disabled');
						}
					}
				}
			});
		}
		return responseObj;
	},
	
   /**
   * Bind the check box events from the source and target
   */
	bindCheckboxMoveButtons: function(source, target) {
	              var cs = this;
	              if(target) {
	                     sourceAndTargetElems = $('#' + source + ' :checkbox, #' + target + ' :checkbox');
	              }
	              else {
	                     sourceAndTargetElems = $('#' + source + ' :checkbox');
	              }
	              sourceAndTargetElems.off('change');
	              sourceAndTargetElems.on('change', function(e){
	                     e.preventDefault();
	                     
	                     Array.prototype.wrapper_fn = e.currentTarget.checked ? Array.prototype.push : Array.prototype.remove;
	                     var currentTarget = $(e.currentTarget);
	                     
	                     if(!e.currentTarget.checked) {
	                         if(cs.data.selectAllChecked[currentTarget.parents('table').attr('id')]) {
	                           cs.data.selectAllChecked[currentTarget.parents('table').attr('id')] = e.currentTarget.checked;
	                           $('#' + currentTarget.parents('table').attr('id') + '_selectAll').prop('checked', e.currentTarget.checked);
	                         }
	                       } else {
	                         var checkedBoxesLength = currentTarget.parents('table').find(':checkbox:checked').length;
	                         var totalRecords = $("#" + currentTarget.parents('table').attr('id') + " tbody tr").length;

	                         if(checkedBoxesLength == totalRecords) {
	                           cs.data.selectAllChecked[currentTarget.parents('table').attr('id')] = e.currentTarget.checked;
	                           $('#' + currentTarget.parents('table').attr('id') + '_selectAll').prop('checked', e.currentTarget.checked);
	                         }
	                       }
	                     
	                     var closestTr;
	                     if(currentTarget.parents('table').attr('id').match('available')) {
	                           cs.data.availableTable = currentTarget.parents('table').DataTable();
	                           closestTr = currentTarget.closest('tr');
	                           cs.data.availableRows.wrapper_fn(closestTr);
	                           
	                           var output = [];
	                           var n = cs.data.availableTable.row(currentTarget.closest('tr')).data();
	                           if(!(n instanceof Array)) {
	                                  /**
	                                  * Convert it to array
	                                  */
	                                  var numberOfColumns = 0;
	                                  for(key in n) {
	                                         if (!isNaN(parseInt(key)) && n.hasOwnProperty(key)) {
	                                                output.push(n[numberOfColumns]);
	                                                numberOfColumns = numberOfColumns + 1;
	                                         } 
	                                  }
	                           }
	                           else {
	                                  output = n;
	                           }
	                           cs.data.availableCodes.wrapper_fn(output);
	                           
	                           //Enable/disable move buttons
	                           if(currentTarget.parents('table').find(':checkbox:checked').length > 0){
	                           $("#providers-move-right").prop('disabled', false);
	                           }
	                           else{
	                             $("#providers-move-right").prop('disabled', true);
	                           }
	                     }
	                     else {
	                           cs.data.selectedTable = $(currentTarget).parents('table').DataTable();
	                           closestTr = currentTarget.closest('tr');
	                           cs.data.selectedRows.wrapper_fn(closestTr);
	                           cs.data.selectedCodes.wrapper_fn(cs.data.selectedTable.row(currentTarget.closest('tr')).data());
	                            
	                            //Enable/disable move buttons
	                            if(currentTarget.parents('table').find(':checkbox:checked').length > 0){
	                           $("#providers-move-left").prop('disabled', false);
	                            }
	                            else{
	                             $("#providers-move-left").prop('disabled', true);
	                            }
	                     }
	                     
	              });
	       },
	
	/**
	 * Bind all the move events to the handler
	 */
	bindMoveEvents : function() {
		var cs = this;
		var success = false;
		
		$('#availableProviders_selectAll, #selectedProviders_selectAll').on('change', function(e) {
			e.preventDefault();
			// Find the currentTarget
			var currentTarget = e.currentTarget.id;
			switch (currentTarget) {
				case 'availableProviders_selectAll' :
					var checkAll = $("#availableProviders_selectAll").prop('checked');
					if (checkAll)
					{
				        var table = $("#availableProviders").closest('table');
				        $('td input:checkbox', table).prop("checked", false);
				        $('td input:checkbox', table).click();
				        
					}
					else
					{
				        var table = $("#availableProviders").closest('table');
				        $('td input:checkbox', table).prop("checked", true);					
				        $('td input:checkbox', table).click();
					}
			        break;
				case 'selectedProviders_selectAll' :
					var checkAll = $("#selectedProviders_selectAll").prop('checked');
					if (checkAll)
					{
						var table = $("#selectedProviders").closest('table');
						$('td input:checkbox', table).prop("checked", false);
				        $('td input:checkbox', table).click();
					}
					else
					{
						var table = $("#selectedProviders").closest('table');
						$('td input:checkbox', table).prop("checked", true);
				        $('td input:checkbox', table).click();
					}
					break;
				default :
					break;
			}
		});
		
		
		$('#providers-move-left, #providers-move-right').on('click', function(e) {
			e.preventDefault();
			// Find the currentTarget
			var currentTarget = e.currentTarget.id;
			switch (currentTarget) {
				case 'providers-move-left' :
					success = cs.moveSelected('selectedProviders', 'availableProviders');
					break;
				case 'providers-move-right' :
					success = cs.moveSelected('availableProviders', 'selectedProviders');
					if (success) {
						if ($('#availableProviders').DataTable().data().length == 0) {
							$('#ln_specialty_for_providers').val('');
							$('#ln_state').val('');
							$('#ln_subclient_code').val('');
							
							cs.resetInstructionalText();							
						}
					}
					break;
				default :
					break;
			}
			if (success) {
				cs.data.moveComplete = true;
				
				var checkAll = $("#availableProviders_selectAll").prop('checked');
				if (checkAll)
				{
					$('#ln_specialty_for_providers').val('');
					$('#ln_state').val('');
					$('#ln_subclient_code').val('');
					cs.resetInstructionalText();							
				}
				cs.getProviderCountForProviders();
				$('#ln_last_name').trigger('keyup');
                cs.clearOnMove();				
			}
		});
	},
	
	clearOnReload : function() {
		var cs = this;
		// Need to determine whether to clear this on reload.
		//$("#excludeProvidersSelected").prop('checked', false);
		cs.clearOnMove();		
	},
	
    clearOnMove : function(){
    	var cs=this;
    	
        $("#availableProviders_selectAll").prop('checked', false);
        $("#selectedProviders_selectAll").prop('checked', false);
    	
        //Disable/Enable buttons
        $("#providers-move-right").prop('disabled', true);
        $("#providers-move-left").prop('disabled', true);
    	
        var table = $("#availableProviders").closest('table');
        $('td input:checkbox', table).removeAttr('checked');

        var table2 = $("#selectedProviders").closest('table');
        $('td input:checkbox', table2).removeAttr('checked');
        
 	   	cs.data.selectedCodes = [];
 	   	cs.data.selectedRows = [];
 	   	cs.data.availableCodes = [];
 	   	cs.data.availableRows = [];
    },

    clearAvailable : function(){
    	var cs=this;
    	
        $("#availableProviders_selectAll").prop('checked', false);
    	
        //Disable/Enable buttons
        $("#providers-move-right").prop('disabled', true);
    	
        var table = $("#availableProviders").closest('table');
        $('td input:checkbox', table).removeAttr('checked');

 	   	cs.data.availableCodes = [];
 	   	cs.data.availableRows = [];
    },
    
    resetInstructionalText : function() {
    	var cs=this;
    	
		$('#ln_last_name').val('').attr('placeholder','2 characters minimum');
		$('#ln_first_name').val('').attr('placeholder','1 character minimum');
		$('#ln_city').val('').attr('placeholder','3 characters minimum');
		$('#ln_zip').val('').attr('placeholder','1 character minimum');
		$('#ln_identifier_value').val('').attr('placeholder','1 character minimum');

		$("label[for = ln_last_name] ").css('display','');
		$("label[for = ln_first_name] ").css('display','');
		$("label[for = ln_city] ").css('display','');
		$("label[for = ln_zip] ").css('display','');
		$("label[for = ln_identifier_value] ").css('display','');
    },
    
    resetDropdownInstructionalText : function() {
    	var cs=this;
    	
		$('#ln_identifier_value').val('').attr('placeholder','1 character minimum');
		$("label[for = ln_identifier_value] ").css('display','');
    },
    
	/**
	 * Bind the search handler to key up events
	 */
	bindSearchEvents : function() {
		var cs = this;
		var errorFlag = false;
		$('#ln_last_name, #ln_first_name, #ln_city, #ln_zip, #ln_identifier_value').on('keyup', function(e) {
			if(!LN.isFnKeyPressed(e)){
				return false;
			}
			e.preventDefault();
			
//			var checkValid = $(e.currentTarget).valid();
			var checkValid = true;
			
			if (!checkValid) {
				var viewPopulationFiltersText = $("#ln_viewPopulationFiltersText");
				viewPopulationFiltersText.html("Please correct error(s) to proceed");
				viewPopulationFiltersText.addClass('ln-colorRed');
				errorFlag = true;
				clearTimeout(cs.timeout);
				LN.getPage().disableLeftNav();
				return false;
			} 
			else {
				LN.getPage().enableLeftNav();
				if (errorFlag) {
					cs.getProviderCountForProviders();
					errorFlag = false;
				}

				switch (this.id) {
					case "ln_last_name" :
						if (cs.data.moveComplete || this.value.length > 1 || this.value.length == 0 || (this.value.length < 2 && (e.keyCode == 8 || e.keyCode == 46))) {
							cs.clearAvailable();
							cs.data.moveComplete = false;
							cs.delay.call(cs, function() {
								LN.debug('Create Table Invoked');
								$('#availableProviders').DataTable().draw();
								$('#selectedProviders').DataTable().draw();
							}, 1000);
						}
						break;
					case "ln_first_name" :
						if (this.value.length > 0 || this.value.length == 0) {
							cs.clearAvailable();
							cs.delay.call(cs, function() {
								LN.debug('Create Table Invoked');
								$('#availableProviders').DataTable().draw();
								$('#selectedProviders').DataTable().draw();
							}, 1000);
						}
						break;
					case "ln_city" :
						if (this.value.length > 2 || this.value.length == 0) {
							cs.clearAvailable();
							cs.delay.call(cs, function() {
								LN.debug('Create Table Invoked');
								$('#availableProviders').DataTable().draw();
								//$('#selectedProviders').DataTable().draw();
							}, 1000);
						}
						break;
					case "ln_zip" :
						if (this.value.length > 0 || this.value.length == 0) {
							cs.clearAvailable();
							cs.delay.call(cs, function() {
								LN.debug('Create Table Invoked');
								cs.createTable('availableProviders', cs.fetchResponse);
								//cs.createTable('selectedProviders', cs.fetchResponse);
							}, 1000);
						}
						break;
					case "ln_identifier_value" :
						if (this.value.length > 0 || this.value.length == 0) {
							cs.clearAvailable();
							cs.delay.call(cs, function() {
								LN.debug('Create Table Invoked');
								cs.createTable('availableProviders', cs.fetchResponse);
								//cs.createTable('selectedProviders', cs.fetchResponse);
							}, 1000);
						}
						break;
				}
			}
		});
	},
	
	/**
	 * Bind the search for the drop down changes.
	 */
	bindSearchEventsForDropDowns : function() {
		var cs = this;
		$('#ln_specialty_for_providers, #ln_state, #ln_subclient_code').on('change', function(e) {
			e.preventDefault();
			cs.clearAvailable();
		    cs.delay.call(cs, function() {
		    	LN.debug('Create Table Invoked');
		    	cs.createTable('availableProviders', cs.fetchResponse);
		    	//cs.createTable('selectedProviders', cs.fetchResponse);
		    }, 1000);
		});

		// Clearing out the Identifier value no drop down change.
		$('#ln_identifier_id').on('change', function(e) {
			if ($('#ln_identifier_value').val().length > 0) {
				cs.resetDropdownInstructionalText();				
				$('#ln_identifier_value').trigger('keyup');
			}
		});

	},
	/**
	 * Bind the exclude event to the handler
	 */
	bindExcludeSelectedProvider : function() {
		var cs = this;
		$('#excludeProvidersSelected').on('click', function() {
			cs.getProviderCountForProviders();
		});
	},
		  
	bindDataSet : function() {
		var cs = this;
		$( '#dataSet' ).on( 'change', function () {
			$('#availableProviders').DataTable().draw();
			$('#selectedProviders').DataTable().settings()[0].oFeatures.bServerSide = true;
			$('#selectedProviders').DataTable().draw();
			$('#selectedProviders').DataTable().settings()[0].oFeatures.bServerSide = false;
		} );
	},
	
	
	providerSpecialties : function() {
		var cs = this;
		$.ajax({
			'method' : 'POST',
			'url' : 'getProvidersSpecialtiesForSearch',
			'contentType' : 'application/json',
			'dataType' : 'json',
			'data' : {},
    		beforeSend: function(){
    		},
			success : function(data) {
				if (data) {
					$("#ln_specialty_for_providers").empty();
					var div_data = "<option></option>";
					$(div_data).appendTo('#ln_specialty_for_providers');
					data.forEach(function(object, index, array) {
						div_data = "<option value=" + object.key + ">" + object.value + "</option>";
						$(div_data).appendTo('#ln_specialty_for_providers');
					});
				}
			},
        	complete: function(data){
        	}
			
		});
	},
	
	providerSubClients : function() {
		var cs = this;
		$.ajax({
			'method' : 'POST',
			'url' : 'getProvidersSubClientsForSearch',
			'contentType' : 'application/json',
			'dataType' : 'json',
			'data' : "",
			success : function(data) {
				if (data) {
					$("#ln_subclient_code").empty();
					var div_data = "<option></option>";
					$(div_data).appendTo('#ln_subclient_code');
					data.forEach(function(object, index, array) {
						div_data = "<option value=" + object.key + ">" + object.value + "</option>";
						$(div_data).appendTo('#ln_subclient_code');
					});
				}
			}
		});
	},
	
	providerStates : function() {
		var cs = this;
		$.ajax({
			'method' : 'POST',
			'url' : 'getProvidersStatesForSearch',
			'contentType' : 'application/json',
			'dataType' : 'json',
			'data' : "",
			success : function(data) {
				if (data) {
					$("#ln_state").empty();
					var div_data = "<option></option>";
					$(div_data).appendTo('#ln_state');
					data.forEach(function(object, index, array) {
						div_data = "<option value=" + object.key + ">" + object.value + "</option>";
						$(div_data).appendTo('#ln_state');
					});
				}
			}
		});
	},

	getSelectedProvidersData: function(){
		var cs = this;
		var selectedProviders = $( '#selectedProviders' ).DataTable().data().toArray();
		var tableData1 = SQLike.q( {
			Unpack : selectedProviders,
		    Columns : ['checkBoxValue', 'displayName', 'subClientCode', 'providerId', 'specialty', 'city', 'state', 'zip', 'grayed', 'firstName', 'lastName',
		              'alternateId']
		} );		
		return tableData1.length>0?encodeURIComponent(JSON.stringify(tableData1)):"";
	},

	getExcludedProvidersFlag: function(){
		var cs = this;
		var excludedProvidersFlag = ($( '#excludeProvidersSelected' ).is(':checked') ) ? 1 : 0;
		return excludedProvidersFlag;
	},
	
	//Method to update the Provider Count
	getProviderCountForProviders:function() {
		var cs = this;
		createTemplateJs.updatePatientCountAjax("/getProvidersCountForProviders", "&selectedProviders=" 
				 + cs.getSelectedProvidersData() + "&excludeProvidersFlag=" + cs.getExcludedProvidersFlag() + "&selDataSet=" + $('#ln_topmenu_dataset').attr("dataSetkey"));
		cs.data.moveComplete = false;
	}	
});