Liferay.TagsSelector = new Class({ /* params.instanceVar: the instance variable for this class params.hiddenInput: the hidden input used to pass in the current tags params.textInput: the text input for users to add tags params.summarySpan: the summary span tos how the current tags params.curTags: comma delimited string of current tags params.focus: true if the text input should be focused */ initialize: function(params) { var instance = this; instance._curTags = []; instance.params = params; var hiddenInput = jQuery('#' + params.hiddenInput); hiddenInput.attr('name', hiddenInput.attr('id')); var textInput = jQuery('#' + params.textInput); textInput.Autocomplete( { source: instance._getTags, delay: 0, fx: { type: 'slide', duration: 400 }, autofill: false, dataSourceType: 'json', helperClass: 'autocomplete-box', selectClass: 'autocomplete-selected', multiple: true, mutipleSeparator: ',', minchars: 1, onSelect: function(option) { if (this.createTextRange) { var value = this.value; var textRange = this.createTextRange(); textRange.moveStart('character', value.length); textRange.select(); } }, onShow: function() { jQuery(this).addClass('showing-list'); }, onHide: function() { jQuery(this).removeClass('showing-list'); } } ); instance._popupVisible = false; instance._setupSelectTags(); var addTagButton = jQuery('#' + params.addTagButton); addTagButton.click( function() { var curTags = instance._curTags; var newTags = textInput.val().split(","); jQuery.each( newTags, function (i, n) { n = jQuery.trim(n); if (curTags.indexOf(n) == -1) { if (n != "") { curTags.push(n); if (instance._popupVisible) { jQuery('input[@type=checkbox][@value$=' + n + ']', instance.selectTagPopup).attr('checked', true); } } } } ); curTags = curTags.sort(); textInput.val(''); instance._update(); } ); textInput.keypress( function(event) { if ((event.keyCode == 13) && !jQuery(this).is('.showing-list')) { addTagButton.trigger('click'); return false; } } ); if (params.focus) { textInput.focus(); } if (params.curTags != '') { instance._curTags = params.curTags.split(','); instance._update(); } Liferay.Util.actsAsAspect(window); window.before( 'submitForm', function() { var val = jQuery.trim(textInput.val()); if (val.length) { addTagButton.trigger('click'); } } ); }, deleteTag: function(id) { var instance = this; var params = instance.params; var curTags = instance._curTags; jQuery('#' + params.instanceVar + 'CurTags' + id).remove(); var value = curTags.splice(id, 1); if (instance._popupVisible) { jQuery('input[@type=checkbox][@value$=' + value + ']', instance.selectTagPopup).attr('checked', false); } instance._update(); }, _getTags: function(data) { var beginning = data.start || 0; var end = data.end || 20; data.value = data.value || ''; return Liferay.Service.Tags.TagsEntry.searchAutocomplete( { companyId: themeDisplay.getCompanyId(), name: "%" + data.value + "%", properties: "", begin: beginning, end: end } ); }, _setupSelectTags: function() { var instance = this; var params = instance.params; var ns = params.instanceVar; var input = jQuery('#' + ns + 'selectTag'); input.click( function() { instance._showSelectPopup(); } ); }, _showSelectPopup: function() { var instance = this; var params = instance.params; var ns = params.instanceVar; var mainContainer = jQuery('
'); var container = jQuery('
'); var categories = Liferay.Service.Tags.TagsProperty.getPropertyValues( { companyId: themeDisplay.getCompanyId(), key: "category" } ); jQuery.each( categories, function(i, category) { var tags = Liferay.Service.Tags.TagsEntry.search( { companyId: themeDisplay.getCompanyId(), name: '%', properties: 'category:' + category.value } ); var label = ''; jQuery.each( tags, function(j, tag) { if (j == 0) { if (i > 0) { label += ''; } label += '
' + category.value + ''; } var checked = (instance._curTags.indexOf(tag.name) > -1) ? ' checked="checked"' : ''; label += ''; } ); container.append(label); } ); var saveBtn = jQuery(''); saveBtn.click( function() { instance._curTags = []; container.find('input:checked').each( function(){ instance._curTags.push(this.value); } ); instance._update(); Liferay.Popup.close(instance.selectTagPopup); instance._popupVisible = false; } ); mainContainer.append(container).append(saveBtn); var popup = Liferay.Popup( { modal: false, height: 300, width: 400, message: mainContainer[0], onClose: function() { instance._popupVisible = false; } } ); instance.selectTagPopup = popup; instance._popupVisible = true; if (Liferay.Browser.is_ie) { jQuery('.lfr-label-text', popup).click( function() { var input = jQuery(this.previousSibling); var checkedState = !input.is(':checked'); input.attr('checked', checkedState); } ); } }, _update: function() { var instance = this; instance._updateHiddenInput(); instance._updateSummarySpan(); }, _updateHiddenInput: function() { var instance = this; var params = instance.params; var curTags = instance._curTags; var hiddenInput = jQuery('#' + params.hiddenInput); hiddenInput.val(curTags.join(',')); }, _updateSummarySpan: function() { var instance = this; var params = instance.params; var curTags = instance._curTags; var html = ''; jQuery(curTags).each( function(i, curTag) { html += ''; html += curTag + ' '; html += '[x]'; if ((i + 1) < curTags.length) { html += ', '; } html += ''; } ); var tagsSummary = jQuery('#' + params.summarySpan); tagsSummary.html(html); } });