403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/burlakastudio.realcommenter/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/burlakastudio.realcommenter/drag_and_fire.js
"use strict";

/**
 * Модуль "Полноценные Комментарии D7" под Битрикс
 * Официальный сайт модуля: www.realcommenter.com
 * Официальный сайт разработчика: burlaka.studio
 * Автор и разработчик: Алексей Бурлака (AlexeyGfi) -> alexeygfi@gmail.com
 */
/**
 * Drag&Fire
 * Author: alexeygfi@gmail.com
 *
 * ver.2019-03-26
 */
/**
 * @param obj_or_css_selector Строка-css-селектор либо объект
 *
 * @param prop_name  = left | right | ... - какое свойство отслеживаем. left по-умолчанию
 *          TODO - дело в том, что иногда, когда смещение не достаточно сильное, нужно пропускать слайс на объект
 *          и он должен смещаться. Например, дёрнули слайдер, но недостаточно сильно и он как бы сдвигается,
 *          а потом возвращается обратно. Вот для этого нужно механизму знать, как элемент позиционируется
 *          через left, right, margin-left...
 *
 * @param reverse_calculate = false | true - добавляем или отнимаем (например, для right движение мыши на увеличение даёт отрицательный прирост)
 *          false по-умолчанию
 *
 * @param allow_direction  = PLUS | MINUS | PLUS&MINUS - В какую сторону позволено. PLUS - только на увеличение (например, для правой панели нужно только прирост, чтобы махнуть пальцем вправо и спрятать.)
 *
 * @param critical_shift = какое смещение считается критическим и сработает колбэк. По-умолчанию: 75
 *
 * @param critical_EVENT какая функция вызывается в случае срабатывания критического смещения
 *
 * @returns {boolean}
 */

function drag_and_fire (
	obj_or_css_selector,
	prop_name,
	reverse_calculate,
	allow_direction,
	critical_shift,
	critical_EVENT
) {
	
	let obj= null;
	
	if ( typeof obj_or_css_selector === 'object' ) {
		obj= obj_or_css_selector;
	} else {
		obj= document.querySelector( obj_or_css_selector );
	}
	
	if ( !obj ) {
		return false;
	}
	
	if ( !prop_name ) {
		prop_name= 'left';
	}
	
	if ( !reverse_calculate ) {
		reverse_calculate= false;
	}
	
	if ( !allow_direction ) {
		allow_direction= 'PLUS&MINUS';
	}
	
	if ( !critical_shift ) {
		critical_shift= 75;
	}
	
	if ( !critical_EVENT ) {
		critical_EVENT= null;
	}
	
	obj.drag_prop_name= prop_name; 
	obj.drag_reverse_calculate= reverse_calculate; 
	obj.drag_allow_direction= allow_direction; 
	obj.drag_critical_shift= critical_shift; 
	obj.drag_critical_EVENT= critical_EVENT; 
	obj.fire_in_air= false;
	
	//inner functions
	obj.fire_drag_critical_reached= fire_drag_critical_reached;
	obj.fire_drag_clear_states= fire_drag_clear_states;
	obj.fire_get_drag_shift= fire_get_drag_shift;
	obj.fire_event= fire_event;
	obj.fire_clear= fire_clear;
	
	//drag events
	obj.ontouchmove= fire_dragmode_show;
	obj.ontouchend= fire_drag_result;
	obj.ontouchcancel= fire_drag_cancel;
	
	obj.drag_start_value= null;
}

function fire_dragmode_show( evt ) {
	
	let obj= this;
	let e= evt || event;
	let touch = e.touches[0] || e.changedTouches[0];
	
	if ( obj.fire_in_air ) {
		return false;
	}

	/**
	 * Если у нас старт движения
	 */
	if ( typeof obj.drag_start_value === 'undefined' || obj.drag_start_value === null ) {
		obj.drag_start_value= parseFloat( getStyle( obj, obj.drag_prop_name ) );
		obj.pageX= touch.pageX;
		obj.pageY= touch.pageY;
	}
	
	obj.touch_page_x= touch.pageX;
	
	let drag_shift= obj.fire_get_drag_shift();
	
	if ( !obj.fire_drag_critical_reached() ) {
		//if ( !obj.fire_in_air ) {
			// TODO: Здесь как раз можно реализовать "допустимое смещение". Когда потянул, но fire ещё не сработал
			//obj.style[ obj[ 'drag_prop_name' ] ]= parseFloat( obj.drag_start_value + drag_shift )+'px';
		//}
	} else {
		return false;
	}
	
	return true;
	
}

function fire_drag_result() {
	this.fire_drag_critical_reached( true, true );
	this.fire_drag_clear_states();
}

function fire_drag_cancel () {
	this.fire_drag_critical_reached( true );
	this.fire_drag_clear_states();
}

function fire_get_drag_shift() {
	let obj= this;
	
	if (
		typeof obj.touch_page_x === 'undefined'
		|| typeof obj.pageX === 'undefined'
		|| typeof obj.drag_start_value === 'undefined'
		|| obj.drag_start_value === null
	) {
		return 0;
	}
	
	let drag_shift= obj.touch_page_x-obj.pageX;
	
	if (
		( drag_shift > 0 && !~obj.drag_allow_direction.indexOf( 'PLUS' ) )
		||
		( drag_shift < 0 && !~obj.drag_allow_direction.indexOf( 'MINUS' ) )
	) {
		drag_shift= 0;
	}
	
	if ( obj.drag_reverse_calculate ) {
		drag_shift*= -1;
	}

	obj.drag_shift= drag_shift;
	return drag_shift;
}

function fire_drag_critical_reached( allow_to_shift_in_default, fire_allowed ) {
	
	let obj= this;
	let drag_shift= Math.abs( obj.fire_get_drag_shift() );

	if ( drag_shift < obj.drag_critical_shift ) {
		//if ( allow_to_shift_in_default ) {
			// TODO: Возврат/релиз "допустимого" смещения
			//obj.style[ obj[ 'drag_prop_name' ] ]= parseFloat( obj.drag_start_value )+'px';
		//}
	} else {
		
		this.fire_in_air= true;

		if ( fire_allowed ) {
			this.fire_drag_clear_states();
			this.fire_event();
		}
		
		return true;
	}
	
	return false;
	
}

function fire_event() {
	let obj= this;
	
	if ( obj.drag_critical_EVENT && obj.drag_critical_EVENT instanceof Function ) {
		setTimeout( function() { this.drag_critical_EVENT( this ); }.bind( obj ), 50 );
	}
	this.fire_clear();
}

function fire_clear() {
	this.fire_drag_clear_states();
	this.fire_in_air= false;
}


function fire_drag_clear_states() {
	this.drag_start_value= null;
}

/**
 * get style
 *
 * @param el
 * @param styleProp
 * @returns {*}
 */

function getStyle( el, styleProp ) {

	let value, defaultView = (el.ownerDocument || document).defaultView;

	// W3C standard way:
	if ( defaultView && defaultView.getComputedStyle ) {
		// sanitize property name to css notation
		// (hypen separated words eg. font-Size)
		styleProp = styleProp.replace( /([A-Z])/g, "-$1" ).toLowerCase();
		return defaultView.getComputedStyle( el, null ).getPropertyValue( styleProp );

	} else if ( el.currentStyle ) { // IE
		// sanitize property name to camelCase
		styleProp = styleProp.replace( /\-(\w)/g, function ( str, letter ) {
			return letter.toUpperCase();
		} );
		value = el.currentStyle[ styleProp ];
		// convert other units to pixels on IE
		if ( /^\d+(em|pt|%|ex)?$/i.test( value ) ) {
			return (function ( value ) {
				let oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
				el.runtimeStyle.left = el.currentStyle.left;
				el.style.left = value || 0;
				value = el.style.pixelLeft + "px";
				el.style.left = oldLeft;
				el.runtimeStyle.left = oldRsLeft;
				return value;
			})( value );
		}
		return value;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit