
function headerElementSide(element, prefix) {
	
	var containerWidth = $('div.headerin').width();
	var elementWidth = $(element).width();
	
	var elementPosition = $(element).position();
	
	var center = Math.floor(containerWidth/2);
	var sideElementPosition = elementPosition.left + Math.floor(elementWidth/2);
	
	var side = sideElementPosition < center ? 'left' : 'right' ;
	
	return '&' + prefix + '_side=' + side;
}

function DragDropClass(){

	this.dragObject		= null;
	this.dragObjectType	= null;
	this.options		= null;
	
	/*
	*	Init function common for all object types
	*/
	this._init = function( dragObj, dropObj, type) {
	
		var owner = this;
		var dObj = null;
		owner.dragObjectType = type;
		
		switch(owner.dragObjectType)
		{
			case 'block':
			if(typeof(pageBlocks)=='undefined') return;
			dObj = $(dragObj).parent().parent();
			break;
			
			case 'new_block':
			case 'header_items':
			dObj = $(dragObj);
			break;
			
			default:
			return;
		}
		
		var dragParams = {
			cursor: 'move'
		}
		
		if( owner.dragObjectType=='header_items' )
		{
			jQuery.extend(
				dragParams, 
				{
					containment: '#header'
				}
			);
		} 
		else if(owner.dragObjectType=='new_block') 
		{
		
			jQuery.extend(
				dragParams,
				{
					revert: true,
					scroll: true, 
					scrollSensitivity: 100
				}
			);
			
		}
		else 
		{
			jQuery.extend(
				dragParams,
				{
					helper: 'clone',
					revert: true,
					scroll: true, 
					scrollSensitivity: 100
				}
			);
		}
		
		dObj.draggable(
			jQuery.extend(
				dragParams,
				{
					start : function(event, ui) {

						$(document.body).disableSelection();
						owner.setAttrValue('dragObject',this);
						hideAdminHover();
						$(this).css({bottom:'auto'});

						if(owner.dragObjectType=='header_items')
						{
							//
						} 
						else 
						{
							$('div[class^=box]:not([class*=boxes]) .block-holder, #head').addClass('shaded');
							$('.block-holder',this)
								.addClass('dragging')
								.removeClass('shaded');
							
							owner.setAttrValue('blockId', owner.getBlockId($('div[name^=control_hover]',this).attr('name'),2));
							
							var className = this.className.split(' '); className = className[0];
							var newBlockType = className.toLowerCase();
							owner.showBlockContainers();

							$(dropObj).droppable({
								hoverClass: 'act',
								tolerance: 'pointer',
								drop: function(event, ui) {
									dObj.draggable( "option", "revert", "false" );
									$(document.body).enableSelection();

									var catchedBlock = $('span:first',this);
									var catchedBlockId = parseInt(catchedBlock.attr('catchedBlockId'));
									var catchedBlockStart = parseInt(catchedBlock.attr('catchedBlockStart'));
									var relation = catchedBlock.attr('rel');
									var blockSize = catchedBlockStart==1 ? 2 : 1 ;
									var catchedMatrixId = parseInt(pageBlocks[catchedBlockId]['matrixId']);	

									if( !isNaN(catchedBlockStart) && !isNaN(catchedMatrixId) ) { // if contener exist 
										
										$('div[class^=box]').removeClass('shaded');
										owner.hideBlockContainers();
										
										if( !owner.blockId )
										{
											openEditor(
												'/' + ADMIN_LANGS + '/common/pageblock_editor/' + newBlockGenerationURL +
												'&catchedMatrixId=' + catchedMatrixId + 
												'&catchedBlockStart=' + ( catchedBlockStart>3 ? 0 : catchedBlockStart ) +
												'&blockSize=' + blockSize +
												'&catchedRelation=' + relation +
												'&block_type=' + newBlockType
											);
										}
										else 
										{
											if( owner.blockId ) {
												connectingShow();
												$.ajax({
													type: "POST",
													url: "/" + ADMIN_LANGS + "/common/_ajax_save_block_position",
													data: 
														"matrixId=" + pageBlocks[owner.blockId]['matrixId'] + 
														"&catchedMatrixId=" + pageBlocks[catchedBlockId]['matrixId'] + 
														"&catchedRelation=" + relation + 
														"&catchedBlockStart=" + (catchedBlockStart>3?0:catchedBlockStart),
													success: function( out ){
														reloadSiteContent(); 
														owner.setAttrValue('dragObject', null);
														owner.stopDragProcess();
													}
												});	
												
											} else {
												owner.stopDragProcess();	
											}
										}
									}
									else 
									{
										owner.stopDragProcess();
									}
								}
							});
						}
					},
					stop :  function(event, ui) {
						
						var calcBottom = function(obj)
						{
							return $(obj).position().top;
							return ( $('#header').height() - ($(obj).position().top + $(obj).height()));
						}
						
						if( owner.dragObjectType=='header_items' )
						{
							var o_position = $(this).position();
							var prefix = '';
							
							if( $(this).attr('id')=='logo' )
							{
								var p = 'logo_position_x=' + o_position.left + '&logo_position_y=' + calcBottom(this);
							}
							else if ( $(this).hasClass('slogan'))
							{
								var prefix = 'slogan';
								var p = prefix + '_position_x=' + o_position.left + '&' + prefix + '_position_y=' + calcBottom(this);
							}
							else if ( $(this).hasClass('logon-block'))
							{
								var prefix = 'authorization';
								var p = prefix + '_position_x=' + o_position.left + '&' + prefix + '_position_y=' + calcBottom(this);
							}
							else if ( $(this).attr('id')=='lang-holder')
							{
								var prefix = 'langs';
								var p = prefix + '_position_x=' + o_position.left + '&' + prefix + '_position_y=' + calcBottom(this);
							}
							
							if (prefix) {
								p += headerElementSide(this, prefix);
							}
							
							if (p)$.ajax({
								type: "POST",
								url: "/" + ADMIN_LANGS + "/common/_ajax_save_header_options",
								data: p
							});
						}
						owner.stopDragProcess();
					}
				}
			)
		);
	}
	
	this.setAttrValue = function(attr, o)
	{
		eval("this." + attr + " = o");
	}
	
	this.getBlockId = function( stack, index ){
		if( stack!=undefined ){
			if( index==undefined ) index=2;
			stack = stack.split(' ');
			return stack = stack[index];
		}
		return 0;
	}
		
	this.hideBlockContainers = function() {
		$('.dragContainer_').remove();
		$( this.dragObject ).css({ 
			position : '',
			left : '0px',
			top : '0px'
		});
	}
	
	this.stopDragProcess = function(){
		$('div')
			.removeClass('dragging')
			.removeClass('shaded');
		this.setAttrValue('dragObject',null);
		this.hideBlockContainers();	
		$('#wrapper').css({'position' : 'static'});
		$(document.body).css({cursor : 'default'});
		rebindAll();
	}
	
	
	this.blockId		= null; // dragged object blockId
	this.breadCrumbsId	= null;
	this.sideMenuId		= null;
	this.showBlockContainers = function() {
		if(!isNumber(this.blockId)) return;
		$('#editWindowBg').height( $(document).height() );
		var boxes = $('#content div[class^=box]');
		var gotMenu = $('#sidebar',boxes); // if vertical menu exists
		var owner = this;

		if( !this.breadCrumbsId || !this.sideMenuId	) {
			for(x in pageBlocks){
				if(pageBlocks[x].description == "breadcrumbs")
				{
					this.breadCrumbsId = x;
					continue;
				}
				else if(gotMenu.length && pageBlocks[x].description == "menu")
				{
					this.sideMenuId = x;
					continue;				
				}
			}
		}


		if( pageBlocks[this.breadCrumbsId] && pageBlocks[ parseInt(this.blockId) ] ) {
			containerHTML = '<div class="dragContainer_ box4 after">';
			if(gotMenu.length) containerHTML += '<div class="box1 wrap"><img src="/i/_.gif" /></div>';
			for(var i=gotMenu.length?2:1; i<=4; i++){
				if( pageBlocks[this.breadCrumbsId]['start']+i-1+pageBlocks[ parseInt(this.blockId) ]['size']<=4 ) {
					var catchedBlockStart = pageBlocks[this.breadCrumbsId]['start']+i-1;
					containerHTML += '<div class="dragContainer box1 '+(i==1?' wrap':'')+'"><a><span rel="after" catchedBlockStart="' + (catchedBlockStart) + '" catchedBlockId="' + this.breadCrumbsId + '">&nbsp;</span></a></div>';
				}
			}
			containerHTML +='</div>';
			$('#content').prepend( containerHTML );
		}
		
		if( gotMenu.length && this.sideMenuId )
		{
			containerHTML = '<div class="dragContainer_ box1 after">';
			containerHTML += '<div class="dragContainer box1 wrap"><a><span rel="after" catchedBlockStart="0" catchedBlockId="' + this.sideMenuId + '">&nbsp;</span></a></div>';
			containerHTML +='</div>';
			$(gotMenu).parent().parent().append( containerHTML );
		}
		
		jQuery.each(boxes, function() {
			
			var classNames = this.className.split(' ');
			var containerHTML = '';


			if(!in_array('boxes',classNames)) for(xx in classNames){ // executes once, because only one class will be accepted
				if( in_array(classNames[xx], new Array(
					'box1',
					'box2',
					'box3',
					'box4'
				)) ){
					
					
					var catchedBlockId = owner.getBlockId( $(this).find('*[name^=control_hover]:first').attr('name'),2 );
					if(
						catchedBlockId!=owner.blockId && 
						pageBlocks[catchedBlockId]
					) {

						var box = parseInt( classNames[xx].substr(3,1));
						containerHTML = '<div class="dragContainer_ box' + box + ' %replace%">';
						for(var i=1; i<=box; i++){
							if( pageBlocks[catchedBlockId]['start']+i-1+pageBlocks[ parseInt(owner.blockId) ]['size']<=4 ) {
								var catchedBlockStart = pageBlocks[catchedBlockId]['start']+i-1;
								containerHTML += '<div class="dragContainer box1"><a><span rel="%replace%" catchedBlockStart="' + (catchedBlockStart) + '" catchedBlockId="' + catchedBlockId + '">&nbsp;</span></a></div>';
							}
						}
						containerHTML +='</div>';
						var beforeHTML = containerHTML;
						
						if(pageBlocks[catchedBlockId]['description']!='menu' && pageBlocks[catchedBlockId]['description']!='blank') {
							$(this).prepend( beforeHTML.replace(/%replace%/gi,'before') );
							$(this).append( containerHTML.replace(/%replace%/gi,'after') );
						} else if(gotMenu.length) {
							$(this).append( containerHTML.replace(/%replace%/gi,'after') );
						}
					}
				}
			}
		});
		
		$('.dragContainer').mousemove(function() {
			$(this).addClass('act');
		}).mouseout(function() {
			$(this).removeClass('act');
		});
		
		return; 
	}
	
	
	this.__mouseXY = function(e, param)
	{
		e = e!=undefined ? e : window.event;
		param = param!=undefined ? param : null;
		
		var posx = 0;
		var posy = 0;
		if (!e) var e = window.event;
		if (e.pageX || e.pageY) 	{
			posx = e.pageX;
			posy = e.pageY;
		}
		else if (e.clientX || e.clientY) 	{
			posx = e.clientX + document.body.scrollLeft
				+ document.documentElement.scrollLeft;
			posy = e.clientY + document.body.scrollTop
				+ document.documentElement.scrollTop;
		}
		return param=='left' ? posx : (
			param=='top' ? posy : new Array(posx,posy)
		);
	}
	

	this.__savePositionsFromTemplate = function()
	{
		if(!loadedJSON) return;
		
		connectingShow();
		
		var d = 
			'logo_position_x=' + jQuery('#logo').position().left + '&' +
			'logo_position_y=' + jQuery('#logo').position().top + '&' +
			'slogan_position_x=' + jQuery('.slogan').position().left + '&' +
			'slogan_position_y=' + jQuery('.slogan').position().top + '&' +
			'langs_position_x=' + jQuery('#lang-holder').position().left + '&' +
			'langs_position_y=' + jQuery('#lang-holder').position().top + '&' +
			'authorization_position_x=' + jQuery('.logon-block').position().left + '&' +
			'authorization_position_y=' + jQuery('.logon-block').position().top + '&' +
			'header_height=' + jQuery('#header').height();
		
		$.ajax({
			type: "POST",
			url: "/" + ADMIN_LANGS + "/common/_ajax_save_header_options",
			data: d,
			beforeSend: function(){ loadedJSON = false; },
			success: function( out ){
				loadedJSON = true;
				connectingHide();
			}
		});	
	}
	
	this.dargHeaderBackground = function(e) {
		
		if(Hideris.opened) {
			//ui.draggable( "disable" );
			//return;
		}
	
		// this - dragged object event target, because was called from .onmouseover 
		var _event = e;
		var obj = $('.headerin',jQuery(this));
		if(obj.css('background-image').match(/url\(.*(\/(public-i)\/.*)\)/)) return;
		
		if( $(findEventOwner(e)).attr('class')=='headerin' ){
			
			connectingShow();
			var bg_position = obj.css('backgroundPosition');
			if(bg_position.indexOf('px')!=-1)
			{
				bg_position = bg_position.replace(/px/gi,'').split(' ');
			}
			else 
			{
				bg_position = new Array(0,0);
			}
			var start_position = DragH.__mouseXY(e);
			
			obj.css({'cursor':'move'});
			document.onmousemove = function(ev){
				var pointer = DragH.__mouseXY(ev);
				var x = Math.floor(parseFloat(pointer[0]) - parseFloat(start_position[0]) + parseFloat(bg_position[0]));
				var y = Math.floor(parseFloat(pointer[1]) - parseFloat(start_position[1]) + parseFloat(bg_position[1]));
				if(x>-10 && x<10) x =0;
				if(y>-10 && y<10) y =0;
				obj.css({backgroundPosition: 
					x + 'px ' + 
					y + 'px'
				});
			}
			
			document.onmouseup = function(ev){
				var bg_position = obj.css('backgroundPosition');
				if(bg_position.indexOf('px')!=-1)
				{
					bg_position = bg_position.replace(/px/gi,'').split(' ');
				}
				else 
				{
					bg_position = new Array(0,0);
				}
				
				var backgroundImage = '';
				var backgroundImageM = obj.css('background-image').match(/url\(.*(\/(i|uploads|public-i)\/.*)\)/);
			
				if (backgroundImageM && backgroundImageM[1]) {
					backgroundImage = backgroundImageM[1].replace('"', '');
				}

				$.ajax({
					type: "POST",
					url: "/" + ADMIN_LANGS + "/common/_ajax_save_header_options",
					data: "header_background_x=" + bg_position[0] + "&header_background_y=" + bg_position[1] + "&backgroundImage=" + backgroundImage,
					success: function(){ 
						connectingHide();
					}
				});	
				
				obj.css({'cursor':'default'});
				document.onmousemove = null;
				document.onmouseup = null;
				rebindAll();
				
			}
		}
	}
}
