File "front-grid.js"

Full Path: /var/www/bvnghean.vn/save_bvnghean.vn/wp-content/plugins/sneeit-framework/js/front-grid.js
File size: 7.13 KB
MIME-type: text/plain
Charset: utf-8

jQuery.fn.sneeitGrid = function(options) {
	this.each(function(){		
		var wrapper = jQuery(this);
		var sneeitGridOptions = wrapper.data('sneeitGridOptions');

		// in case reload
		if (typeof(options) == 'undefined' && typeof(sneeitGridOptions) != 'undefined') {
			options = Object.assign({}, sneeitGridOptions);
		}
		if (typeof(options) == 'undefined') {
			options = {};
		}	
		if (typeof(sneeitGridOptions) == 'undefined') {
			sneeitGridOptions = {};
		}



		// default options:
		options = jQuery.extend({		
			columnNumber : 1,
			columnClass: 'sneeit-grid-col',
			gapClass: 'sneeit-grid-gap',
			wrapperFinishClass: 'sneeit-grid',

			/* if after calculating, the width 
			 * of each col is smaller than min
			 * we will decrease the col number. 
			 * This is useful for responsive layout 
			 * 
			 * The unit is PIXEL
			 * */
			minColumnWidth: 150,

			/*
			 * The PERCENTAGE of gap width related to
			 * parent width. The gap will never
			 * larger than this width
			 * 
			 * The Unit is PERCENT
			 */
			maxGapSize: 6.25,

			/* fitRows, 
			 * default: masonry / fluid / flex
			 */
			layoutMode: '',

			/* space between items in PIXEL */
			gapSize: 0,		
		}, options);	

		// if wrapper have data attributes,
		// we will priority get from that
		jQuery.each(options, function(key, val){		
			var data_val = wrapper.attr('data-' + key);
			if (typeof(data_val) == 'undefined') {
				options[key] = val;
			}
		});

		// validate options		
		var items = wrapper.find('>*');
		if (items.first().is('.'+options.columnClass)) {
			items = items.find('>*');
		}
				

		if (!options.columnNumber) {
			options.columnNumber = 1;
		}
		
		if (options.columnNumber > items.length) {
			options.columnNumber = items.length;
		}

		if ('previousColumnNumber' in sneeitGridOptions) {
			options.previousColumnNumber = sneeitGridOptions.previousColumnNumber;
		}	
		if ('previousItemLength' in sneeitGridOptions) {
			options.previousItemLength = sneeitGridOptions.previousItemLength;
		}
		sneeitGridOptions = Object.assign({}, options);

		// save options
		wrapper.data('sneeitGridOptions', sneeitGridOptions);

		// short call			
		var wrapperWidth = wrapper.width();
		
		
		// validate gap size
		var gapInPercent = 100 * options.gapSize / wrapperWidth;
		if (gapInPercent > options.maxGapSize) {
			options.gapSize =  options.maxGapSize * wrapperWidth / 100;
		}

		// decrease number of column depending on 
		// the width of the parent

		var totalGapSize = (options.columnNumber - 1) * options.gapSize;
		if (options.columnNumber <= 1) {
			totalGapSize = 0;
		}
		var columnWidth = (wrapperWidth - totalGapSize) / options.columnNumber;	
		for (; options.columnNumber > 1 && columnWidth < options.minColumnWidth; options.columnNumber--) {		
			totalGapSize = (options.columnNumber - 1) * options.gapSize;
			if (options.columnNumber <= 1) {
				totalGapSize = 0;
			}
			columnWidth = wrapperWidth / options.columnNumber;
			if (options.columnNumber <= 1 || columnWidth >= options.minColumnWidth) {
				break;
			}
		}

		if (0 == options.columnNumber) {
			options.columnNumber = 1;
		}

		// we don't need to process again if we already did it
		// and nothing need to change in column number
		// this will prevent process a lot when browser resize
		if ('previousColumnNumber' in sneeitGridOptions &&
			sneeitGridOptions.previousColumnNumber == options.columnNumber 
			&& 'previousItemLength' in sneeitGridOptions &&
			sneeitGridOptions.previousItemLength == items.length ||
			items.length < options.columnNumber) {
			return;
		}
		sneeitGridOptions.previousColumnNumber = options.columnNumber;	
		wrapper.data('sneeitGridOptions', sneeitGridOptions);	

		// calculate everything in percent	
		var gapInPixel = options.gapSize;
		if (options.columnNumber > 1) {
			// total gap size first
			options.gapSize = options.gapSize * (options.columnNumber - 1)				
			// col width in percent
			columnWidth = (wrapperWidth - options.gapSize) / (options.columnNumber);
			options.gapSize = (100 * options.gapSize / wrapperWidth - 0.001) / (options.columnNumber - 1) + '%';
		} 
		// only one column, so simple
		else {
			options.gapSize = 0;
			gapInPixel = 0;
			columnWidth = wrapperWidth;
		}

		// percent
		var columnWidthInPercent = (100 * columnWidth / wrapperWidth - 0.001) + '%';

		// remove previous grid	
		if (wrapper.is('.sneeit-grid')) {
			var previousColumns = wrapper.find('.'+ options.columnClass);
			if (previousColumns.length) {
				var itemPrepend = new Array();
				var columnIndex = 0;
				previousColumns.each(function(){
					var itemIndex = columnIndex;				
					jQuery(this).find(items).each(function(){
						if (jQuery(this).is('.'+ options.gapClass)) {
							return;
						}					
						itemPrepend[itemIndex] = jQuery(this);
						itemIndex += Number(options.columnNumber);					
					});
					columnIndex++;
				});						
				for (var i = itemPrepend.length - 1; i >= 0; i--) {
					itemPrepend[i].prependTo(wrapper);
				}

				previousColumns.remove();
			}

			wrapper.find('.'+ options.gapClass).remove();				
		}

		// update item jquery object
		var items = wrapper.find('>*');

		if (1 == options.columnNumber) {
			return;
		}
		

		// make grid
		switch (options.layoutMode) {
			case 'fitRows': 
				// create cols
				var index = 0;
				items
					.css('width', columnWidthInPercent)
					.css('float', 'left');
				items.each(function(){
					var item = jQuery(this);				
					if (index && index % options.columnNumber != 0) {
						jQuery('<div class="'+options.gapClass+' ver"></div>').insertBefore(item);
					} else if (index) {
						jQuery('<div class="'+options.gapClass+' hor"></div>').insertBefore(item);
					}
					index++;
				});			

				break;

			/* flex / fluid / masonry*/
			default:			
				// add columns
				var html = '';
				for (var i = 0; i < options.columnNumber; i++) {
					html += '<div class="'+options.columnClass+' '+options.columnClass+'-'+i+'"></div>';
					if (!i || i % options.columnNumber != 0) {
						html += '<div class="'+options.gapClass+' ver"></div>';
					}
				}
				jQuery(html).prependTo(wrapper);
				
				var index = 0;				
				items.each(function(){
					var item = jQuery(this);				
					var dataIndex = item.attr('data-index');
					if (typeof(dataIndex) != 'undefined') {
						index = dataIndex;
					}
					var columnIndex = index % options.columnNumber;
					item.appendTo(wrapper.find('.'+options.columnClass+'-'+columnIndex));
					jQuery('<div class="'+options.gapClass+' hor"></div>').insertAfter(item);				
					index++;
				})
				break;
		}
		
		// add exact gap
		wrapper.find('.'+options.gapClass+'.ver')
			.css('width', options.gapSize)
			.css('height', '1px')
			.css('float', 'left');
		
		wrapper.find('.'+options.columnClass)
			.css('width', columnWidth)
			.css('float', 'left');

		wrapper.find('.'+options.gapClass+'.hor')
			.css('clear', 'both')
			.css('width', '100%')
			.css('height', gapInPixel + 'px');
		
		// remove last hor gap in masonry
		wrapper.find('.'+options.columnClass).each(function(){
			var lastHorGap = jQuery(this).find('.'+options.gapClass+'.hor').last();		
			if (!lastHorGap.length) {
				return;
			}
			lastHorGap.hide();
		});
		
		

		// add finish class
		wrapper.addClass(options.wrapperFinishClass);	
	});
};