晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/layouts/v7/modules/Vtiger/resources/ |
Upload File : |
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("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.
************************************************************************************/
var vtUtils = {
weekDaysArray : {Sunday : 0,Monday : 1, Tuesday : 2, Wednesday : 3,Thursday : 4, Friday : 5, Saturday : 6},
/**
* Function which will show the select2 element for select boxes . This will use select2 library
*/
showSelect2ElementView : function(selectElement, params) {
if(typeof params == 'undefined') {
params = {};
}
var data = selectElement.data();
if(data != null) {
params = jQuery.extend(data,params);
}
// Fix to eliminate flicker happening on list view load
var ele = jQuery(selectElement);
if(ele.hasClass("listSearchContributor")){
ele.closest(".select2_search_div").find(".select2_input_element").remove();
ele.show();
}
// Sort DOM nodes alphabetically in select box.
if (typeof params['customSortOptGroup'] != 'undefined' && params['customSortOptGroup']) {
jQuery('optgroup', selectElement).each(function(){
var optgroup = jQuery(this);
var options = optgroup.children().toArray().sort(function(a, b){
var aText = jQuery(a).text();
var bText = jQuery(b).text();
return aText < bText ? 1 : -1;
});
jQuery.each(options, function(i, v){
optgroup.prepend(v);
});
});
delete params['customSortOptGroup'];
}
//formatSelectionTooBig param is not defined even it has the maximumSelectionSize,
//then we should send our custom function for formatSelectionTooBig
if(typeof params.maximumSelectionSize != "undefined" && typeof params.formatSelectionTooBig == "undefined") {
var limit = params.maximumSelectionSize;
//custom function which will return the maximum selection size exceeds message.
var formatSelectionExceeds = function(limit) {
return app.vtranslate('JS_YOU_CAN_SELECT_ONLY')+' '+limit+' '+app.vtranslate('JS_ITEMS');
}
params.formatSelectionTooBig = formatSelectionExceeds;
}
if(selectElement.attr('multiple') != 'undefined' && typeof params.closeOnSelect == 'undefined') {
params.closeOnSelect = false;
}
selectElement.select2(params)
.on("open", function(e) {
var element = jQuery(e.currentTarget);
var instance = element.data('select2');
instance.dropdown.css('z-index',1000002);
}).on("select2-open", function(e) {
var element = jQuery(e.currentTarget);
var instance = element.data('select2');
instance.dropdown.css('z-index',1000002);
});
//validator should not validate select2 text inputs
selectElement.select2("container").find('input.select2-input').addClass('ignore-validation');
if(typeof params.maximumSelectionSize != "undefined") {
vtUtils.registerChangeEventForMultiSelect(selectElement,params);
}
return selectElement;
},
/**
* Function to check the maximum selection size of multiselect and update the results
* @params <object> multiSelectElement
* @params <object> select2 params
*/
registerChangeEventForMultiSelect : function(selectElement,params) {
if(typeof selectElement == 'undefined') {
return;
}
var limit = params.maximumSelectionSize;
selectElement.on('change',function(e){
var instance = jQuery(e.currentTarget).data('select2');
var data = instance.data();
if (jQuery.isArray(data) && data.length >= limit ) {
instance.updateResults();
}
});
},
/**
* Function register datepicker for dateField elements
* @param {jQuery} parent
*/
registerEventForDateFields : function(parent, params) {
var element;
if (parent.hasClass('dateField') && !parent.hasClass('ignore-ui-registration')) {
element = parent;
} else {
element = jQuery('.dateField:not(ignore-ui-registration)', parent);
}
if(typeof params == 'undefined') {
params = {};
}
var parentDateElement = element.parent();
jQuery('.input-group-addon',parentDateElement).on('click',function(e){
var elem = jQuery(e.currentTarget);
elem.parent().find('.dateField').focus();
});
var userDateFormat = app.getDateFormat();
var calendarType = element.data('calendarType');
if(element.length > 0){
jQuery(element).each(function(index, Elem){
element = jQuery(Elem);
if(calendarType == "range"){
//Default first day of the week
var defaultFirstDay = jQuery('#start_day').val();
element.dateRangePicker({
startOfWeek: defaultFirstDay.toLowerCase(),
format: userDateFormat.toUpperCase(),
separator: ',',
showShortcuts: true,
autoClose : false,
duration : 500
});
}else{
var elementDateFormat = element.data('dateFormat');
if(typeof elementDateFormat !== 'undefined') {
userDateFormat = elementDateFormat;
}
var defaultPickerParams = {
autoclose: true,
todayBtn: "linked",
format: userDateFormat,
todayHighlight: true,
clearBtn : true
};
jQuery.extend(defaultPickerParams, params);
element.datepicker(defaultPickerParams);
if(element.hasClass('input-daterange')){
element = element.find('input');
}
}
});
}
},
/**
* Function which will register time fields
* @params : container - jquery object which contains time fields with class timepicker-default or itself can be time field
* registerForAddon - boolean value to register the event for Addon or not
* params - params for the plugin
* @return : container to support chaining
*/
registerEventForTimeFields : function(container, registerForAddon, params) {
if(typeof container === 'undefined') {
container = jQuery('body');
}
if(typeof registerForAddon === 'undefined'){
registerForAddon = true;
}
container = jQuery(container);
if (container.hasClass('timepicker-default')) {
var element = container;
} else {
var element = container.find('.timepicker-default');
}
if(registerForAddon === true){
var parentTimeElem = element.closest('.time');
jQuery('.input-group-addon',parentTimeElem).on('click',function(e){
var elem = jQuery(e.currentTarget);
elem.closest('.time').find('.timepicker-default').focus();
});
}
if(typeof params === 'undefined') {
params = {};
}
var timeFormat = element.data('format');
if(timeFormat == '24') {
timeFormat = 'H:i';
} else {
timeFormat = 'h:i A';
}
var defaultsTimePickerParams = {
'timeFormat' : timeFormat,
'className' : 'timePicker'
};
var params = jQuery.extend(defaultsTimePickerParams, params);
if(element.length) {
element.timepicker(params);
}
return container;
},
/**
* Function to change view of edited elements related to selected Plugin
* @param {type} elementsContainer
* @returns {undefined}
*/
applyFieldElementsView : function(container){
this.showSelect2ElementView(container.find('select.select2'));
this.registerEventForDateFields(container.find('.dateField').not('.ignore-ui-registration'));
this.registerEventForTimeFields(container.find('.timepicker-default'));
},
showQtip : function(element,message,customParams) {
if(typeof customParams === 'undefined') {
customParams = {};
}
var qtipParams = {
content: {
text: message
},
show: {
event: 'Vtiger.Qtip.ShowMesssage'
},
hide: {
event: 'Vtiger.Qtip.HideMesssage'
}
};
jQuery.extend(qtipParams,customParams);
element.qtip(qtipParams);
element.trigger('Vtiger.Qtip.ShowMesssage');
},
hideQtip : function(element) {
element.trigger('Vtiger.Qtip.HideMesssage');
},
linkifyStr : function(str) {
var options = {'TLDs':267};
return anchorme.js(str,options);
},
htmlSubstring : function(content, maxlength) {
var m, r = /<([^>\s]*)[^>]*>/g,
stack = [],
lasti = 0,
result = '';
//for each tag, while we don't have enough characters
while ((m = r.exec(content)) && maxlength) {
//get the text substring between the last tag and this one
var temp = content.substring(lasti, m.index).substr(0, maxlength);
//append to the result and count the number of characters added
result += temp;
maxlength -= temp.length;
lasti = r.lastIndex;
if (content) {
result += m[0];
if (m[1].indexOf('/') === 0) {
//if this is a closing tag, then pop the stack (does not account for bad html)
stack.pop();
} else if (m[1].lastIndexOf('/') !== m[1].length - 1) {
//if this is not a self closing tag then push it in the stack
stack.push(m[1]);
}
}
}
//add the remainder of the string, if needed (there are no more tags in here)
result += content.substr(lasti, maxlength);
//fix the unclosed tags
while (stack.length) {
var unclosedtag = stack.pop();
if(jQuery.inArray(unclosedtag,['br']) == -1){
result += '</' + unclosedtag + '>';
}
}
return result;
},
showValidationMessage : function(element,message,params) {
if(element.hasClass('select2')) {
element = app.helper.getSelect2FromSelect(element);
}
if(typeof params === 'undefined') {
params = {};
}
var validationTooltipParams = {
position: {
my: 'bottom left',
at: 'top left'
},
style: {
classes: 'qtip-red qtip-shadow'
}
};
jQuery.extend(validationTooltipParams,params);
this.showQtip(element,message,validationTooltipParams);
element.addClass('input-error');
},
hideValidationMessage : function(element) {
if(element.hasClass('select2')) {
element = app.helper.getSelect2FromSelect(element);
}
//should hide even message displyed by vtValidate
element.trigger('Vtiger.Validation.Hide.Messsage');
this.hideQtip(element);
element.removeClass('input-error');
},
getMomentDateFormat : function() {
var dateFormat = app.getDateFormat();
return dateFormat.toUpperCase();
},
getMomentTimeFormat : function() {
var hourFormat = app.getHourFormat();
var timeFormat = 'HH:mm';
if(hourFormat === 12) {
timeFormat = 'hh:mm A';
}
return timeFormat;
},
getMomentCompatibleDateTimeFormat : function() {
return this.getMomentDateFormat() + ' ' + this.getMomentTimeFormat();
},
convertFileSizeInToDisplayFormat : function(fileSizeInBytes) {
var i = -1;
var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
do {
fileSizeInBytes = fileSizeInBytes / 1024;
i++;
} while (fileSizeInBytes > 1024);
return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
},
enableTooltips : function(options) {
if(typeof options == 'undefined') {
options = {};
}
jQuery(function () {
jQuery('[data-toggle="tooltip"]').tooltip(options);
});
}
}