/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ //Define global variable to store last auto-completer request object (jqXHR). var LAST_AUTOCOMP_REF = null; //default ajax request timeout in milliseconds var AJAX_REQUEST_TIMEOUT = 5000; // Add observers on DOM ready. $(document).ready(function() { // bindObservers will add observer on passed html section when DOM is ready. bindObservers("body"); }); /* bindObservers function contains the code of adding observers and it can be called for specific section as well when we need to add observer on section which is updated by Ajax. Example: bindObservers("sectionSelector"); sectionSelector can be Id, Class and Element name. */ function bindObservers(bind_element) { // Adding observer for checkboxes for select all action. jQuery(bind_element).on("click", "[type=checkbox]", function() { var action_checkbox = jQuery(this), parent_action = action_checkbox.is(".selectAll") ? action_checkbox : action_checkbox.getForm().getFormFields().filter(".selectAll"); if (parent_action.length !== 0) { addSelectAllObserver(action_checkbox); } }); // If parent checkbox is already checked on DOM ready then check its child checkboxes also. if (jQuery(".selectAll").is(":checked")) { jQuery(".selectAll").removeAttr("checked").trigger("click"); } } /* SelectAll: This utility can be used when we need to use parent and child box combination over any page. Here is the list of tasks it will do: 1. Check/ Uncheck child checkboxes when parent checkbox checked. 2. Check/ Uncheck parent checkbox when child checkboxes checked. */ // addSelectAllObserver: This function will add observers to checkboxes which belongs to select all functionality. function addSelectAllObserver(action_checkbox) { var form_fields = jQuery(action_checkbox).getForm().getFormFields(), all_child = form_fields.filter(":checkbox:not(:disabled):not(.selectAll)"), select_child = all_child.filter(".selectAllChild").size() > 0 ? all_child.filter(".selectAllChild") : all_child, parent_checkbox = form_fields.filter(".selectAll"), is_parent = action_checkbox.is(".selectAll"); if (is_parent) { // Check/ Uncheck child checkboxes when parent checked. jQuery(select_child).attr("checked", function() { return parent_checkbox.is(":checked"); }); } else { // Check/ Uncheck parent checkbox when child checkboxes checked. if (select_child.size() > 0) { var all_checked = true; select_child.each(function() { if (all_checked) { all_checked = all_checked && jQuery(this).is(":checked"); } }); // Below code is for checking or unchecking the parent checkbox if all its dependent child checkbox is checked. if (all_checked) { parent_checkbox.attr("checked", "checked"); } else { parent_checkbox.removeAttr("checked"); } } } } // getFormFields: This utility function return all form fields (inside and outside form) jQuery.fn.getFormFields = function() { var id = jQuery(this).attr("id"); if (id === undefined) { return jQuery(this).find(":input"); } else { return jQuery.merge(jQuery(this).find(":input"), jQuery(":input[form=" + id + "]")); } } // getForm: This utility function return form of the field. jQuery.fn.getForm = function() { var form_id = jQuery(this).attr("form"); // Get closest form if no form id specified else get the form using id. if (form_id === undefined) { return jQuery(this).closest("form"); } else { return jQuery("#" + form_id); } } // Check Box Select/Toggle Functions for Select/Toggle All function toggle(e) { e.checked = !e.checked; } function checkToggleDefault(e) { checkToggle(e, "selectAllForm"); } function checkToggle(e, formName) { var cform = document[formName]; if (e.checked) { var len = cform.elements.length; var allchecked = true; for (var i = 0; i < len; i++) { var element = cform.elements[i]; if (element.name.substring(0, 10) == "_rowSubmit" && !element.checked) { allchecked = false; } cform.selectAll.checked = allchecked; } } else { cform.selectAll.checked = false; } } function toggleAllDefault(e) { toggleAll(e, "selectAllForm"); } function toggleAll(e, formName) { var cform = document[formName]; var len = cform.elements.length; for (var i = 0; i < len; i++) { var element = cform.elements[i]; if (element.name.substring(0, 10) == "_rowSubmit" && element.checked != e.checked) { toggle(element); } } } function selectAllDefault() { selectAll("selectAllForm"); } function selectAll(formName) { var cform = document[formName]; var len = cform.elements.length; for (var i = 0; i < len; i++) { var element = cform.elements[i]; if ((element.name == "selectAll" || element.name.substring(0, 10) == "_rowSubmit") && !element.checked) { toggle(element); } } } function removeSelectedDefault() { removeSelected("selectAllForm"); } function removeSelected(formName) { var cform = document[formName]; cform.removeSelected.value = true; cform.submit(); } // highlight the selected row(s) function highlightRow(e,rowId){ var currentClassName = document.getElementById(rowId).className; if (e.checked) { if (currentClassName == '' ) { document.getElementById(rowId).className = 'selected'; } else if (currentClassName == 'alternate-row') { document.getElementById(rowId).className = 'alternate-rowSelected'; } } else { if (currentClassName == 'selected') { document.getElementById(rowId).className = ''; } else if (currentClassName == 'alternate-rowSelected') { document.getElementById(rowId).className = 'alternate-row'; } } } function highlightAllRows(e, halfRowId, formName){ var cform = document[formName]; var len = cform.elements.length; for (var i = 0; i < len; i++) { var element = cform.elements[i]; if (element.name.substring(0, 10) == "_rowSubmit") { highlightRow(e, halfRowId+element.name.substring(13)); } } } // popup windows functions function popUp(url, name, height, width) { popupWindow = window.open(url, name, 'location=no,scrollbars,width=' + width + ',height=' + height); } function popUpSmall(url, name) { popUp(url, name, '300', '450'); } // Post a form from a pop up using the parent window function doPostViaParent(formName) { var theForm = document[formName]; var newForm = theForm.cloneNode(true); var hiddenDiv = document.createElement('div'); hiddenDiv.style.visibility = 'hidden'; hiddenDiv.appendChild(newForm); window.opener.document.body.appendChild(hiddenDiv); newForm.submit(); window.opener.focus(); } // From a child window, navigate the parent window to the supplied url function doGetViaParent(url) { window.opener.location = url; window.opener.focus(); } // hidden div functions function getStyleObject(objectId) { if (document.getElementById && document.getElementById(objectId)) { return document.getElementById(objectId).style; } else if (document.all && document.all(objectId)) { return document.all(objectId).style; } else if (document.layers && document.layers[objectId]) { return document.layers[objectId]; } else { return false; } } function changeObjectVisibility(objectId, newVisibility) { var styleObject = getStyleObject(objectId); if (styleObject) { styleObject.visibility = newVisibility; return true; } else { return false; } } // To use this in a link use a URL like this: javascript:confirmActionLink('You want to delete this party?', 'deleteParty?partyId=${partyId}') function confirmActionLink(msg, newLocation) { if (msg == null) { msg = "Are you sure you want to do this?"; } var agree = confirm(msg); if (agree) { if (newLocation != null) location.replace(newLocation); } } // To use this in a link use a URL like this: javascript:confirmActionFormLink('You want to update this party?', 'updateParty') function confirmActionFormLink(msg, formName) { if (msg == null) { msg = "Are you sure you want to do this?"; } var agree = confirm(msg); if (agree) { if (formName != null) document.forms[formName].submit(); } } // ===== Ajax Functions - based on jQuery.js ===== // /** Update an area (HTML container element). * @param areaId The id of the HTML container to update * @param target The URL to call to update the HTML container * @param targetParams The URL parameters */ function ajaxUpdateArea(areaId, target, targetParams) { if (areaId == "window") { targetUrl = target + "?" + targetParams.replace('?',''); window.location.assign(targetUrl); return; } waitSpinnerShow(); jQuery.ajax({ url: target, type: "POST", data: targetParams, success: function(data) { jQuery("#" + areaId).html(data); waitSpinnerHide(); }, error: function(data) {waitSpinnerHide()} }); } /** Update multiple areas (HTML container elements). * @param areaCsvString The area CSV string. The CSV string is a flat array in the * form of: areaId, target, target parameters [, areaId, target, target parameters...]. */ function ajaxUpdateAreas(areaCsvString) { /*split all parameters separate by comma, the regExp manage areaId,target,param1=a¶m2={b,c,d}¶m3=e as three parameters*/ var regExpArea = /,(?=(?:[^{}]*{[^{}]*})*[^{}]*$)/g; var areaArray = areaCsvString.split(regExpArea); var numAreas = parseInt(areaArray.length / 3); for (var i = 0; i < numAreas * 3; i = i + 3) { var areaId = areaArray[i]; var target = areaArray[i + 1]; var targetParams = areaArray[i + 2]; // Remove the ? and the anchor flag from the parameters // not nice but works targetParams = targetParams.replace('#',''); targetParams = targetParams.replace('?',''); ajaxUpdateArea(areaId, target, targetParams); } } /** Update an area (HTML container element) periodically. * @param areaId The id of the HTML container to update * @param target The URL to call to update the HTML container * @param targetParams The URL parameters * @param interval The update interval, in seconds. */ function ajaxUpdateAreaPeriodic(areaId, target, targetParams, interval) { var intervalMillis = interval * 1000; jQuery.fjTimer({ interval: intervalMillis, repeat: true, tick: function(container, timerId){ jQuery.ajax({ url: target, type: "POST", data: targetParams, success: function(data) { jQuery("#" + areaId).html(data); waitSpinnerHide(); }, error: function(data) {waitSpinnerHide()} }); } }); } /** Submit request, update multiple areas (HTML container elements). * @param target The URL to call to update the HTML container * @param targetParams The URL parameters * @param areaCsvString The area CSV string. The CSV string is a flat array in the * form of: areaId, target, target parameters [, areaId, target, target parameters...]. */ function ajaxSubmitRequestUpdateAreas(target, targetParams, areaCsvString) { updateFunction = function(transport) { ajaxUpdateAreas(areaCsvString); } jQuery.ajax({ url: target, type: "POST", data: targetParams, success: updateFunction() }); } /** Submit form, update an area (HTML container element). * @param form The form element * @param areaId The id of the HTML container to update * @param submitUrl The URL to call to update the HTML container */ function submitFormInBackground(form, areaId, submitUrl) { submitFormDisableSubmits(form); updateFunction = function() { jQuery("#" + areaId).load(submitUrl); } jQuery.ajax({ url: jQuery(form).attr("action"), data: jQuery(form).serialize(), success: updateFunction() }); } /** Submit form, update multiple areas (HTML container elements). * @param form The form element * @param areaCsvString The area CSV string. The CSV string is a flat array in the * form of: areaId, target, target parameters [, areaId, target, target parameters...]. */ function ajaxSubmitFormUpdateAreas(form, areaCsvString) { waitSpinnerShow(); hideErrorContainer = function() { jQuery('#content-messages').html(''); jQuery('#content-messages').removeClass('errorMessage').fadeIn('fast'); } updateFunction = function(data) { if (data._ERROR_MESSAGE_LIST_ != undefined || data._ERROR_MESSAGE_ != undefined) { if (!jQuery('#content-messages').length) { //add this div just after app-navigation if(jQuery('#content-main-section')){ jQuery('#content-main-section' ).before('
'); } } jQuery('#content-messages').addClass('errorMessage'); if (data._ERROR_MESSAGE_LIST_ != undefined && data._ERROR_MESSAGE_ != undefined) { jQuery('#content-messages' ).html(data._ERROR_MESSAGE_LIST_ + " " + data._ERROR_MESSAGE_); } else if (data._ERROR_MESSAGE_LIST_ != undefined) { jQuery('#content-messages' ).html(data._ERROR_MESSAGE_LIST_); } else { jQuery('#content-messages' ).html(data._ERROR_MESSAGE_); } showjGrowl(); } else { if (jQuery('#content-messages').length) { jQuery('#content-messages').html(''); jQuery('#content-messages').removeClass('errorMessage').fadeIn("fast"); } ajaxUpdateAreas(areaCsvString); } waitSpinnerHide(); } jQuery.ajax({ type: "POST", url: jQuery("#" + form).attr("action"), data: jQuery("#" + form).serialize(), success: function(data) { updateFunction(data); } }); } /** Enable auto-completion for text elements, with a possible span of tooltip class showing description. * @param areaCsvString The area CSV string. The CSV string is a flat array in the * form of: areaId, target, target parameters [, areaId, target, target parameters...]. */ function ajaxAutoCompleter(areaCsvString, showDescription, defaultMinLength, defaultDelay, formName) { ajaxAutoCompleter(areaCsvString, showDescription, defaultMinLength, defaultDelay, formName, null); } function ajaxAutoCompleter(areaCsvString, showDescription, defaultMinLength, defaultDelay, formName, args) { var areaArray = areaCsvString.replace(/&/g, '&').split(","); var numAreas = parseInt(areaArray.length / 3); for (var i = 0; i < numAreas * 3; i = i + 3) { var initUrl = areaArray[i + 1]; if (initUrl.indexOf("?") > -1) var url = initUrl + "&" + areaArray[i + 2]; else var url = initUrl + "?" + areaArray[i + 2]; var div = areaArray[i]; // create a separated div where the result JSON Opbject will be placed if ((jQuery("#" + div + "_auto")).length < 1) { jQuery("
").insertBefore("#" + areaArray[i]); } jQuery("#" + div).autocomplete({ minLength: defaultMinLength, delay: defaultDelay, source: function(request, response){ var queryArgs = {"term": request.term}; if (typeof args == "object" && jQuery.isArray(args)) { for (var i = 0; i < args.length; i++) { queryArgs["parm" + i] = jQuery(args[i]).val(); } } jQuery.ajax({ url: url, type: "post", data: queryArgs, beforeSend: function (jqXHR, settings) { //If LAST_AUTOCOMP_REF is not null means an existing ajax auto-completer request is in progress, so need to abort them to prevent inconsistent behavior of autocompleter if (LAST_AUTOCOMP_REF != null && LAST_AUTOCOMP_REF.readyState != 4) { var oldRef = LAST_AUTOCOMP_REF; oldRef.abort(); //Here we are aborting the LAST_AUTOCOMP_REF so need to call the response method so that auto-completer pending request count handle in proper way response( [] ); } LAST_AUTOCOMP_REF= jqXHR; }, success: function(data) { // reset the autocomp field autocomp = undefined; jQuery("#" + div + "_auto").html(data); if (typeof autocomp != 'undefined') { jQuery.each(autocomp, function(index, item){ item.label = jQuery("
").html(item.label).text(); }) // autocomp is the JSON Object which will be used for the autocomplete box response(autocomp); } }, error: function(xhr, reason, exception) { if(exception != 'abort') { alert("An error occurred while communicating with the server:\n\n\nreason=" + reason + "\n\nexception=" + exception); } } }); }, select: function(event, ui){ //jQuery("#" + areaArray[0]).html(ui.item); jQuery("#" + areaArray[0]).val(ui.item.value); // setting a text field if (showDescription && (ui.item.value != undefined && ui.item.value != '')) { setLookDescription(areaArray[0], ui.item.label, areaArray[2], formName, showDescription) } } }); if (showDescription) { var lookupDescriptionLoader = new lookupDescriptionLoaded(areaArray[i], areaArray[i + 1], areaArray[i + 2], formName); lookupDescriptionLoader.update(); jQuery("#" + areaArray[i]).bind('change lookup:changed', function(){ lookupDescriptionLoader.update(); }); } } } function setLookDescription(textFieldId, description, params, formName, showDescription){ if (description) { var start = description.lastIndexOf(' ['); if (start != -1) { description = description.substring(0, start); // This sets a (possibly hidden) dependent field if a description-field-name is provided var dependentField = params.substring(params.indexOf("searchValueFieldName")); dependentField = jQuery("#" + formName + "_" + dependentField.substring(dependentField.indexOf("=") + 1)); var dependentFieldValue = description.substring(0, description.lastIndexOf(' ')) if (dependentField.length) { dependentField.val(dependentFieldValue); dependentField.trigger("change"); // let the 'hidden' field know its been changed } } var lookupWrapperEl = jQuery("#" + textFieldId).closest('.field-lookup'); if (lookupWrapperEl.length) { if (start == -1 && showDescription) { var start = description.indexOf(' '); if (start != -1 && description.indexOf('