/**
* 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 = '
';
for (var x in data[i]) {
msg += '
' + data[i][x] + '
';
}
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 = '
';
for (var x in data[i]) {
msg += '
' + data[i][x] + '
';
}
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');
}
}