/home/edulekha/www/wp-content/plugins/sneeit-framework/js/page-builder-lib.js
$ = jQuery;

function sneeit_page_builder_width_percent_to_column_label(width_percent, extra_text) {	
	for (var i = 0; i < Sneeit_PageBuilder_Options.column_pattern.length; i++) {
		var pattern = Sneeit_PageBuilder_Options.column_pattern[i].split('/');
		var numerator = Number(pattern[0]);
		var denominator = Number(pattern[1]);
		var current_width_percent = numerator/denominator*100;		
		if (current_width_percent.toString() == width_percent.toString()) {
			return Sneeit_PageBuilder_Options.column_pattern[i];
		}
	}
	if (typeof(extra_text) != 'undefined') {
		return (width_percent + extra_text);
	}
	return width_percent;
}
function sneeit_page_builder_column_label_to_width_percent(column_label) {
	var pattern = column_label.split('/');
	var numerator = Number(pattern[0]);
	var denominator = Number(pattern[1]);
	return numerator/denominator*100;	
}
function sneeit_page_builder_box_toolbar_tab_columns(position) {
	var ret = '';
	if (typeof(position) == 'undefined') {
		position = 'header';
	}	
	if (!('column' in Sneeit_Shortcodes.declaration)) {
		return ret;
	}
		
	if (position == 'header') {
		ret += '<li><a href="#sneeit-page-builder-toolbar-tab-content-columns">'
				+ '<i class="fa fa-columns"></i> '
				+ '<span>'+Sneeit_PageBuilder_Options.text.Columns+'</span>'
				+ '</a><div class="current-tab-arrow"></div></li>';
	} else {
		ret += '<div id="sneeit-page-builder-toolbar-tab-content-columns"><p class="tab-content-inner">';
		var column_pattern = Sneeit_PageBuilder_Options.column_pattern;
		var each_col_width = 1;
		if (column_pattern.length) {
			each_col_width = (100 - Sneeit_PageBuilder_Options.style.toolbar_tab_content_column_button_margin * (column_pattern.length + 1)) / column_pattern.length;
		}
		for (var i = 0; i < column_pattern.length; i++) {			
			var width_percent = sneeit_page_builder_column_label_to_width_percent(column_pattern[i]);

			ret += '<a class="sneeit-page-builder-toolbar-tab-content-columns-button sneeit-page-builder-toolbar-tab-content-button" href="javascript:void(0)" style="width: '+each_col_width+'%;margin-left:'+Sneeit_PageBuilder_Options.style.toolbar_tab_content_column_button_margin+'%" data-width="'+width_percent+'" title="Click to add">\
				<span class="sneeit-page-builder-toolbar-tab-content-columns-button-icon sneeit-page-builder-toolbar-tab-content-button-icon">\
					<span style="width: '+width_percent+'%">\n\
						<span></span><span></span><span></span><span></span><span></span><span></span>\n\
					</span>\
				</span>\
				<span class="sneeit-page-builder-toolbar-tab-content-columns-button-text sneeit-page-builder-toolbar-tab-content-button-text">'
					+column_pattern[i]
				+'</span>\
			</a>';
		}
		ret += '</p></div>';
	}
	return ret;
}

function sneeit_page_builder_box_toolbar_tab_shortcodes(position) {
	if (typeof(position) == 'undefined') {
		position = 'header';
	}

	var ret = '';
	if (position == 'header') {
		ret += '<li><a href="#sneeit-page-builder-toolbar-tab-shortcodes">'
				+ '<i class="fa fa-code"></i> '
				+ '<span>'+Sneeit_PageBuilder_Options.text.Shortcodes+'</span>'
				+'</a><div class="current-tab-arrow"></div></li>';
	} else {
		ret += '<div id="sneeit-page-builder-toolbar-tab-shortcodes"><p class="tab-content-inner">';
		
		$.each(Sneeit_Shortcodes.declaration, function (shortcode_id, shortcode_declaration) {
			if (shortcode_id == 'column') {
				return;
			}
			ret += '<a class="sneeit-page-builder-toolbar-tab-shortcodes-button sneeit-page-builder-toolbar-tab-content-button" href="javascript:void(0)" data-shortcode_id="'+shortcode_id+'" title="Click to add"';
			if ('tooltip' in shortcode_declaration) {
				ret += 'data-tooltip="'+shortcode_declaration.tooltip+'"';
			}
			ret += '>';
			ret += '<span><span class="sneeit-page-builder-toolbar-tab-shortcodes-button-icon sneeit-page-builder-toolbar-tab-content-button-icon">';
			if ('icon' in shortcode_declaration) {
				if (sneeit_is_image_src(shortcode_declaration.icon)) {
					ret += '<img src="'+shortcode_declaration.icon+'/>';
				} else {
					ret += '<i class="'+sneeit_valid_icon_code(shortcode_declaration.icon)+'"></i>';
				}
			} else {
				ret += '<i class="fa fa-code"></i>';
			}
			ret += '</span> ';
			ret += '<span class="sneeit-page-builder-toolbar-tab-shortcodes-button-text sneeit-page-builder-toolbar-tab-content-button-text">'
						+shortcode_declaration.title
					+'</span>';
			ret += '</span></a>';
		});		
		ret += '</p></div>';
	}
	return ret;
}

function sneeit_page_builder_workspace_wrapper_html(shortcode_id, shortcode_declaration, shortcode_content) {	
	var ret = '';
	var width_percent = 100;
	$('#sneeit-page-builder-null').html(shortcode_content);
	if (shortcode_id == 'column') {		
		width_percent = $('#sneeit-page-builder-null > div[data-sneeit_shortcode_id="'+shortcode_id+'"]').attr('width');				
		if (typeof(width_percent) == 'undefined' || !width_percent) {
			width_percent = 100;
		}		
	}
	var title = $('#sneeit-page-builder-null > div[data-sneeit_shortcode_id="'+shortcode_id+'"]').attr('title');
	if (typeof(title) == 'undefined') {
		title = '';
	}

	// start box
	ret += '<div class="sneeit-page-builder-workspace-box sneeit-page-builder-workspace-box-'+(shortcode_id == 'column'? 'column':'shortcode sneeit-page-builder-workspace-box-'+shortcode_id)+'" data-shortcode_id="'+shortcode_id+'" style="width:'+width_percent+'%" data-width="'+width_percent+'">';

	// header for workspace box
	ret +=		'<div class="sneeit-page-builder-workspace-box-header sneeit-page-builder-workspace-box-header-'+shortcode_id+'">';

	// specific if the box is a column
	ret += 			'<div class="sneeit-page-builder-workspace-box-header-start">';
	if (shortcode_id == 'column') {
		ret += 			'<a title="'+Sneeit_PageBuilder_Options.text.Decrease_width+'" href="javascript:void(0)" class="sneeit-page-builder-workspace-box-column-decrease-width sneeit-page-builder-workspace-box-column-change-width"><i class="fa fa-minus"></i></a>';		
		ret += 			'<span class="sneeit-page-builder-workspace-box-header-column-value">\
							'+sneeit_page_builder_width_percent_to_column_label(width_percent, '%')+'\
						</span>';
		ret += 			'<a title="'+Sneeit_PageBuilder_Options.text.Increase_width+'" href="javascript:void(0)" class="sneeit-page-builder-workspace-box-column-increase-width sneeit-page-builder-workspace-box-column-change-width"><i class="fa fa-plus"></i></a>';
	} else {		
		if ('icon' in shortcode_declaration) {
			if (sneeit_is_image_src(shortcode_declaration.icon)) {
				ret += '<img src="'+shortcode_declaration.icon+'"/>';
			} else {
				ret += '<i class="'+sneeit_valid_icon_code(shortcode_declaration.icon)+'"></i>';
			}
		} else {
			ret += 		'<i class="fa fa-code"></i>';
		}
		ret += 			' <span>'+shortcode_declaration.title+(title? ': <strong>'+title+'</strong>' : '')+'</span>';			
	}
	ret +=			'</div>';

	ret +=			'<div class="sneeit-page-builder-workspace-box-header-end">';
	
	ret += 				'<a title="'+Sneeit_PageBuilder_Options.text.Edit+'" href="javascript:void(0)" class="sneeit-page-builder-workspace-box-header-button-edit"><i class="fa fa-pencil"></i></a>';
	ret += 				'<a title="'+Sneeit_PageBuilder_Options.text.Duplicate+'" href="javascript:void(0)" class="sneeit-page-builder-workspace-box-header-button-duplicate"><i class="fa fa-copy"></i></a>';
	ret += 				'<a title="'+Sneeit_PageBuilder_Options.text.Delete+'" href="javascript:void(0)" class="sneeit-page-builder-workspace-box-header-button-delete"><i class="fa fa-close"></i></a>';
	ret += 			'</div>';
	ret += 		DIV_CLEAR+'</div>';

	// content for workspace box
	ret +=		'<div class="sneeit-page-builder-workspace-box-content sneeit-page-builder-workspace-box-content-'+shortcode_id+'">';	
	ret += 			shortcode_content;
	ret += 		'</div>';

	// end box
	ret += '</div>';

	return ret;
}
function sneeit_page_builder_shortcode_to_html(content, shortcode_list, nested_level) {
	if (nested_level >= Sneeit_PageBuilder_Options.max_nested_level) {
		// only allow max level of nested list
		return content;
	}

	// replace all nested column shortcode
	for (var i = Sneeit_PageBuilder_Options.max_nested_level - 1; i >= 0 ; i-=1) {
		content = content.replaceAll('column-'+Sneeit_PageBuilder_Options.separator_nested_level+'-'+i, 'column');
	}

	// replace shortcode to real html tags
	$.each(shortcode_list, function (shortcode_id, shortcode_declaration) {	
		var start_key = '['+shortcode_id;
		var end_key = '[/'+shortcode_id+']';

		// ***********************************************
		// replace shortcode [shortcode attr="***"/] first,
		var index = 0;
		for (var i = 0; i < content.length; i++) {
			var start = content.indexOf(start_key, index);
			if (start == -1 || start+start_key.length == content.length) {
				// not found start tag or the start tag has invalid end at the end of content
				break;
			}

			var next_string = content.substring(start+start_key.length, start+start_key.length + 1);			
			
			if (!sneeit_is_slug_name_character(next_string)) {
				// if next character is not a name character,
				//  mean we FOUND exactly the shortcode start point
				
				var end = content.indexOf(']', start+start_key.length);
				if (end == -1) {
					// short code start tag has no end tag, invalid					
					break;
				}
				

				var prev_string = content.substring(end - 1, end);				
				if (prev_string == '/') {
					// FOUND exactly [shortcode attr="***"/] to replace
					var shortcode_content = content.substring(start + start_key.length, end - 1);
					
					shortcode_content = '<div data-sneeit_shortcode_id="'+shortcode_id+'" '+shortcode_content+'></div>';
					content = content.substring(0, start) + shortcode_content + content.substring(end+1);
					index = start + shortcode_content.length;
				} else {
					// FOUND the shortcode but is not an instant close, just go next
					index = start + start_key.length;
				}
			} else {
				// This is not exactly the shortcode we are finding, 
				// just a longer name which contains our shortcode name
				index = start + start_key.length;
			}
		}
		

		// *******************************************
		// Then [shortcode attr="***"]****[/shortcode]
		var index = 0;
		for (var i = 0; i < content.length; i++) {
			var end = content.indexOf(end_key, index);
			if (end == -1) {
				// not found any end tag
				break;
			}

			var prev_content = content.substring(0, end); // cut head of content before end tag
			var start = -1;
			for (var j = 0; j < prev_content.length; j++) {
				var start = prev_content.lastIndexOf(start_key);			
				if (start == -1) {
					// can not find the start tag, so we must move to next point in content
					break;
				}
				var next_string = prev_content.substring(start+start_key.length, start+start_key.length + 1);
				if (!sneeit_is_slug_name_character(next_string)) {
					// FOUND exactly start tag of shortcode
					var close = content.indexOf(']', start);
					if (close >= end) {
						// can not find the close tag before end point, so we must move to next point in content
						start = -1;
						break;
					}

					// FOUND the full start tag, replacing everything here
					var shortcode_start = content.substring(start + start_key.length, close);
					var shortcode_content = content.substring(close+1, end);

					// Replace nested shortcode if this shortcode has
					if ('nested' in shortcode_declaration) {
						shortcode_content = sneeit_page_builder_shortcode_to_html(shortcode_content, shortcode_declaration['nested'], nested_level+1);
					}					


					shortcode_content = '<div data-sneeit_shortcode_id="'+shortcode_id+'" '+shortcode_start+'>'+shortcode_content+'</div>';
					content = content.substring(0, start) + shortcode_content + content.substring(end+end_key.length);
					// after replacing, break and go to next point of end key
					index = start + shortcode_content.length;
					break; 
				} else {
					// this is another shortcode which has name contains our shortcode id
					// we must reward back more to find another, until go to the beginning of content
					prev_content = prev_content.substring(0, start);
					start = -1;
				}
			}

			// jump to next point
			if (start == -1) {
				// seem this close tag is for something, not for our shortcode					
				index = end+end_key.length;			
			}
		}
		

		// *******************************************
		// finally, replace all [shortcode attr="***"]
		var index = 0;
		for (var i = 0; i < content.length; i++) {
			var start = content.indexOf(start_key, index);
			if (start == -1 || start+start_key.length == content.length) {
				// not found start tag or the start tag has invalid end at the end of content
				break;
			}
			var next_string = content.substring(start+start_key.length, start+start_key.length + 1);
			if (!sneeit_is_slug_name_character(next_string)) {
				// if next character is not a name character,
				//  mean we FOUND exactly the shortcode start point
				var end = content.indexOf(']', start+start_key.length);
				if (end == -1) {
					// short code start tag has no end tag, invalid					
					break;
				}
				
				// FOUND exactly [shortcode attr="***"] to replace
				var shortcode_content = content.substring(start + start_key.length, end);				
				shortcode_content = '<div data-sneeit_shortcode_id="'+shortcode_id+'" '+shortcode_content+'></div>';
				content = content.substring(0, start) + shortcode_content + content.substring(end+1);
				index = start + shortcode_content.length;				
			} else {
				// This is not exactly the shortcode we are finding, 
				// just a longer name which contains our shortcode name
				index = start + start_key.length;
			}
		}
	});
	
	// disable scripts
	content = content.replaceAll('<script>', '<sneeit_script>');
	content = content.replaceAll('<script ', '<sneeit_script ');
	content = content.replaceAll('</script>', '</sneeit_script>');
	
	return content;	
}


// convert workspace html to shortcode
function sneeit_page_builder_workspace_html_to_shortcode(workspace_html, shortcode_list, replace_parent, nested_level) {
	if (nested_level >= Sneeit_PageBuilder_Options.max_nested_level) {
		// only allow max level of nested list
		return content;
	}

	var workspace_selector = document.createElement('div');
	workspace_selector.innerHTML = workspace_html;	

	// covert HTML to shortcode and unwrap all box
	$.each(shortcode_list, function(shortcode_id, shortcode_declaration) {
		$(workspace_selector).find('div[data-sneeit_shortcode_id="'+shortcode_id+'"]').each(function () {
			var shortcode_fields = new Object();
			var shortcode_content = $(this).html();
			var shortcode_holder = $(this);
			// get all shortcode field values
			$.each(shortcode_declaration['fields'], function (field_id, field_declaration) {
				if ('type' in field_declaration && field_declaration['type'] != 'textarea' && field_declaration['type'] != 'content') {	
					var field_value = shortcode_holder.attr(field_id);
					if (typeof(field_value) == 'undefined') {										
//						shortcode_fields[field_id] = field_declaration.default;
						shortcode_fields[field_id] = field_declaration['default'];
					} else {
						shortcode_fields[field_id] = shortcode_holder.attr(field_id);
					}
				}
			});

			// replace nested shortcode
			if ('nested' in shortcode_declaration) {
				shortcode_content = 
					sneeit_page_builder_workspace_html_to_shortcode(
						shortcode_content, 
						shortcode_declaration['nested'], 
						'',
						nested_level+1
					);
			}

			// update in 2.5 for unlimted nested columns and shortcodes
			if (shortcode_content.indexOf('data-shortcode_id=') != -1) {
				shortcode_content = 
					sneeit_page_builder_workspace_html_to_shortcode(
						shortcode_content, 
						shortcode_list, 
						replace_parent,
						nested_level+1
					);
			}
			

			// then place shortcode
			var shortcode_id_fixed = shortcode_id;
			if (shortcode_id == 'column') {
				shortcode_id_fixed = 'column-'+Sneeit_PageBuilder_Options.separator_nested_level+'-'+nested_level;
			}
			var shortcode = '['+shortcode_id_fixed;
			$.each(shortcode_fields, function(field_id, field_value) {
				shortcode += ' '+field_id+'="'+sneeit_shortcodes_esc_attr(field_value)+'"';
			});
			
			// add back scripts
			shortcode_content = shortcode_content.replaceAll('sneeit_script', 'script');
			
			shortcode += ']'+shortcode_content+'[/'+shortcode_id_fixed+']';
			if (replace_parent) {
				$(this).parents(replace_parent).first().replaceWith(shortcode);
			} else {
				$(this).replaceWith(shortcode);
			}
		});
	});	
	

	return workspace_selector.innerHTML;
}
function sneeit_page_builder_workspace_to_content_textarea() {
	
	// move content to dummy
	$('#sneeit-page-builder-dummy').html($('#sneeit-page-builder-workspace').html());
		

	// escape from linked sortable list
	for (var i = 0; i < 100; i++) {
		if ($('#sneeit-page-builder-dummy .sneeit-page-builder-workspace-box-content-column-linked-sortable').length == 0) {
			break;
		}
		$('#sneeit-page-builder-dummy .sneeit-page-builder-workspace-box-content-column-linked-sortable').each(function () {
			var shortcode_html = $(this).html();
			$(this).replaceWith(shortcode_html);
		});
	}

	// then convert html to shortcode
	$('#content').val(sneeit_page_builder_workspace_html_to_shortcode(
			$('#sneeit-page-builder-dummy').html(), 
			Sneeit_Shortcodes.declaration, 
			'.sneeit-page-builder-workspace-box',
			0
		)
	);			
}


function sneeit_page_builder_box(toolbar_content, workspace_content) {
	$('#wp-content-editor-container').prepend('\
<div id="sneeit-page-builder-box">\n\
	<div id="sneeit-page-builder-toolbar">'+toolbar_content+'</div>\n\
	<div id="sneeit-page-builder-workspace-wrapper"><div id="sneeit-page-builder-workspace" class="sneeit-page-builder-linked-sortable">'+workspace_content+'</div></div>\n\
	<div id="sneeit-page-builder-dummy" style="display:none!important"></div>\n\
	<div id="sneeit-page-builder-null" style="display:none!important"></div>\n\
</div>');
}

function sneeit_page_builder_apply_sortable() {
	// apply sortable wrapper for column shortcodes
	return $("#sneeit-page-builder-workspace-wrapper .sneeit-page-builder-linked-sortable").sortable({
		connectWith: '#sneeit-page-builder-workspace-wrapper .sneeit-page-builder-linked-sortable',
		item: '.sneeit-page-builder-workspace-box-header',
		revert: true,
		forceHelperSize: true,
		forcePlaceholderSize: true,
		tolerance: "pointer",
		distance: 5,
		helper: 'clone',
		start: function( event, ui ) {				
		},
		stop: function( event, ui ) {				
		},
		receive: function(event, ui){
			if (!Sneeit_PageBuilder_Declaration.nested) {
				// disable drop column in column 
				if ($(this).is('.sneeit-page-builder-workspace-box-content-column-linked-sortable') && 
					ui.item.is('.sneeit-page-builder-workspace-box.sneeit-page-builder-workspace-box-column')) {
					$(ui.sender).sortable('cancel');
				}
			}			
    	}
	}).disableSelection(); 
}