(function($)
{
/**
* Save form Arr to $.zui.store.
*
* @access public
* @param {string} formID
* @param {array} formData
* @return void
*/
function storeFormData(formID, formData)
{
$.zui.store.set(formID, formData);
}
/**
* Handle the logic save form draft.
*
* @access public
* @return void
*/
function handleSaveFormDraft()
{
if(config.currentModule.indexOf('workflow') !== -1) return;
var skipModules = ['repo', 'mr', 'job', 'dev', 'custom', 'editor'];
if(skipModules.indexOf(config.currentModule) !== -1) return;
var skipMethods = ['edit', 'import', 'login', 'export', 'finish', 'confirm', 'resolve', 'start', 'pause', 'cancel', 'report', 'close', 'activate', 'restart', 'suspend', 'putoff', 'browse', 'hangup', 'track', 'index', 'reply', 'manage', 'run', 'show'];
for(var i = 0; i < skipMethods.length; i++)
{
if(config.currentMethod.indexOf(skipMethods[i]) === 0) return;
};
var $messager = '';
setTimeout(function()
{
var form = $('form[method=post].main-form');
if(form.length)
{
if($(form).hasClass('no-stash') || $(form).data('ride') == 'table') return;
var target = $(form).attr('target');
if($(form).attr('target') == 'hiddenwin')
{
var needSkip = true;
var keepModules = ['program', 'product', 'project', 'testcase', 'execution', 'caselib'];
for(var i = 0; i < keepModules.length; i++)
{
if(needSkip && config.currentModule.indexOf(keepModules[i]) === 0) needSkip = false;
};
if(needSkip) return;
}
var formID = config.currentMethod + '-' + config.currentModule + '-' + $(form).attr("id");
var formDataStored = $.zui.store.get(formID);
/* Clear form data for store. */
setTimeout(function() {
$.zui.store.remove(formID);
}, 100);
if(formDataStored && formDataStored.length)
{
message = lang.confirmDraft.replace('%name%', lang[config.currentModule] ? lang[config.currentModule] : '');
$messager = new $.zui.Messager(message, {
close: true,
type: 'info',
placement: 'top',
cssClass: 'mt-md messagger-zt ',
time: 0,
actions: [
{
name: 'undo',
icon: 'undo',
text: lang.resume,
action: function()
{
var valueMultiple = {};
for(var i = 0; i < formDataStored.length; i++)
{
var item = formDataStored[i];
/* formItem === checkbox or formItem === multipleSelect */
if(item.name.indexOf('[]') != -1)
{
if((item.name.indexOf(']') != -1) && (item.name.indexOf('[') != -1))
{
var formItem = $('#' + item.name.replace('[]', '').replace('[', '').replace(']', ''));
}
else
{
var formItem = $('#' + item.name.replace('[]', ''));
}
}
else if((item.name.indexOf(']') != -1) && (item.name.indexOf('[') != -1))
{
var formItem = $('#' + item.name.replace('[', '').replace(']', ''));
}
else
{
var formItem = $('[name^=' + item.name + ']');
if (!(formItem.length && (formItem.attr('type') === 'radio' || formItem.attr('type') === 'checkbox')))
formItem = $('#' + item.name);
}
var tagName = formItem.prop('tagName');
if(tagName === 'SELECT')
{
if($(formItem).attr('multiple'))
{
if(!valueMultiple[item.name]) valueMultiple[item.name] = [];
valueMultiple[item.name].push(item.value);
if($(formItem).hasClass('picker-select'))
{
$(formItem).trigger('change');
$(formItem).data('zui.picker').setValue(valueMultiple[item.name]);
}
else if($(formItem).hasClass('chosen'))
{
formItem.val(valueMultiple[item.name]);
$(formItem).trigger('change');
$(formItem).trigger('chosen:updated');
}
}
else if($(formItem).hasClass('chosen'))
{
formItem.val(item.value);
$(formItem).trigger('chosen:updated');
}
else if($(formItem).hasClass('picker-select'))
{
$(formItem).data('zui.picker').setValue(item.value);
}
}
else if(tagName === 'TEXTAREA' && $(formItem).hasClass('kindeditor'))
{
KindEditor.remove('#' + item.name);
formItem.val(item.value);
$(formItem).kindeditor(
{
afterChange: function()
{
$(formItem).closest('.main-form').trigger('change');
}
});
}
else
{
if($(formItem).attr('type') === 'checkbox')
{
$(formItem).prop('checked', true).trigger('change');
}
else if($(formItem).attr('type') === 'radio')
{
$('#' + item.name + item.value).prop('checked', true).trigger('change');
}
else
{
formItem.val(item.value);
}
}
}
}
}
],
onAction: function(name, action, messager)
{
setTimeout(function () {
$.zui.store.remove(formID);
}, 100)
}
}).show();
}
form.on('input', function()
{
storeFormData(formID, $(form).serializeArray())
}).on('change', function()
{
storeFormData(formID, $(form).serializeArray())
}).on('success.form.zui', function(event, res)
{
if(res.result === 'success' || res.status === 'success') $.zui.store.remove(formID);
})
}
$('body').one('click', function(e)
{
if($messager && $('.messager').length && !$.contains(e.target, $('.messager')))
$messager.destroy();
}).on('click', '#submit.form-stash-clear', function()
{
$.zui.store.remove(formID);
});
}, 500);
}
/* Tab session */
if(!config.tabSession) return;
/** Store current tab id */
var _tid = '';
/**
* Get current tab id
* @returns {string} Tab id
*/
function getTid(){return _tid;}
/**
* Convert url with tab id
* @param {string} url
* @param {string} [tid]
* @param {boolean} [force]
* @returns {string} Tab id
*/
function convertUrlWithTid(url, tid, force)
{
var link = $.parseLink(url);
if(!link.moduleName) return url;
tid = tid || _tid;
if(!force && link.tid === tid) return url;
link.tid = tid;
return $.createLink(link);
}
/** Init */
function init()
{
/* Check tid */
if(window.parent !== window)
{
if(window.parent.$.tabSession) _tid = window.parent.$.tabSession.getTid();
}
else
{
var isIndexOrLoginPage = (config.currentModule === 'index' && config.currentMethod === 'index') || (config.currentModule === 'user' && config.currentMethod === 'login');
var link = $.parseLink(window.location.href);
_tid = sessionStorage.getItem('TID');
if(!_tid)
{
if(link.tid && isIndexOrLoginPage)
{
_tid = link.tid
}
if(!_tid)
{
_tid = $.zui.uuid();
_tid = _tid.substr(_tid.length - 8);
}
}
sessionStorage.setItem('TID', _tid);
if(isIndexOrLoginPage && !link.tid)
{
window.location.href = convertUrlWithTid(window.location.href, _tid);
}
}
$.tabSession =
{
getTid: getTid,
convertUrlWithTid: convertUrlWithTid,
};
/* Handle all links in page */
$('a').each(function()
{
var $a = $(this);
var url = $a.attr('href');
var urlWithTid = convertUrlWithTid(url);
if(urlWithTid !== url) $a.attr('href', urlWithTid);
});
$('[data-url]').each(function()
{
var $e = $(this);
var url = $e.attr('data-url');
var urlWithTid = convertUrlWithTid(url);
if(urlWithTid !== url) $e.attr('data-url', urlWithTid);
});
if(config.debug > 2)
{
$(function()
{
$('#tid').prepend('localtid=' + _tid + '
');
});
}
}
init();
/* Hide context menu when window is scroll. */
$(window).on('scroll', function()
{
$.zui.ContextMenu.hide();
});
}(jQuery));
/**
* Set the ping url.
*
* @access public
* @return void
*/
function setPing()
{
$('#hiddenwin').attr('src', createLink('misc', 'ping'));
}
/**
* Disable the submit button when submit form.
*
* @access public
* @return void
*/
function setForm()
{
var formClicked = false;
$('form').submit(function()
{
submitObj = $(this).find(':submit');
if($(submitObj).size() >= 1)
{
var isBtn = submitObj.prop('tagName') == "BUTTON";
submitLabel = isBtn ? $(submitObj).html() : $(submitObj).attr('value');
$(submitObj).attr('disabled', 'disabled');
var submitting = submitObj.attr('data-submitting') || lang.submitting;
if(isBtn) submitObj.text(submitting);
else $(submitObj).attr('value', submitting);
formClicked = true;
}
});
$("body").click(function()
{
if(formClicked)
{
$(submitObj).removeAttr('disabled');
if(submitObj.prop('tagName') == "BUTTON")
{
submitObj.text(submitLabel);
}
else
{
$(submitObj).attr('value', submitLabel);
}
$(submitObj).removeClass('button-d');
}
formClicked = false;
});
}
/**
* Set form action and submit.
*
* @param url $actionLink
* @param string $hiddenwin 'hiddenwin'
* @access public
* @return void
*/
function setFormAction(actionLink, hiddenwin, obj)
{
$form = typeof(obj) == 'undefined' ? $('form') : $(obj).closest('form');
if(hiddenwin) $form.attr('target', hiddenwin);
else $form.removeAttr('target');
$form.attr('action', actionLink);
// Check safari for bug #1000, see http://pms.zentao.net/bug-view-1000.html
var userAgent = navigator.userAgent;
var isSafari = userAgent.indexOf('AppleWebKit') > -1 && userAgent.indexOf('Safari') > -1 && userAgent.indexOf('Chrome') < 0;
if(isSafari)
{
var idPreffix = 'checkbox-fix-' + $.zui.uuid();
$form.find('[data-fix-checkbox]').remove();
$form.find('input[type="checkbox"]:not(.rows-selector)').each(function()
{
var $checkbox = $(this);
var checkboxId = idPreffix + $checkbox.val();
$checkbox.clone().attr('data-fix-checkbox', checkboxId).css('display', 'none').after('