/** * ZWare Business Function Library (ZBF) * * Javascript utility library - always included by system * * @category ZBF_LIB * @package Service * @subpackage Javascript * @copyright ZWare Limited, UK, 2009 * @author Ashley Kitson * @license http://zware.co.uk/docs/license This is not free software */ /** * holds array of action script urls * {popId=>url} */ var _actionUrl = {}; /** * holds array of flags to determine if we want to do any post save functionality * {popId=>['gridTransfer',gridId} gridTransfer = transfer data from popup to grid */ var _postSave = {}; /** * holds array of objects for transfering columns of data from form back to a grid * {popId=>[colName,colName,...]} */ var _gridTransferParam = {}; /** * Popup an edit form * * @param string popId Popup container id name * @param int id Id of item to be edited */ function popformEdit(popId,id,extraParams) { var parms = {'id':id,'jsop':'getform'}; if (typeof extraParams !== 'undefined') { for (attrname in extraParams) { parms[attrname] = extraParams[attrname]; } } $.getJSON(_actionUrl[popId], parms, function (data, textStatus) { if (data.success) { $('#' + popId).html(data.data); popFormDateTime(popId); $('#' + popId + ' :input:checkbox').parent().next().remove();//remove
from checkboxes $('#' + popId).dialog('open'); } else { alert('Unable to retrieve form'); } } ); }; /** * Initialise popup form datetime elements */ function popFormDateTime(popId) { if (typeof Date.CultureInfo == 'undefined') return; var frmt = Date.CultureInfo.formatPatterns.shortDate; frmt = frmt.replace('dd',''); frmt = frmt.replace('d','%e'); frmt = frmt.replace('','%d'); frmt = frmt.replace('MM','%m'); frmt = frmt.replace('M','%m'); frmt = frmt.replace('yyyy','%Y'); frmt = frmt.replace('yy','%y'); var frmtDate = frmt; var frmtDateTime = frmt + " %H:%M"; $( "#" + popId + " input.zwdate-pick" ).dynDateTime( {showsTime: false, ifFormat: frmtDate} ); $( "#" + popId + " input.zwdatetime-pick" ).dynDateTime( {showsTime: true, ifFormat: frmtDateTime} ); } /** * Submit a popup form and transfer data to a grid * * @param string popId Popup container id name */ function popformSave(popId) { $.post(_actionUrl[popId] + '/jsop/submit', formToJSON('#' + popId), function(data,textStatus) { data = $.evalJSON(data); if (data.success) { //do any post save processing required if (_postSave[popId]) { if (_postSave[popId][0] == 'gridTransfer') { gridTransfer(popId); } } $('#' + popId).dialog('close'); } else { //insert error messages for each element for (var i in data) { var msg = ''; $('#' + i).after(msg); } } } ); }; /** * Display a popup input form dialog for a jsTree node or jQuery object * @param jsTree|jQuery node node to edit */ function dispPop(node) { //fetch data to populate the dialog if ($(node).attr('id')) { //check if it is a jQuery object var name = $(node).attr('id'); } else { //its a jsTree object var name = node.selected.attr('id'); } $.get(_frmAction + '/op/fetch', {'id':name}, function(data,textStatus){ JSONToForm('#popup',data); $('#popup').dialog('open'); } ) }; /** * Save a popup edit dialog for a jsTree Category node */ function popSave() { $.post(_frmAction + '/op/edit', formToJSON('#popup'), function(data,textStatus) { //textStatus is always == 'success' data = $.evalJSON(data); if (data.success) { //set the category name in the tree var id = '#node_' + $('#popup form #id').val(); var name = $('#popup form #name').val(); $.tree.focused().rename(id,name); //set the new node id if required if (data.isNew) { $('#node_0').attr('id','node_' + data.id); id = '#node_' + data.id; //new node id } //set row status if ($('#popup form').find(":input[id='rowSts-suspended']").attr('checked')) { $(id).removeClass('jsTreeActive').addClass('jsTreeSuspended'); } else { $(id).removeClass('jsTreeSuspended').addClass('jsTreeActive'); } //remove if defuncted if ($('#popup form').find(":input[id='rowSts-defunct']").attr('checked')) { $(id).remove(); } $('#popup').dialog('close'); } else { //insert error messages for each element for (var i in data) { var msg = ''; $('#' + i).after(msg); } } } ); }; /** * convert form contents into json string for return in a POST call */ function formToJSON( selector ) { var form = {}; var multiSelect = []; $(selector).find(':input[name]').each( function() { var self = $(this); var name = self.attr('name'); var tp = self.attr('type'); var selector = (tp == 'select' || tp =='checkbox' || tp == 'radio'); if (selector) { //if selectable field then just record the selected one if (self.attr('checked') || self.attr('selected')) { if (form[name]) { form[name] = form[name] + '|' + self.val(); multiSelect[name] = name; } else { form[name] = self.val(); } } } else { form[name] = self.val(); } }); //turn multiselects back into arrays for (name in multiSelect) { form[name] = form[name].split('|'); } return form; }; /** * convert jason incoming stream to a form's data * @param string warpper div or other object contining the form to load with data * @param json data json data to load into form */ function JSONToForm(wrapper,data) { data = $.evalJSON(data); var form = $(wrapper + ' form'); for (var i in data) { var ele = form.find(":input[name='" + i + "']"); var tp = ele.attr('type'); if (!tp) tp = $(name).attr('type'); var selector = (tp == 'select' || tp =='checkbox' || tp == 'radio'); if (selector && tp) { if (tp == 'checkbox' || tp == 'radio') { var id = wrapper +' #' + i + '-' + data[i]; $(id).attr('checked','checked'); } } else { ele.val(data[i]); } } } /** * transfer data from form to grid after a save */ function gridTransfer(popId) { var columns = _gridTransferParam[popId]; var colTo, value; var grid = _postSave[popId][1]; var id = $('#' + popId +' :input[name="id"]').val(); for (var i in columns) { //workaround to get multicheckbox values - see ZWare_Form_Popup_Handler::jQueryGrid() if (columns[i].indexOf('[]') != -1) { colTo = columns[i].substr(0,columns[i].length - 2); value = ''; $('#' + popId +' :input[name=' + columns[i] + ']:checked').each( function(index) { value = value + $(this).val() + ','; } ); $('#' + popId +' :input[name=' + colTo + ']:selected').each( function(index) { value = value + $(this).val() + ','; } ); } else { value = $('#' + popId +' :input[name="' + columns[i] + '"]').val(); colTo = columns[i] } $('td#gc_' + colTo + '_' + id).html(value); } //get and set row status if available var sts = $('#' + popId +' :input[name="rowSts"]:checked').val() || $('#' + popId +' :input[name="rowSts"]').val(); if (sts) { var row = $('td#gc_' + columns[0] + '_' + id).parent(); var odd = (row.hasClass('rowOdd')) ; row.removeClass(); if (odd) { row.addClass('rowOdd'); } else { row.addClass('rowEven'); } row.addClass(sts); } } /** * present a confirm dialog and go to location in anchor tag on yes * @param string ele anchor tag holding href to go to on confirmation * @param string dlgMsg message to present to user */ function zwConfirmAnchor(ele, dlgMsg) { if (typeof $.confirmDialog == 'function') { $.confirmDialog({msg: dlgMsg}, function () { window.location = $(ele).attr('href'); }); } else { //fallback if (confirm(dlgMsg)) { window.location = $(ele).attr('href'); } } } //set up the dialog if jquery.confimdlg.js loaded $(document).ready(function() { if (typeof $.confirmDialog == 'function') { $.confirmDialog.defaults({ yes: "Yes", no: "No", title: "Confirmation", msg: "Do you wish to continue ?" }); $(".ui-dialog-titlebar-close").hide(); } }); /** * set a selector box with options * @param string ele The element id to set * @param array opts options to use for select value=>name */ function zwSetSelectOpts(ele,opts) { var options = ''; for (var i in opts) { options += ''; } $(ele).html(options); } /** * get and select options for a select box * @param string url url of ajax action * @param mixed idVal value of 'id' to send in json request * @param string selectEle id of element to set returned options in */ function zwGetSelectOpts(url,idVal,selectEle) { $.getJSON(url,{id:idVal}, function(data,txt) { if(data.success){zwSetSelectOpts(selectEle,data.data);} } ); } /** * Toggle a block display to collapse on the title bar * */ function zwToggleBlock(ele) { $(ele).next("div.zware_block_content").toggle("slow"); } function zwToggleAdminBlock(ele) { var img = $(ele).children('.zware_block_icon'); $(ele).next("div.zware_block_content").toggle("slow"); if ($(ele).hasClass('zware_toggle_block_open')) { $(ele).removeClass('zware_toggle_block_open').addClass('zware_toggle_block_closed'); img.attr('src','/zwasset/img/ZWare/branding/blk_plus.png'); } else { $(ele).removeClass('zware_toggle_block_closed').addClass('zware_toggle_block_open') img.attr('src','/zwasset/img/ZWare/branding/blk_minus.png'); } }