var wcp = wcp || {}; (function ($) { if (!$) { return; } /* JQUERY ENHANCEMENTS ***************************************************/ // wcp.ajax -> uses $.ajax ------------------------------------------------ wcp.ajax = function (userOptions) { userOptions = userOptions || {}; var options = $.extend({}, wcp.ajax.defaultOpts, userOptions); options.success = undefined; options.error = undefined; return $.Deferred(function ($dfd) { $.ajax(options) .done(function (data, textStatus, jqXHR) { // if (data.__wcp) { wcp.ajax.handleResponse(data, userOptions, $dfd, jqXHR); // } else { // $dfd.resolve(data); // userOptions.success && userOptions.success(data); // } }).fail(function (jqXHR) { if (jqXHR.responseJSON && jqXHR.responseJSON.__wcp) { wcp.ajax.handleResponse(jqXHR.responseJSON, userOptions, $dfd, jqXHR); } else { wcp.ajax.handleNonwcpErrorResponse(jqXHR, userOptions, $dfd); } }); }); }; //设置全局ajax禁用缓存 $.ajaxSetup({ cache: false }); $.extend(wcp.ajax, { defaultOpts: { dataType: 'json', type: 'POST', contentType: 'application/json' }, defaultError: { message: '发生了一个错误!', details: '服务器没有发送错误详细信息。' }, defaultError401: { message: '你没有经过认证!', details: '您应该通过身份验证(登录)才能执行此操作。' }, defaultError403: { message: '你没有得到授权!', details: '你没有权限执行该操作。' }, defaultError404: { message: '未找到资源!', details: '无法在服务器上找到请求的资源。' }, logError: function (error) { wcp.log.error(error); }, showError: function (error) { if (error.details) { return wcp.message.error(error.details, error.message); } else { return wcp.message.error(error.message || wcp.ajax.defaultError.message); } }, handleTargetUrl: function (targetUrl) { if (!targetUrl) { location.href = wcp.appPath; } else { location.href = targetUrl; } }, handleNonwcpErrorResponse: function (jqXHR, userOptions, $dfd) { if (userOptions.wcpHandleError !== false) { switch (jqXHR.status) { case 401: wcp.ajax.handleUnAuthorizedRequest( wcp.ajax.showError(wcp.ajax.defaultError401), wcp.appPath ); break; case 403: wcp.ajax.showError(wcp.ajax.defaultError403); break; case 404: wcp.ajax.showError(wcp.ajax.defaultError404); break; default: wcp.ajax.showError(wcp.ajax.defaultError); break; } } $dfd.reject.apply(this, arguments); userOptions.error && userOptions.error.apply(this, arguments); }, handleUnAuthorizedRequest: function (messagePromise, targetUrl) { if (messagePromise) { messagePromise.done(function () { wcp.ajax.handleTargetUrl(targetUrl); }); } else { wcp.ajax.handleTargetUrl(targetUrl); } }, handleResponse: function (data, userOptions, $dfd, jqXHR) { if (data) { if (data.success === true) { $dfd && $dfd.resolve(data.result, data, jqXHR); userOptions.success && userOptions.success(data.result, data, jqXHR); if (data.targetUrl) { wcp.ajax.handleTargetUrl(data.targetUrl); } } else if (data.success === false) { var messagePromise = null; if (data.error) { if (userOptions.wcpHandleError !== false) { messagePromise = wcp.ajax.showError(data.error); } } else { data.error = wcp.ajax.defaultError; } wcp.ajax.logError(data.error); $dfd && $dfd.reject(data.error, jqXHR); userOptions.error && userOptions.error(data.error, jqXHR); if ((jqXHR.status === 401 || (data.error && data.error.code == 401)) && userOptions.wcpHandleError !== false) { wcp.ajax.handleUnAuthorizedRequest(messagePromise, data.targetUrl); } } else { //not wrapped result $dfd && $dfd.resolve(data, null, jqXHR); userOptions.success && userOptions.success(data, null, jqXHR); } } else { //no data sent to back $dfd && $dfd.resolve(jqXHR); userOptions.success && userOptions.success(jqXHR); } }, blockUI: function (options) { if (options.blockUI) { if (options.blockUI === true) { //block whole page wcp.ui.setBusy(); } else { //block an element wcp.ui.setBusy(options.blockUI); } } }, unblockUI: function (options) { if (options.blockUI) { if (options.blockUI === true) { //unblock whole page wcp.ui.clearBusy(); } else { //unblock an element wcp.ui.clearBusy(options.blockUI); } } }, ajaxSendHandler: function (event, request, settings) { // var token = wcp.security.antiForgery.getToken(); // if (!token) { // return; // } // // if (!settings.headers || settings.headers[wcp.security.antiForgery.tokenHeaderName] === undefined) { // request.setRequestHeader(wcp.security.antiForgery.tokenHeaderName, token); // } } }); $(document).ajaxSend(function (event, request, settings) { return wcp.ajax.ajaxSendHandler(event, request, settings); }); /* JQUERY PLUGIN ENHANCEMENTS ********************************************/ /* jQuery Form Plugin * http://www.malsup.com/jquery/form/ */ // wcpAjaxForm -> uses ajaxForm ------------------------------------------ if ($.fn.ajaxForm) { $.fn.wcpAjaxForm = function (userOptions) { userOptions = userOptions || {}; var options = $.extend({}, $.fn.wcpAjaxForm.defaults, userOptions); options.beforeSubmit = function () { wcp.ajax.blockUI(options); userOptions.beforeSubmit && userOptions.beforeSubmit.apply(this, arguments); }; options.success = function (data) { wcp.ajax.handleResponse(data, userOptions); }; //TODO: Error? options.complete = function () { wcp.ajax.unblockUI(options); userOptions.complete && userOptions.complete.apply(this, arguments); }; return this.ajaxForm(options); }; $.fn.wcpAjaxForm.defaults = { method: 'POST' }; } })(jQuery);