/*+********************************************************************************** * The contents of this file are subject to the vtiger CRM Public License Version 1.0 * ("License"); You may not use this file except in compliance with the License * The Original Code is: vtiger CRM Open Source * The Initial Developer of the Original Code is vtiger. * Portions created by vtiger are Copyright (C) vtiger. * All Rights Reserved. ************************************************************************************/ window.app = (function () { // Protected Globals var _controller = null; // Copy meta to avoid runtime tampering. var _module = _META.module; var _view = _META.view; var _parentModule = _META.parent; var _app = _META.app; function Request() { this._requestPjax = function (params) { var aDeferred = jQuery.Deferred(); if (typeof params.url === 'undefined') { params.url = 'index.php'; } if (typeof params.container === 'undefined') { params.container = '#pjaxContainer'; params.defaultContainer = true; } var pjaxContainer = jQuery('#pjaxContainer'); //Clear contents existing before if (params.container === '#pjaxContainer') { pjaxContainer.html(''); } jQuery(document).on('pjax:success', function (event, data, status, jqXHR) { if (typeof data == 'object') { if (!data['success'] && data['error']['message']) { aDeferred.resolve(new VtError(data['error'])); return; } else if (data['result']) { data = data['result']; } } if (params.defaultContainer) { //remove the data in default container since it will be having duplicate data which will be problem espcially with id selector pjaxContainer.html(''); } aDeferred.resolve(null, data); }); jQuery(document).on('pjax:error', function (event, jqXHR, textStatus, errorThrown) { aDeferred.resolve(new VtError(errorThrown)); }); jQuery.pjax(params); return aDeferred.promise(); }, this._request = function (params) { var aDeferred = jQuery.Deferred(); if (typeof params.url === 'undefined') { params.url = 'index.php'; } var ajaxParams = { method: params.type, url: params.url, data: params.data, success: function (response) { //alert(JSON.stringify(response)); if (typeof response == 'object') { if (!response['success'] && response['error']['message']) { aDeferred.resolve(new VtError(response['error'])); return; } else if (response['result']) { response = response['result']; } } aDeferred.resolve(null, response); }, error: function (xhr, ajaxOptions, err) { //alert(JSON.stringify(xhr)); aDeferred.resolve(new VtError(err)); } }; if (typeof params.contentType != 'undefined') { ajaxParams['contentType'] = params.contentType; } if (typeof params.processData != 'undefined') { ajaxParams['processData'] = params.processData; } jQuery.ajax(ajaxParams); return aDeferred.promise(); }, this.get = function (params) { var aDeferred = jQuery.Deferred(); params.type = 'GET'; this._request(params).then(function (err, data) { return aDeferred.resolve(err, data); }); return aDeferred.promise(); }, this.post = function (params) { var aDeferred = jQuery.Deferred(); params.type = 'POST'; //caller has send only url so we need to break it to data if (typeof params.data == 'undefined') { params.data = app.convertUrlToDataParams(params.url); delete params.url; } this._request(params).then(function (err, data) { return aDeferred.resolve(err, data); }); return aDeferred.promise(); }, this.pjax = function (params) { var aDeferred = jQuery.Deferred(); params.type = 'GET'; this._requestPjax(params).then(function (err, data) { return aDeferred.resolve(err, data); }); return aDeferred.promise(); } } function Event() { this.el = jQuery({}); this.trigger = function (/* eventName, arg1, arg2... */) { var args = Array.prototype.slice.call(arguments, 1); this.el.trigger(arguments[0], args); } this.on = function (/* eventName, fn */) { this.el.on.apply(this.el, arguments); } this.one = function (/* eventName, fn */) { this.el.one.apply(this.el, arguments); } this.off = function (/* eventName, fn */) { this.el.off.apply(this.el, arguments); } } return { storage: { NSKey: function (key) { return 'vtiger6.'+key; // retain the existing cached data }, get: function (key, defvalue) { key = this.NSKey(key); return jQuery.jStorage.get(key, defvalue); }, set: function (key, value) { key = this.NSKey(key); jQuery.jStorage.set(key, value); }, delete: function (key) { key = this.NSKey(key); jQuery.jStorage.deleteKey(key); }, flush: function () { jQuery.jStorage.flush(); } }, request: new Request(), event: new Event(), helper: new Vtiger_Helper_Js(), /** * Function to decode the encoded htmlentities values */ getDecodedValue: function (value) { return jQuery('
').html(value).text(); }, /** * To Convert give URL to POST params * @param {type} url * @returns {Array} */ convertUrlToDataParams: function (url) { var params = {}; if (typeof url !== 'undefined' && url.indexOf('?') !== -1) { var urlSplit = url.split('?'); url = urlSplit[1]; } var queryParameters = url.split('&'); for (var index = 0; index < queryParameters.length; index++) { var queryParam = queryParameters[index]; var queryParamComponents = queryParam.split('='); params[queryParamComponents[0]] = queryParamComponents[1]; } return params; }, module: function () { return _module; }, view: function () { return _view; }, /** * Function returns the current Module name */ getModuleName: function () { return _module; }, getExtensionModuleName: function () { var extensionModuleName = ''; if (typeof _EXTENSIONMETA !== 'undefined' && _EXTENSIONMETA.hasOwnProperty('module')) { extensionModuleName = _EXTENSIONMETA.module; } return extensionModuleName; }, getAppName: function () { return _app; }, /** * Function returns the application name * @returns {META.parent} */ getParentModuleName: function () { return _parentModule; }, getDecimalSeparator: function () { return jQuery('body').data('user-decimalseparator'); }, getGroupingSeparator: function () { return jQuery('body').data('user-groupingseparator'); }, getNumberOfDecimals: function () { return jQuery('body').data('user-numberofdecimals'); }, getDateFormat: function () { return jQuery('body').data('user-dateformat'); }, getHourFormat: function () { return jQuery('body').data('user-hourformat'); }, getActivityReminderInterval: function () { return jQuery('body').data('userCalendarReminderInterval'); }, getUserId: function () { if (_USERMETA) return _USERMETA.id; }, getMenuStatus: function () { if (_USERMETA) return _USERMETA.menustatus; }, getRecordId: function () { var record = jQuery('#recordId') if (record.length) { return record.val(); } return false; }, getModuleSpecificViewClass: function (view, module, parentModule) { if (typeof module == 'undefined') { module = _module; } if (typeof parentModule == 'undefined') { parentModule = this.getParentModuleName(); } if (view == '') { view = 'Index'; } var controllerClass = null; var handlerClass = module+'_'+view+'_Js'; if (parentModule == 'Settings') { handlerClass = parentModule+'_'+module+'_'+view+'_Js'; if (typeof window[handlerClass] == 'undefined') { handlerClass = parentModule+'_Vtiger_'+view+'_Js'; } } if (typeof window[handlerClass] != 'undefined') { controllerClass = handlerClass; } else { handlerClass = 'Vtiger_'+view+'_Js'; if (typeof window[handlerClass] != 'undefined') { controllerClass = handlerClass; } } return controllerClass; }, controller: function () { if (_controller == null) { var controllerClass = this.getModuleSpecificViewClass(_view); if (controllerClass) { _controller = new window[controllerClass](); _controller.intializeComponents(); _controller.registerEvents(); } } return _controller; }, htmlEncode: function (value) { if (value) { return jQuery('').text(value).html(); } else { return ''; } }, htmlDecode: function (value) { if (value) { return $('').html(value).text(); } else { return ''; } }, changeURL : function(url){ if (typeof history.pushState !== "undefined") { history.pushState({}, "", url); } else { console.log("Browser does not support HTML5."); } }, /** * Function returns translated string */ languageString: [], vtranslate: function (key) { //convert arguments in to proper array var params = [].slice.apply(arguments); params.shift(); function __sprintf(translatedString, params) { if (params.length > 0) { var replaceRegex = new RegExp('(%s)', 'g'); var paramsPointer = 0; translatedString = translatedString.replace(replaceRegex, function () { var string = params[paramsPointer]; paramsPointer++; return string; }); } return translatedString; } var translatedString = key; if (app.languageString[key] !== undefined) { translatedString = app.languageString[key]; } else { var strings = jQuery('#js_strings').text(); if (strings != '') { app.languageString = JSON.parse(strings); if (key in app.languageString) { translatedString = app.languageString[key]; } } } if (translatedString !== null) { return __sprintf(translatedString, params); } return key; }, /** * Function will return the current users layout+skin path * @param