var lsGalleryClass = new Class({
        Implements: Options,
        options: {
				
        },
        initialize: function(options){         
                this.setOptions(options);                      
        }
});

var lsGalleryImageUserSelectClass = new Class({
    Implements: Options,
    
    options: {
		'image_target':"",
		'info_div':"",
		'lassoNewPreset':[100,100,300,300],
		'users_array_ul':"",
		'ajax_url':DIR_WEB_ROOT+"/include/ajax/modules/gallery/manageImageUser.php"
    },
    
    initialize: function(options){
    	this.setOptions(options);
    	this.users = new Array();

    	
    	selectUser = this.selectUser.bind(this);
    	hideLasso = this.hideLasso.bind(this);

    	if (options.a_show_lasso){
    		options.a_show_lasso.addEvent('click',function(){
    			selectUser();
    			$('image_users').focus();
    			return false;
    		});
    		options.a_hide_lasso.addEvent('click',function(){
    			hideLasso();
    			return false;
    		});
    	};
    	coords = this.options.image_target.getCoordinates();
    	
    	this.usersLayer = new Element('div',{
			'styles' : { 
    			'position' : 'relative',
    			'margin':'0px auto',
    			'width' : coords.width, 
    			'height' : coords.height, 
    			'background' : 'url('+this.options.image_target.get('src')+') no-repeat' 
    		}
		}).inject(this.options.image_target,'after');

    	this.usersLayer.addEvent("mouseover",this.showUsers);
    	this.usersLayer.addEvent("mouseout",this.hideUsers);
    	
    	
    	this.lasso = new Lasso.Crop(this.options.image_target,{
				ratio : false,
				preset : this.options.lassoNewPreset,
				min : [10,10],
				handleSize : 11,
				zindex:20,
				opacity : .6,
				color : "#000000",
				onResize : this.updateCoords.bind(this)
		});
    	
    	this.hideLasso();

    	this.options.info_div.inject(this.lasso.container);
    	this.options.info_div.setStyle('display','block');
    	
    },
    updateInfoDiv : function(x,y){
    	if (this.options.info_div){
    		this.options.info_div.setStyle('left',x);
    		this.options.info_div.setStyle('top',y);
    	}
    },
    updateCoords:function (pos){
    	this.updateInfoDiv(pos.x+pos.w,pos.y+pos.h);
    	this.currentPos = pos;

    },
    
    selectUser: function(user){
    	this.showLasso();
		
    	this.lasso.options.preset = this.options.lassoNewPreset;
    	this.lasso.resetCoords();
    	this.lasso.setDefault();
    	
    	this.options.info_div.setStyle('top',this.lasso.options.preset[2]);
    	this.options.info_div.setStyle('left',this.lasso.options.preset[3]);

    },

    confirmUser:function(){
    	
    	var userLogin = this.options.info_div.getChildren('.select_user')[0].value;
    	
    	if (userLogin==""){
    		return false;
    	}
    	
    	isError = false; 
    	this.users.each(function(userData){
    		
    		if (userData.user_login==userLogin){
    			isError = true;
    		};
    	});
    	if (isError) {
    		alert("Пользователь уже добавлен");
    		return false;
    	}
    	
    	thisObj = this;

    	thisObj.userData = {
				"user_login":userLogin,
				"lasso": this.currentPos,
				"status":"not_confirmed",
				"can_delete":"1"
			}	
    	
    	params = new Array();
    	params['action']="add";
    	params['user_target_login'] = thisObj.userData.user_login;
    	params['lasso_x'] = thisObj.userData.lasso.x;
    	params['lasso_y'] = thisObj.userData.lasso.y;
    	params['lasso_w'] = thisObj.userData.lasso.w;
    	params['lasso_h'] = thisObj.userData.lasso.h;
    	params['image_id'] = this.options.image_id;
    	
        JsHttpRequest.query(
                this.options.ajax_url,                       
                params,
                function(result, errors) {
                        thisObj.onAjaxComplete(result, errors, thisObj,"add");
                },
                true
        );
    	
    },
    
    fillUsersField:function(){
    	
    	ul = this.options.users_array_ul;   	
    	
		ul.getChildren().each(function(el){
			ul.removeChild(el);
		});
		
		thisObj = this;
		
    	this.users.each(function(userData){
    		userData.user_div = new Element('div',{
        		'styles':{
        			'position':'absolute',
        			'left': userData.lasso.x,
        			'top':userData.lasso.y,
        			'height':userData.lasso.h,
        			'width':userData.lasso.w,
    				'z-index':1000
        		},
    			'class':'user-layer'
        	}).inject(thisObj.usersLayer);
    		
    		userData.user_div.user_info = new Element('a',{
        		'html':userData.user_login,
        		'styles': {
    				'position':'relative',
    				'bottom':'0px',
    				'display':"none",
    				'color':'white',
    				'background-color':'blue',
    				'padding':'0px 10px',
        			'z-index':1000
    			},
    			'href': DIR_WEB_ROOT+'/profile/'+userData.user_login+'/'
    		}).inject(userData.user_div);
    		
    		
    		var li = new Element('li', {
    			'html': '&nbsp',
    			'class':userData.status
    		}).inject(ul);
    		
    		var a = new Element('a', {
    			'href': DIR_WEB_ROOT+"/profile/"+userData.user_login+"/",
    			'html': userData.user_login
    		}).inject(li);
    		
    		a.addEvent("mouseover",thisObj.showUser);
    		a.addEvent("mouseleave",thisObj.hideUser);
    		
    		userData.user_div.addEvent("mouseover",function(){a.fireEvent("mouseover")});
    		userData.user_div.addEvent("mouseout",function(){a.fireEvent("mouseleave")});
    		if (userData.can_delete=="1"){
	    		var a_del = new Element('a',{
	    			'href': "#",
	    			'html':"(x)",
	    			'id':"del_"+userData.user_login,
	    			'name':"del_"+userData.user_login
	    		}).inject(a,"after");
	    		
	    		a_del.addEvent("click",thisObj.removeUser);
    		}
    		
    	})
    },
    
    onAjaxComplete:function(result, errors, thisObj, action){
    	if (!result) {
           msgErrorBox.alert('Ошибка','Во время добавления произошла ошибка');
    	}
    	if (result.bStateError) {
            msgErrorBox.alert(result.sMsgTitle,result.sMsg);
    	} else {
    		msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
    		
    		if (action=="add"){
    			thisObj.users.push(thisObj.userData);
    		} else if (action=="remove"){
    			if ((to_remove = this.findUserDataKeyByLogin(thisObj.userLogin))!==false) {
					thisObj.users[to_remove].user_div.dispose();
					thisObj.users.splice(to_remove, 1);
				}
    		}
    		
    		thisObj.fillUsersField();
    		
    		thisObj.hideLasso();
    	}
    	

    },
    removeUser:function(event){
    	userLogin = this.id.substring(4);
    	
    	thisObj = document.imageUserSelect;
    	
    	params = new Array();
    	params['action']="remove";
    	params['user_target_login'] = userLogin;
    	params['image_id'] = thisObj.options.image_id;
    	thisObj.userLogin = userLogin;
    	
        JsHttpRequest.query(
        		document.imageUserSelect.options.ajax_url,
                params,
                function(result, errors) {
        			document.imageUserSelect.onAjaxComplete(result, errors, thisObj,"remove");
                },
                true
        );             
    	
    	return false;
    },
    
    showLasso:function(){
    	
		this.lasso.container.setStyle('display','block');
    	this.usersLayer.setStyle('display','none');
    	
    	this.options.a_show_lasso.addClass('hidden');
		this.options.a_hide_lasso.removeClass('hidden'); 
		
    },
    hideLasso:function(){
    	this.lasso.container.setStyle('display','none');
    	this.usersLayer.setStyle('display','block');
    	
    	this.options.info_div.getChildren('.select_user')[0].value = "";
    	
    	this.options.a_show_lasso.removeClass('hidden');
		this.options.a_hide_lasso.addClass('hidden');
    },

    showUsers:function(event){
    	$$('.user-layer').each(function(el){
    		el.addClass("user_layer_with_border");
    	});
    },
    
    hideUsers:function(event){
    	$$('.user-layer').each(function(el){
    	    el.removeClass("user_layer_with_border");
    	});
    },
        
    showUser:function(event){
    	thisObj = document.imageUserSelect;
    	userLogin = this.innerHTML;
    	
    	if ((user_key = thisObj.findUserDataKeyByLogin(userLogin))!==false) {
    		thisObj.users[user_key].user_div.user_info.setStyle("display","block");
    		
    	}
			
    	
    },
    
    hideUser:function(event){
    	thisObj = document.imageUserSelect;
    	userLogin = this.innerHTML;
    	
    	if ((user_key = thisObj.findUserDataKeyByLogin(userLogin))!==false) {
    		thisObj.users[user_key].user_div.user_info.setStyle("display","none");
    	}
    },
    
    findUserDataKeyByLogin:function(login){
    	var user_key = -1;
		var i=0;

		while (i<this.users.length) {
			if (this.users[i].user_login == login){
				user_key = i;
			}
			i++;
		}
		if (user_key>-1) {
			return user_key;
		};
		return false;
    }
});


function ajaxToggleImageMapping(obj,imageId,objectType,objectId) {
	obj=$(obj);
	JsHttpRequest.query(
    	DIR_WEB_ROOT+'/include/ajax/modules/gallery/mapImageToObject.php',
    	{ imageId: imageId, objectId: objectId, objectType: objectType },
        function(result, errors) {  
        	if (!result) {
                msgErrorBox.alert('Ошибка','Пожалуйста, повторите позже');
        	}
            if (result.bStateError) {
            	msgErrorBox.alert(result.sMsgTitle,result.sMsg);
            } else {            	
            	msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
            	if (obj)  {
            		if (result.bIsMapped){
            			obj.set('text',"Отвязать");
            			obj.addClass("mapped");
            		}
            		else {
            			obj.set('text',"Привязать");
            			obj.removeClass("mapped");
            		}
            	}
            }
        },
        true
    );
}
