gerd
11/8/2016 - 1:55 PM

templateLibrary.js

/**
 * This object will handle all the Template Library functionalities
 * 
 * @class lexisnexis.component.templateLibrary
 */

jQuery.namespace('lexisnexis.component');
lexisnexis.component.templateLibrary = lexisnexis.component.Table.extend({
	data : {
		searchFieldId : "#tl-name" ,
		serachAddedDate : "#tl-addedDate" ,
		serachToDate : "#tl-toDate" , 
		defaultSortColumn : "Date Added" , 
		defaultSecondarySortColumn : "Template Name" ,
		previousVal: '',
		delay : (function(){
				  var timer = 0;
				  return function(callback, ms){
					  clearTimeout (timer);
					  timer = setTimeout(callback, ms);
				  };
				})()
    },
    /**
     * 
     * @method ready
     */
    ready : function() {
        var cs = this;
        try {
        	
            $('#tl-name').val("");
            $('#tl-addedDate').val("");
            $('#tl-toDate').val("");
            cs.enableSearchOnTable( [
                {
                     id : 'tl-addedDate',
                     type : 'dateRangeStart',
                     limit : 10,
                     validate : true,
                     table : cs.data.table
                 }, 
                 {
                     id : 'tl-toDate',
                     type : 'dateRangeEnd',
                     limit : 10,
                     validate : true,
                     table : cs.data.table,
                     startDateId : 'tl-addedDate',
                     errorMsg : "The 'to' date is before the 'added' date."
                 }
          ] ); 
            
            cs.setupDateFields();
            cs.registerSearch();
            cs.setupViewBy();
            cs.initializeTable();
            cs.registerDownLoadAction();
        } catch (err) {
            LN.debug("error "+err);
        }
    },
    /**
     * search event handler
     * 
     * @method registerSearch
     */
    registerSearch: function() {
    	var cs = this;
    	$(cs.data.searchFieldId).on('keyup', function(e) {
            var isValidSearch=true;
            if (!isValidateSearch(e,cs.data.searchFieldId, false)) {
                   isValidSearch= false;
                   cs.data.previousVal = $(cs.data.searchFieldId).val();
            }
            cs.data.delay(function(){
             if(isValidSearch && isValidTextLength(cs,$(cs.data.searchFieldId).val(),3)){
                         $(cs.data.tableId).DataTable().ajax.reload(function(data){
                        	 cs.noDataCleanup(data.iTotalDisplayRecords);
                         });
              }
            }, 1000 );
        });
   
    },
    /**
     * @method setupMaxlengthForIE9
     * sets maximum length allowed for template for IE9 browser
     */
    setupMaxlengthForIE9 : function() {
        var cs = this;
        cs.data.browser = LN.getNavigatorData();
        if (cs.data.browser.is_ie9) {
            var $templatesName = $("#myTemplatesName");
            $templatesName.off("keyup keydown");
            $templatesName.on("keyup keydown", cs.handleIe9KeyEvents);
        }
    },
    handleIe9KeyEvents : function() {
        var cs = this;
        var value = $(cs).val();
        var left = 60 - value.length;
        if(left < 0) {
            $(cs).val( value.slice(0, left) );
            left = 0;
        }
    },
  
    
    /**
     * @method setupViewBy
     */
    setupViewBy : function() {
        var cs = this, txt = '', idx = -1;
        var $viewBy = $('#btn-viewby');
        var caret = $viewBy.html();
        idx = caret.indexOf("<span");
        if (idx > -1) {
            caret = caret.substring(idx);
        }
        $('#mostRecent').on('click',function() {
            txt = $(this).find('span').html();
            $viewBy.html(txt+caret);
            cs.data.defaultSortColumn="dateShared";
            cs.data.viewByClicked = "mostRecent";
            $(cs.data.table).dataTable().fnDestroy();
            cs.initializeTable();
            $("#mostPopular").removeClass('active');
            $("#mostRecent").addClass('active');
        });
        $('#mostPopular').on('click',function() {
            txt = $(this).find('span').html();
            $viewBy.html(txt+caret);
            cs.data.defaultSortColumn="downloads";
            cs.data.viewByClicked = "mostPopular";
            $("#mostRecent").removeClass('active');
            $("#mostPopular").addClass('active');
            $(cs.data.table).dataTable().fnDestroy();
            cs.initializeTable();
        });
    },

    /**
     * initializes the dataTable
     * @method initializeTable
     */
    initializeTable : function() {
        var cs = this;
        LN.debug("initializeTable called");
        var prevColumnNamesArray=cs.getCurrentColumnNamesArray();
        $(cs.data.tableId).dataTable().fnDestroy();
        cs.data.table = $(cs.data.tableId).dataTable({
        	"dom": '<>rt<"bottom"ilp>',
            "scrollY" : "400px",
            "sScrollX" : "100%",
            "sScrollXInner" : "100%",
            "scrollCollapse" : true,
            "bAutoWidth" : false,
            "bFilter" : false,
            "iTotalRecords" : "dataTableModel.iTotalRecords",
            "iDisplayLength" : 100,
            "processing" : false,
            "serverSide" : true,
            "bResponsive" : false,
            "ordering" : true,
            "bDeferRender" : true,
            "ajax" : {
                "cache" : false,
                "url" : 'getTemplateLibraryDetails',
                "method" : "POST",
                "dataType" : "json",
                "data" : function(d) {
                	var columnNamesArray = cs.getCurrentColumnNamesArray();
                    LN.debug("data called");
                    return $.extend({}, d, {
                         "columnNames"  : columnNamesArray.length > 0 ? columnNamesArray : prevColumnNamesArray ,
                         "templateName" : $('#tl-name').val() , 
                         "addedDate"    : $('#tl-addedDate').val(),
                         "toDate"       : $('#tl-toDate').val()
                    });
                },
                'beforeSend': function(xhr) {
                	cs.data.currentScrollLeft = $(cs.data.tableId).parent().scrollLeft();
                    xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
                    $('#tl-name').attr('disabled', 'disabled');
                    $('#tl-addedDate').attr('disabled', 'disabled');
                    $('#tl-toDate').attr('disabled', 'disabled');
                    cs.handleBeforeAjax(cs);
                },
                'complete' : function(obj) {
                	$.fn.DataTable.ext.pager.numbers_length = 5;
                    cs.handleAfterComplete(cs);
                    cs.addGotoPageComponentPPM("ln_template_library_list","templateLibraryTable_gotobtn","templateLibraryTableId_gototxt");
                    //$(".dataTables_info").css({"text-align":"left", "padding-left":"10px"});
                    cs.registerFilterCriteriaEvents();
                    cs.registerAddEvents();
                    cs.registerRemoveEvents();
                    $('#tl-name').removeAttr('disabled');
                    $('#tl-addedDate').removeAttr('disabled');
                    $('#tl-toDate').removeAttr('disabled');
                    cs.data.table.fnAdjustColumnSizing(false);
                    $(cs.data.tableId).parent().scrollLeft(cs.data.currentScrollLeft);
                    if (typeof cs.data.viewByClicked != 'undefined') {
                        var $tableScroll = $(cs.data.tableId).closest('div.dataTables_scroll');
                        var $tableHead = $tableScroll.find('div.dataTables_scrollHead table thead');
                        if ( cs.data.viewByClicked === "mostRecent") {
                            $tableHead.find('th[id=Date_Added]').removeClass("sort_2nd sorting").addClass("sorting_desc");
                        }
                        $tableHead.find('th[id=Template_Name]').removeClass("sort_2nd sorting").addClass("sort_2nd sorting_asc");
                        cs.data.dateSharedClicked = null;
                    }
                    cs.data.url = cs.getURL();
                }
            },
            "order" : [ 
                        [prevColumnNamesArray.indexOf(cs.data.defaultSortColumn),"desc" ],
            		    [prevColumnNamesArray.indexOf(cs.data.defaultSecondarySortColumn),"asc" ]
            		  ],
            
          "columnDefs" : [ 	
                           {
	                        	"sClass":"ln-text-align-left",
	                        	"width"  : "30%",
	            				"targets": 'Template_Name',
	            				"render" : function(data, type, row) {
				            					return ['<span class="templateName">',
				            					        data,
				            					        '</span><br/><span class="ln-downloadsColor">',
				            					        numeral(row[6]).format('(0,0)'), //Downloads
				            					        ' Downloads</span> | <a href="" onclick="return false;" class="a-filterCriteria" data-idVal="', 
				            					        row[4], //Add
				            					        '">Filter Criteria</a>'
				            					       ].join('');
	            							}
            				
                            },
                            {
                            	"sClass":"ln-text-align-left",
                            	"width"   : "30%",
                            	"targets" : 'Description'
                             },
                             {
                            	 "width"   : "10%",
                            	 "targets" :'Date_Added'
                             },
                             {
                            	 "sClass":"ln-text-align-left",
                            	 "width"   : "16%",
                            	 "targets" :'Author'
                             },
                             {
                              	"width"   : "7%",
                            	"targets" : 'Add' ,
                            	"orderable": false,
                            	"render" : function(data, type, row) {
                                        var html = "";
                                        if (data && data !== "") {
                                            html = ["<span class='fa fa-download fa-lg' data-idVal='", data, "' data-templateName='", row[0], "' ></span>"].join('');
                                        }
                                        return html;
                            	}
                             },
                             {
                               	"width"   : "7%",
                             	"targets" : 'Remove',
                             	"orderable": false ,
                             	"render" : function(data, type, row) {
                                        var html = "";
                                        if (data && data !== "") {
                                            html = ["<span class='fa fa-close fa-lg' data-idVal='", data, "'></span>"].join('');
                                        }
                                        return html;
                                }
                              },
                             {
                            	  "sClass":"ln-display-none",
                            	  "targets" : ['downloads' ,  'dateShared' ]
                             }
					       ],
            "fnPreDrawCallback" : function(oSettings) {
            	if (oSettings.aaSorting[0] && oSettings.aaSorting[0][0] !== prevColumnNamesArray.indexOf(cs.data.defaultSortColumn) ) {
            		cs.data.manualsort = true;
            	}
            	return cs.handlePreDrawCallback(oSettings, cs);
            },
            "fnDrawCallback" : function(oSettings) {
                cs.handleDrawCallback(oSettings, cs);
            },
            // Function called for dataTables
            "fnInitComplete" : function(oSettings, json) {
                cs.handleInitComplete(oSettings, cs);
            }
        });
        cs.data.table.on( 'column-sizing.dt', function ( e, settings, details ) {
            //cs.adjustFixedColumnRowHeights(cs);
        });
    },
    
   
    
    
    /**
     * This Method will generate the Active Filter Summary
     * @method registerFilterCriteriaEvents
     */
    registerFilterCriteriaEvents : function() {
        var $filterElem = $('table tr td a.a-filterCriteria');
        $filterElem.on('click',function(e) {
        	e.preventDefault();
        	var templateId = $(this).attr('data-idVal') ; 
			var cs = this;
			$.ajax({
				cache : false,
				'data':{
					"templateId" : templateId 
				},
				'url' : LN.getContextPath() + "/getTemplateLibraryActiveFilterSummary",
				'method' : 'post',
				beforeSend : function(xhr) {
					$("#activeFiltersModal").html("");
	            },
				'success' : function(data, textStatus, jqXHR) {
					try {
						LN.debug(data);
						$( 'div#moreFiltersDialog' ).modal('show');
						$("#activeFiltersModal").html(data);
					} catch (err) {
						// growl the error
						LN.debug("Error in getting the Active Filter message: "+ err);
					}
				}
			});
			
        })
    },

    registerRemoveEvents : function() {
        var cs = this;
        var $removeElem = $('table tr td span.fa-close');
        $removeElem.on('click',function(e) {
            var $this = $(this);
            var templateId = $this.attr('data-idVal');
            e.preventDefault();
            var dataSet = $(cs.data.dataSetId).val();
            $.ajax({
                cache : false,
                method : "POST",
                dataType : "json",
                url : "removeTemplateFromLibrary" ,   
                data : {
                	'templateId' : templateId  
                },
                beforeSend : function(xhr) {
                    cs.data.currentScrollLeft = $(cs.data.tableId).parent().scrollLeft();
                    xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
                    $('#tl-name').attr('disabled', 'disabled');
                    $('#tl-addedDate').attr('disabled', 'disabled');
                    $('#tl-toDate').attr('disabled', 'disabled');
                    cs.handleBeforeAjax(cs);
                }
            })
            .complete(function(data) {
                $('#tl-name').removeAttr('disabled');
                $('#tl-addedDate').removeAttr('disabled');
                $('#tl-toDate').removeAttr('disabled');
                if (typeof data.success != 'undefined') {
                	 $.growl({
                         title: "",
                         message: "The removing of template from library was successful."
                     });
 	                $(cs.data.table).dataTable().fnDestroy();
 	                cs.initializeTable();
                } else {
                    $.growl({
                        title: "",
                        message: "An error occurred while removing the template."
                    });
                }
            });
        });
    },

    setupDateFields : function(){
        var cs = this,
            $addedDate = $('#tl-addedDate'),
            $toDate = $('#tl-toDate'),
            $addedDatePicker = $('#tl-addedDatePicker'),
            $toDatePicker = $('#tl-toDatePicker');
        // Clear any residual error messages.
        $('#errorMessage').text('');
        $addedDate.val("");
        $toDate.val("");

        // Keep the datetimepicker logic after the input field's associated with the date pickers are populated.
        // This is necessary to set up the date pickers properly with respect to the popup calendars initial dates.
        $addedDatePicker.datetimepicker({
            //Decided to not force a max date on this field to allow for a better user experience.
            //The date picker behaves very assertive when enforcing the max date when set.  It corrects
            //the date by reestablishing the original date prior to the typing that made it exceed the max.
            //This behavior is not acceptable. However, there is logic that determines whether to enable
            //or disable the SAVE button that will take care of the max date issue. This line was commented out:
            //maxDate : moment(currentDate.setMonth(currentDate.getMonth() + 12)),
            format : 'MM/DD/YYYY',
            useCurrent : false
        });
        $toDatePicker.datetimepicker({
            format : 'MM/DD/YYYY',
            useCurrent : false
        });
        $addedDatePicker.on("dp.change",function (e) {
            if (e.date == null) {
                return false;
            }
            e.date.hours(0);
            e.date.minutes(0);
            e.date.seconds(0);
            e.date.milliseconds(0);
            $toDatePicker.data("DateTimePicker").minDate(e.date);
            if ($addedDate.attr('data-currentDate') === ""+cs.parseDate($addedDate.val())) {
                $addedDate.removeClass('disableKeyUpEvent').addClass('disableKeyUpEvent');
            }
        }).on("dp.hide",function (e) {
            $(e.currentTarget).find('input').keyup();
        }).on("dp.show",function (e) {
            var elem = $(e.currentTarget).find('input');
            if(elem.val() != ''){
                var value = cs.parseDate(elem.val());
                $addedDate.attr('data-currentDate',cs.parseDate($addedDate.val()));
                $(e.currentTarget).data('DateTimePicker').date(moment(value));
            }
        });
        $toDatePicker.on("dp.change",function (e) {
            if (e.date == null) {
                return false;
            }
            var addedDate = cs.parseDate($addedDate.val());
            e.date.hours(0);
            e.date.minutes(0);
            e.date.seconds(0);
            e.date.milliseconds(0);
            if(addedDate !=null ) { 
                if(e.date.isBefore(addedDate)) {
                    $toDatePicker.data("DateTimePicker").minDate(e.date);
                } else {
                    $toDatePicker.data("DateTimePicker").minDate(addedDate);
                }
            }
            if ($toDate.attr('data-currentDate') === ""+cs.parseDate($toDate.val())) {
                $toDate.removeClass('disableKeyUpEvent').addClass('disableKeyUpEvent');
            }
        }).on("dp.hide",function (e) {
            $(e.currentTarget).find('input').keyup();
        }).on("dp.show",function (e) {
            var elem = $(e.currentTarget).find('input');
            if(elem.val() != ''){
                var value = cs.parseDate(elem.val());
                $toDate.attr('data-currentDate',cs.parseDate($toDate.val()));
                $(e.currentTarget).data('DateTimePicker').date(moment(value));
            }
        });
        $('#tl-addedDate-error').hide();
        $('#tl-toDate-error').hide();

       // Fire keyup events to allow validation of the programmatically set dates.
       // $('#tl-addedDate').keyup();
       // $('#tl-toDate').keyup();
    },
    getJSONDate : function(dateString){
        var dateArgs = dateString.match(/\d{1,4}/g),
        year = dateArgs[2],
        month = parseInt(dateArgs[0]) - 1,
        day = dateArgs[1],
        hour = 2,
        minutes = 0;
        var d = new Date(year,month,day,hour,minutes);
        d.setFullYear(year);
        return d.toJSON();
    },
    getDateAsString : function(dateObj){
        var date = dateObj != null ? dateObj : new Date();
        var month = date.getMonth()+1;
        var mPad = month < 10 ? '0' : '';
        var day = date.getDate();
        var dPad = day < 10 ? '0' : '';
        return [mPad,month,'/',dPad,day,'/',date.getFullYear()].join('');
    },
    parseJSONDate : function(value) {
        if (typeof value === 'string') {
            var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)\+(\d{4})$/.exec(value);
            if (a) {
                var dt = new Date(Date.UTC(a[1], a[2] - 1, a[3], a[4], a[5], a[6]));
                dt.setFullYear(a[1]);
                return dt;
            }
        }
        return value;
    },
    parseDate : function(dateObj){
        var cs = this;
        var date = dateObj != null ? dateObj : cs.getDateAsString(new Date());
        var pattern = /^([0]?[1-9]|[1][0-2])[/]([0]?[1-9]|[1|2][0-9]|[3][0|1])[/]([0-9]{1,4})$/;
        var found = date.match(pattern);
        var value = null;
        if (found != null) {
            value = new Date();
            value.setFullYear(found[3]);
            value.setMonth(found[1]-1);
            value.setDate(found[2]);
            value.setHours(0);
            value.setMinutes(0);
            value.setSeconds(0);
            value.setMilliseconds(0);
        }
        return value;
    },
    
    
    registerAddEvents : function() {
        var cs = this;
        var $addElem = $('span.fa-download');
        $addElem.on('click',function(e) {
        	e.preventDefault();
	    	LN.debug( "templateName ..."+ templateId) ;
	    	var templateId= $(this).attr("data-idval") ; 
	    	var templateName= $(this).attr("data-templateName") ;
	    	var dataSetId = $("#ln_topmenu_dataset").attr("datasetkey") ;
	    	$.ajax({
	      		  url: LN.getContextPath()+'/validateSubClientPermissions',
	      		  data: {  templateId: templateId,
	      			  	   dataSetId: dataSetId
	      			  	},
	      		  async: false,
	      		  method : 'post',
	      		  cache:true,
	      		  dataType : "json",
	      		  success: function(data){
	             	$("#templateId").val(templateId);
	             	$("#templateName").val(templateName);
	             	$('#addToMyTemplatesModal').modal({ 
	     	    		backdrop : 'static',
	     	    		keyboard: 'false'
	    	    	 });
	      			if(data) { 
	      				$("#ln-errorMsgSaveTemp").html("This template will be modified to match your sub-client permissions."); 
	      			}
	      		  }	
	       	 });  
        	    
        });
    },
    
    
    registerDownLoadAction : function() { 
    	var cs = this; 
	   	$("#addToMyTemplatesSave").on("click", function(e) {
	   		 if(cs.validateDownLoad(cs)){
	   			 cs.saveTemplateFromLibrary();
	   			 $(".ln-errorMsgTemplateLibrary").html("");
	   		 }
	   	});
	   	 
	   	$("#addToMyTemplatesCancel,#addToMyTemplatesCross").on("click", function(e) {
	   		cs.clearAddToTemplateModal() ; 
	   	});
    },
    
    clearAddToTemplateModal : function () { 
    	 $('#templateName').val("");
   		 $('#ln-errorMsgSaveTemp').html("");
   		 $("#addToMyTemplatesModal .error").html("");
   		 $("#addToMyTemplatesModal").removeClass("error");
   		 $("#addToMyTemplatesModal").modal('hide');
    },
    
    validateDownLoad: function(cs) { 
        var name = $('#templateName').val();
        if (!isValidateSearch(this.event,'#templateName', false)) {
        	return false ; 
        }
        if(name.trim()=="") {
            $("#ln-errorMsgSaveTemp").html("Template name cannot be empty.");
            return false;
        } else {
            return true;
        }
    },
    
    saveTemplateFromLibrary : function(isPermissionChanged) { 
    	var cs = this;  
    	var templateId = $('#templateId').val()
    	var templateName  = $('#templateName').val();
         var dataSetId =  $("#ln_topmenu_dataset").attr("datasetkey") ;
         $.ajax({
             cache : false,
             method : "POST",
             dataType : "json",
             url : "addTemplateFromLibrary",
             data : {
                 "templateName" : templateName , 
                 "templateId"   : templateId , 
                 "dataSetId": dataSetId
             },
             beforeSend : function(xhr) {
                 xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
             }
         })
         .done(function(data, textStatus, jqXHR) {
             LN.debug("Inserted Template into My Templates");
             if(data && typeof data.error != "undefined"){
                 $('#ln-errorMsgSaveTemp').html(data.error);
             } else {
                 $.growl({
                     title: "",
                     message: ['Template "'+templateName+'" was added to your My Templates page.', ""].join()
                 });
                 $(cs.data.table).dataTable().fnDestroy();
	             cs.initializeTable();
                 cs.clearAddToTemplateModal();
             }
         })
         .error(function(jqXHR, textStatus, errorThrown) {
             LN.debug("Add to My Templates Insertion Failed");
         });
    }, 
    
    
    /**
     * @class templateLibrary
     * @method enableSearchOnTable
     * @description Searches the table by reloading the table with the ajax.<br>
     * Currently, if validation is enabled then basic validation for name fields will be done.<br>
     * Can be modified further to support almost all validations<br>
     */
    enableSearchOnTable : function(obj) {
        var cs = this;
        var errorFlag = false;
        cs.data.searchFields = obj;
        if (typeof obj != 'undefined' && obj.length > 0) {
            $("#"+obj[0].id).closest('form').validate( {
                focusInvalid : true,
                errorPlacement : function(error, element) {
                    var $elem = $(element), targetElem = element,
                        errorId = $elem.attr('data-idVal');
                    if (typeof errorId != 'undefined') {
                        var $eElement = $('#'+errorId);
                        element = $eElement.length > 0 ? $eElement[0] : element;
                    }
                    error.insertAfter(element);
                },
                errorElement : 'div'
            } );
        }

        $.validator.addMethod("dateValidator", function(value, element) {
            var pattern = /^([0]?[1-9]|[1][0-2])[/]([0]?[1-9]|[1|2][0-9]|[3][0|1])[/]([0-9]{4})$/;
            $("#errorMessage").text('');
            return value === "" || pattern.test(value);
           }, "Please enter date using the format MM/DD/YYYY.");
        $.each(obj, function(index, searchBox) {
            var that = searchBox;
            var $that = $('#' + that.id);
            if (typeof searchBox.type !== 'undefined') {
                if (searchBox.type === 'dateRangeStart') {
                    $.validator.addMethod("dateRangeStartValidator", function(value, element) {
                        if(value == null){
                            return false;
                        } else if (value === "") {
                            return true;
                        }
                        var currentDate = new Date();
                        var enteredDate = cs.parseDate(value);
                        return(enteredDate <= currentDate);
                       }, "Please enter a date not to exceed today's date.");
                    if(that.validate) {
                        $that.rules( 'add', {
                            required : false,
                            maxlength : 10,
                            dateValidator : true,
                            dateRangeStartValidator : true
                        } );
                    }
                } else if (searchBox.type === 'dateRangeEnd') {
                    var errorMsg = "The end date is before the start date.";
                    if (typeof searchBox.errorMsg !== 'undefined') {
                        errorMsg = searchBox.errorMsg;
                    }
                    $.validator.addMethod("dateRangeEndValidator", function(value, element) {
                        if(value == null){
                            return false;
                        } else if (value === "") {
                            return true;
                        }
                        var enteredDate = cs.parseDate(value);
                        var startDate = cs.parseDate($('#'+searchBox.startDateId).val());
                        return !(enteredDate < startDate);
                       }, errorMsg);
                    if(that.validate) {
                        $that.rules( 'add', {
                            required : false,
                            maxlength : 10,
                            dateValidator : true,
                            dateRangeEndValidator : true
                        } );
                    }
                } else if (searchBox.type === 'nospecialcharForName') {
                    if(that.validate) {
                        $that.rules( 'add', {
                            required : false,
                            nospecialchar : true,
                            nonumber : true
                        } );
                    }
                }
            } else {
                if(that.validate) {
                    $that.rules( 'add', {
                        required : false,
                        nospecialchar : true
                    } );
                }
            }
           
            $that.on('keyup', function(e) {
                //DE1988 - The Available box in the filter gets refreshed for key down events Starts
                if(!LN.isFnKeyPressed(e)){
                    return false;
                }
                //DE1988 - The Available box in the filter gets refreshed for key down events Ends
                cs.data.initialize = false;
                var keycode = e.keyCode;
                var enteredValue = this.value === $(this).attr('placeholder') ? '' : this.value;
                if(that.validate) {
                    if(!$(this).closest('form').valid()) {
                        return false;
                    }
                }
                var $target = $("#"+e.currentTarget.id);
                if ($target.hasClass('disableKeyUpEvent')) {
                    $target.removeClass('disableKeyUpEvent');
                    return false;
                }
                cs.data.searchDone = enteredValue.length == 0 ? false : true;
                cs.data.ajaxreload = true;
                if ( that.limit ) {
                	if ( enteredValue.length >= that.limit || ( (enteredValue.length == that.limit - 1 || enteredValue.length == 0)  && ( keycode == 8 || keycode == 46 ) ) ) {
                		cs.data.delay(function(){
                            cs.data.table.fnReloadAjax(LN.getContextPath()+'/getTemplateLibraryDetails');
                        }, 1000 );
                    }
                } 
            });
        });
    }
    
   	
});// end class