var showPersonality = (function(){
	var ajax = new Ajax();
	var ec = new evercookie();
	
	var spBack, spWindow, spMode = '';
	
	function showWindow(mode){
		spMode = mode;
		
		if(mode == 'main'){
			createWindow();
			
			ajax.post({'module':'personality', 'act':'showWindowMain'}, function(data){
				spWindow.innerHTML = data.html;
				if(data.admin == '1'){
					var styles = document.getElementById('spAdminsStyles');
					var stylesDrag = [];
					for(var i = 0; i < styles.childNodes.length; i++){
						var child = styles.childNodes[i];
						if(child.nodeType == 1 && (/(spStyle)/.test(child.className))){
							stylesDrag.push(styles.childNodes[i]);
							styles.childNodes[i].style.cursor = 'move';
						}
					}
					sp_drag.init(stylesDrag, function(elem){
						var id = elem.id.match(/(\d+)/)[1]
						after = before = elem;
						
						while ( (after = after.previousSibling) && after.nodeType !== 1 ) {}
						while ( (before = before.nextSibling) && before.nodeType !== 1 ) {}
						after = after ? after.id.match(/(\d+)/)[1] : 0, 
						before = before ? before.id.match(/(\d+)/)[1] : 0
						
						ajax.post({'module':'personality', 'act':'sorts', 'after':after, 'before':before, 'id':id});
					});
				}
			});
		}
		if(mode == 'create'){
			fixWindow(1280);
			ajax.post({'module':'personality', 'act':'showWindowCreate'}, function(data){
				spWindow.innerHTML = data.html;
				setTimeout(function(){
					jWps('#spCropImageUpload1').bind('change', selectPhoto);
					jWps('#spCropImageUpload2').bind('change', selectPhoto);
					jWps('#spCropImageUpload3').bind('change', selectPhoto);
					jWps('#spCropImageUpload4').bind('change', selectPhoto);
					jWps('#spCropImageUpload5').bind('change', selectPhoto);
					jWps('#spCropImageUpload6').bind('change', selectPhoto);
				},100);
			});
		}
	}
	
	var p_loading = false;
	function selectPhoto(event){
		if(p_loading) return;
		
		var num = event.target.id.match(/(\d+)/)[1];
		//document.getElementById('formUpload' + num).submit();
		document['formUpload' + num].submit();
		p_loading = true;
	}
	
	var min_widths = [0,160,193,189,171,157,136];
	var min_heights = [0,305,305,305,305,305,305]
	
	var sp_images = [];
	var cur_num = 0;
	var x_offset, y_offset;
	var crop_x, crop_y;
		
	function loadPhoto(num, imgPath){
		p_loading = false;
		setTimeout(function(){
			var srcImage = imgPath;
			var cropNum = num;
			
			jWps('.spCropArea'+cropNum).find('.loading').show();
			
			var image = new Image();
			image.onload = function(){
				var width = image.width;
				var height = image.height;
				width = 305 / (height / width)
				height = 305;
				
				sp_images[cropNum] = jWps('#spCropPhoto' + cropNum)[0];
				sp_images[cropNum].src = image.src;
				sp_images[cropNum].width = width;
				sp_images[cropNum].height = height;
				sp_images[cropNum].proprate = width / height;
				jWps('.spCropMask'+cropNum)[0].style.cursor = 'move';
				jWps('.spCropArea'+cropNum).find('.loading').hide();
				
				
				// Уменьшение/увеличение изображения
				jWps('.spCropMask' + cropNum).wheel(function(delta){
					var width = sp_images[cropNum].width;
					var height = sp_images[cropNum].height;

					delta *= 2;
					
					height = height + delta;
					width = height * sp_images[cropNum].proprate;
					
					if(height < 305){
						width = 305 * sp_images[cropNum].proprate;
						height = 305;
					}
					
					sp_images[cropNum].width = width;
					sp_images[cropNum].height = height;
				});
				
				jWps('.spCropMask' + cropNum).bind('mousedown', function(e){
					cur_num = e.target.className.match(/(\d+)/)[1];
					
					var xy = jWps('.spCropPhotoWrap' + cur_num).getPosition();
					crop_x = xy.x;
					crop_y = xy.y;
					
					x_offset = e.pageX - crop_x - 1 - sp_images[cur_num].offsetLeft;
					y_offset = e.pageY - crop_y - 1 - sp_images[cur_num].offsetTop;
					
					jWps(document).bind('mousemove',imageMove);
					jWps(document).bind('drag',imageMove);
					jWps(document).bind('mouseup', onMouseUp);
				});
			}
			image.src = srcImage;
		}, 10);
	}
	
	function onMouseUp(){
		jWps(document).unbind('mousemove',imageMove);
		jWps(document).unbind('drag',imageMove);
		jWps(document).unbind('mouseup', onMouseUp);
	}
	
	function imageMove(e){
		var x = e.pageX - crop_x - x_offset;
		var y = e.pageY - crop_y - y_offset;
		
		updateImagePosition(x, y);
		
		jWps.event.cancel(e);
	}
	
	function updateImagePosition(x, y){	
		if(x > -1) x = 0;
		if(y > -1) y = 0;
		
		if(min_widths[cur_num] - x > sp_images[cur_num].offsetWidth) x = min_widths[cur_num] - sp_images[cur_num].offsetWidth;
		if(min_heights[cur_num] - y > sp_images[cur_num].offsetHeight) y = min_heights[cur_num] - sp_images[cur_num].offsetHeight;
		
		sp_images[cur_num].style.left = x + 'px';
		sp_images[cur_num].style.top = y + 'px';
	}
	
	function createWindow(){
		jWps('html').setStyle('overflowY', 'hidden');
		jWps('html').setStyle('overflowX', 'hidden');
		var offset_top = document.body.scrollTop || document.documentElement.scrollTop;
		spBack = jWps.create('div', {'class':'spBack', 'style':{'width':jWps.clientWidth()+'px', 'height':jWps.clientHeight()+offset_top+'px','top':offset_top+'px'}});
		jWps('body').append(spBack);
		spWindow = jWps.create('div', {'class':'spWindow', 'style':{'width':jWps.clientWidth()+'px', 'height':jWps.clientHeight()+offset_top+'px','top':offset_top+'px'}});
		jWps('body').append(spWindow);
		
		window.onresize = function(){ fixWindow(); }
	}
	
	function fixWindow(){
		var c_width = jWps.clientWidth();
		var c_height = jWps.clientHeight();
		if(c_width < 1280 && spMode == 'create'){ 
			c_width = 1280;
			jWps('html').setStyle('overflowX', 'auto');
		}
		spBack.style.width = spWindow.style.width = c_width+'px';
		spBack.style.height = spWindow.style.height = c_height+'px';
	}
	
	function save(){
		var error = 0;
		var title = jWps('#spStyleTitle')[0].value;
		if(title == ''){
			jWps('.spCropSaveMsg2').show();
			setTimeout(function(){
				jWps('.spCropSaveMsg2').hide();
			}, 3000);
			jWps('#spStyleTitle')[0].style.border = '1px solid #d00303';
			jWps('#spStyleTitle')[0].focus();
		}else{
			var sImg = '';
			for(var i=1; i<=6; i++){
				if(sp_images[i]){
					var x = (sp_images[i].offsetLeft * -1) / (sp_images[i].offsetWidth / 100);
					var y = (sp_images[i].offsetTop * -1) / (sp_images[i].offsetHeight / 100);
					var w = min_widths[i] / (sp_images[i].offsetWidth / 100);
					var h = min_heights[i] / (sp_images[i].offsetHeight / 100);
					sImg += x + ':' + y + ':' + w + ':' + h + '-';
				}else{
					jWps('.spCropSaveMsg1').show();
					setTimeout(function(){
						jWps('.spCropSaveMsg1').hide();
					}, 3000);
					error = 1; 
					break;
				}
			}
			
			if(error == 0){
				ajax.post({'module':'personality', 'act':'save', 'title':title, 'simg':sImg}, function(data){
					if(data.status == '1') location.reload();
				});
			}
		}
	}
	
	function closeWindow(){
		jWps(spBack).remove();
		jWps(spWindow).remove();
		jWps('html').setStyle('overflowY', 'auto');
		jWps('html').setStyle('overflowX', 'auto');
	}
	
	function spSet(id){
		ajax.post({'module':'personality', 'act':'set', 'id':id}, function(data){
			if(data.status == '1'){
				if(/(style)/.test(location.href)){
					location.href = 'index.php';
				}else location.reload();
			}
		});
	}
	
	function spFriend(id){
		ajax.post({'module':'personality', 'act':'friend', 'id':id}, function(data){
			if(data.status == '1') prompt(data.text, data.link);
		});
	}
	
	function spAccept(id){
		ajax.post({'module':'personality', 'act':'accept', 'id':id}, function(data){
			if(data.status == '1'){
				jWps('#spStyle'+id).find('.spLink').html(data.html);
			}
		});
	}
	
	function spReject(id){
		ajax.post({'module':'personality', 'act':'reject', 'id':id}, function(data){
			if(data.status == '1') jWps('#spStyle'+id).remove();
		});
	}
	
	var rating_working = false;
	function spRate(id, rate){
		ec.get("sp_id", function(value){
			ajax.post({'module':'personality', 'act':'rate', 'rate':rate, 'id':id, 'cookie':value}, function(data){
				if(data.status == '1'){
					var spRating = jWps('#spRating'+id)[0];
					jWps('.current', spRating).removeClass('current');
					jWps('.str'+data.currate, spRating).addClass('current')[0].style.width = 14 * data.currate + 'px';
					for(var i=1; i<6; i++){
						jWps('.star'+i, spRating).removeClass('star').toggleClass('star'+i, 'star'+i+'a')[0].onclick = function(){ return false; };
					}
					rating_working = false;
					
					ec.get("sp_id", function(value){
						ec.set("sp_id", (value != null && value != '' && value != 'null') ? value + ',' + id : id );
					});
				}else{
					if(data.message){
						if(confirm(data.message)) location.href = data.link;
					}
					rating_working = false;
				}
			});
		});
	}
	
	return{
		'show': function(mode){
			if(!mode) mode = 'main';
			showWindow(mode);
		},
		'imageUplod': function(num, imgPath){
			loadPhoto(num, imgPath);
		},
		'save': function(){
			save();
		},
		'close': function(){
			closeWindow();
		},
		'set': function(id){
			spSet(id);
		},
		'friend': function(id){
			spFriend(id);
		},
		'accept': function(id){
			spAccept(id);
		},
		'reject': function(id){
			spReject(id);
		},
		'rate': function(id, rate){
			if(rating_working) return;
			
			rating_working = true;
			spRate(id, rate);
			
			return false;
		}
	}
})();

var sp_drag = (function(window){
	var 
		// Массив drag объектов
		elements,
		
		// Кэширование document, для быстрого доступа
		document = window.document,
		
		// Ссылка на текщий drag объект
		drag_elem = null,
		
		// Ссылка на теневой объект drag объекта во время перемещения
		drag_back = null,
		
		mouseOffset = {x:0, y:0},
		
		offsetX = 25, offsetY = 55,
		
		// Callback функция
		callback = null;
	
	// Получаем смещение объекта
	function getMouseOffset(target, e){
		var docPos  = jWps(target).getPosition();
		return {x:e.pageX - docPos.x, y:e.pageY - docPos.y}
	}
	
	// Инициализируем обработчики перемещений объекта
	function addDocumentEventHandlers(){
		jWps(document).bind('mousemove', mouseMove);
		jWps(document).bind('mouseup', mouseUp);
		document.ondragstart = document.body.onselectstart = function(){ return false; }
	}
		
	// Удаляем обработчики событий перемещения
	function removeDocumentEventHandlers() {
		jWps(document).unbind('mousemove', mouseMove);
		jWps(document).unbind('mouseup', mouseUp);
		document.ondragstart = document.body.onselectstart = null;
	}

	function bind(elems){
		for(var i=0; i<elems.length; i++){	
			elems[i]._drag = true;
			elems[i]._dragbefore = true;
			jWps(elems[i]).bind('mousedown', mouseDown);
		}
	}
	
	function findNode(elem){
		while(elem.parentNode != null){
			if(elem._drag == true){
				return elem;
			}
			elem = elem.parentNode;
		}
		return null;
	}
	
	function updateOrder(e){
		var mouseX = e.pageX, mouseY = e.pageY;
		var target = null; 
		for(var i=0; i<elements.length; i++){
			if(drag_elem != elements[i]){
				var elem = jWps(elements[i]).getPosition();
				var el = {x:(mouseX - elem.x), y:(mouseY - elem.y)};
				
				if(el.x > 0 && el.x < drag_elem.offsetWidth && el.y > 0 && el.y < drag_elem.offsetHeight){
					target = elements[i];
				}
			}
		}
		if(target){
			var el = jWps(target).getPosition();
			if(el.y < (mouseY + (drag_elem.offsetHeight / 2)) && el.x < (mouseX + (drag_elem.offsetWidth / 2)) && target._dragbefore){
				jWps(drag_back).remove().before(target);
				target._dragbefore = false;
			}else{
				jWps(drag_back).remove().after(target);
				target._dragbefore = true;
			}
		}
	}
	
	function mouseDown(e){
		if(e.target.tagName == 'A' || e.which != 1 || e.target.getAttribute('notargethandle') == 1){
			return;
		}
		
		drag_elem = findNode(e.target);
	
		mouseOffset = getMouseOffset(drag_elem, e);

		var w_elem = drag_elem.clientWidth;
		var h_elem = drag_elem.clientHeight;
		
		
		// Создаем DIV контейнер, для подмены
		drag_back = jWps.create('div', {
			'class': drag_elem.className + '_drag',
			'style': {'height': h_elem + 'px', 'width': w_elem + 'px'}
		});
		
		drag_elem.style.left = e.pageX - mouseOffset.x - offsetX + 'px';
		drag_elem.style.top = e.pageY - mouseOffset.y - offsetY + 'px';
		
		
		jWps(drag_elem).setStyle('position', 'absolute');
		jWps(drag_back).before(drag_elem);
		
		addDocumentEventHandlers();
	}
	
	function mouseMove(e){
		var new_left = e.pageX - mouseOffset.x - offsetX;
		var new_top  = e.pageY - mouseOffset.y - offsetY;

		drag_elem.style.left = new_left + 'px';
		drag_elem.style.top = new_top + 'px';
		
		updateOrder(e);
	}
	
	function mouseUp(e){
		removeDocumentEventHandlers();
		
		// Заменяем теневой объект на перемещаемый и удаляем теневой объект
		jWps(drag_elem).remove().before(drag_back);
		jWps(drag_back).remove();
		
		jWps(drag_elem).setStyle('position', 'static');
		callback(drag_elem);
	}
	
	return{
		init: function(elems, callback_fn){
			elements = elems;
			callback = callback_fn || function() {};
			bind(elements);
		}
	}
})(window);
