/*
    Class: MEMOZ.userlist
*/
MEMOZ.userlist = function() {

}
YAHOO.extend(MEMOZ.userlist, MEMOZ.base, {

    _className: "MEMOZ.userlist",

    allowAddUser: false,
    allowDeleteUser: false,
    allowSetNetworkLock: false,
    userFinderTmp: '',

    isWorking: false,
    lockImg: null,
    
    networkId: 0,
    locked: false,
    
    selectedUser: 0,
    
    users: [],
    
    userId: 0,
    userName: '',
    
    listEl: null,
    infoBoxEl: null,
    
    /*
    	Method: setAllowAddUser
    	Parameters:
    		allowAddUser - <bool>
    */
    setAllowAddUser: function(allowAddUser) {
        this.allowAddUser = allowAddUser;
    },

    /*
    	Method: setAllowDeleteUser
    	Parameters:
    		allowDeleteUser - <bool>
    */
    setAllowDeleteUser: function(allowDeleteUser) {
        this.allowDeleteUser = allowDeleteUser;
    },
    
    /*
    	Method: setAllowSetNetworkLock
    	Parameters:
    		allowSetNetworkLock - <bool>
    */
    setAllowSetNetworkLock: function(allowSetNetworkLock) {
    	this.allowSetNetworkLock = allowSetNetworkLock;
    },

    /*
    	Method: setNetworkId
    	Parameters:
    		networkId - Network id (int)
    */
    setNetworkId: function(networkId) {
        this.networkId = networkId;
    },
    
    /*
    	Method: setUsers
    	Parameters:
    		users - [array]
    */
    setUsers: function(users) {
        this.users = users;
    },

	/*
    	Method: setUser
    	Sets the currently logged-in user
    	
    	Parameters:
    		userId - int
    		userName - string
    */
    setUser: function(userId, userName) {
        this.userId = userId;
        this.userName = userName;
    },    
	
	/*
    	Method: setNetworkLocked
    	Sets the network lock status
    	
    	Parameters:
    		networkLocked - boolean
    */
    setNetworkLocked: function(networkLocked) {
    	this.locked = networkLocked;
    },
    
    /*
    	Method: drawUser
    	Adds a list item with the clickable user name to the DOM
    	
    	Parameters:
    		usr - object
    */
    drawUser: function(usr) {
    	var me = this;
		var liEl = document.createElement('li');
		liEl.id = 'userlistitem'+usr.id;
		liEl.innerHTML = "<a id='userlink"+usr.id+"' href='./?member="+usr.id+"' onclick='return false;'>"+usr.name+"</a>";
        YAHOO.util.Event.on('userlink'+usr.id,'click',function(e, obj) { 
        	me.selectUser(obj.id); 
        }, {id: usr.id});
		this.listEl.appendChild(liEl);		
	},
	
	
	onLoad: function() {
    	var me = this;
        // Add user dialog
        this.dlgAddUser = new MEMOZ.dialog(
			'dlgAddUser', {ref: me, fn: 'userAdded'}, { action: 'addUser', network: this.networkId }, [
			{ type: 'text', id: 'Fullname', def: '', submitAs: 'fullname', focus: true },
			{ type: 'text', id: 'Email', def: '', submitAs: 'email' },
			{ type: 'text', id: 'Username', def: '', submitAs: 'username' },
			{ type: 'checkbox', id: 'Teacher', def: false, submitAs: 'isteacher' }
		], {width: '550px'});
	
	    
	    // Initialize buttons
		if (this.allowAddUser) {
            this.btnAddUser = new YAHOO.widget.Button('btnAddUser', {
                onclick: { fn: function() { me.dlgAddUser.show(); }}
            });
        } else {
        	YAHOO.util.Dom.setStyle('btnAddUser','display','none');
        }

        
	},
	
    /*
    	Method: run    	
    */
    run: function() {
    	var me = this;
    	
		onWindowLoad.subscribe(function() { me.onLoad(); });
        
    	this.listEl = $('userlistUl');
    	this.infoBoxEl = $('infoBox');
    	for (var i = 0; i < this.users.length; i++) {
    		this.drawUser(this.users[i]);
    	}
        
    	// User finder
        YAHOO.util.Event.on('userFinder','focus',function() { me.startUserFinder(); });
        YAHOO.util.Event.on('userFinder','blur',function() { me.endUserFinder(); });

        // Network lock
        this.lockImg = document.createElement('img');
        if (this.locked) this.lockImg.src = './imgs/icons/lock.png';
	    else this.lockImg.src = './imgs/icons/lock_open.png';
        $('networkLocked').appendChild(this.lockImg);
        if (this.allowSetNetworkLock) {
        	YAHOO.util.Dom.setStyle(this.lockImg, 'cursor', 'pointer');
        	if (this.locked) this.lockImg.title = this.getLabel('unlockNetwork');
        	else this.lockImg.title = this.getLabel('lockNetwork');
	        YAHOO.util.Event.on('networkLocked','click',this.toggleLock, this, true);
	    }
    },
    
    toggleLock: function() {
    	var lockState = this.locked ? 0 : 1;
    	this.ajaxReq('setNetworkLock', 'lockSaved', { network: this.networkId, locked: lockState });
	    this.lockImg.src = './imgs/indicator1.gif';
    },
    
    lockSaved: function(json) {
    	if (json.error == 0) {
			this.locked = json.locked;
		}
		if (this.locked) {
			this.lockImg.src = './imgs/icons/lock.png';	
        	if (this.allowSetNetworkLock) this.lockImg.title = this.getLabel('unlockNetwork');
		} else {
        	if (this.allowSetNetworkLock) this.lockImg.title = this.getLabel('lockNetwork');
			this.lockImg.src = './imgs/icons/lock_open.png';	    
		}
    },
    
    setWorking: function(isWorking) {
    	this.isWorking = isWorking;
    	if (isWorking) {
	    	if ($('btnDeleteUser')) YAHOO.util.Event.purgeElement('btnDeleteUser');
	    	this.infoBoxEl.innerHTML = "<img src='imgs/indicator8.gif' alt='Et øyeblikk...'>";    	
    	} else {
    	
    	}
    },
    
    /*
    	Method: userAdded

    	Parameters:
    		json - server response
    */
    userAdded: function(json) {

		if (json.error == 0) {
			this.users.push( { id: json.id, name: json.fullname } );
			this.drawUser(this.users[this.users.length-1]);
		}
    
    },

    /*
    	+---------------------------------------------------------------------------------------+
	   	| Section: Displaying user info                               							|
   		+---------------------------------------------------------------------------------------+ 
   	*/    
    
	/* 
    	Method: selectUser
    	
    	Parameters:
    		id - the user id
    */
    selectUser: function(id) {
    	if (this.isWorking) return;
    	this.selectedUser = id;
    	if (!id) {
	    	if ($('btnDeleteUser')) YAHOO.util.Event.purgeElement('btnDeleteUser');
	    	this.infoBoxEl.innerHTML = "";
    	} else {
    		this.setWorking(true);
    		this.ajaxReq('fetchUserInfo', 'gotUserInfo', { user: id });
		}
    },
    
	/* 
    	Method: gotUserInfo
    	Callback for the request made from <selectUser>.

    	Parameters:
    		json - server response
    */
    gotUserInfo: function(json) {
    	var me = this;
    	
    	this.setWorking(false);
    	
    	console.log(json);
    	
    	if (json.error == 0) {
    		var status = json.superuser ? 'Superbruker' : (json.teacher ? 'Lærer' : 'Elev');
    		var network = ' ved <a href="./?network='+json.networkId+'">'+json.networkName+'</a>';
	    	var own_memozes = "";
	    	for (var i = 0; i < json.own_memozes.length; i++) {
	    		own_memozes += '<li><a href="./?memoz='+json.own_memozes[i].id+'">'+json.own_memozes[i].name+'</a></li>';
	    	}
	    	var part_memozes = "";
	    	for (var i = 0; i < json.part_memozes.length; i++) {
	    		part_memozes += '<li><a href="./?memoz='+json.part_memozes[i].id+'">'+json.part_memozes[i].name+'</a></li>';
	    	}
	    	var groups = ""; var groupOwner;
	    	for (var i = 0; i < json.memberships.length; i++) {
	    		groupOwner = (json.memberships[i].owner == json.id) ? ' (eier)' : '';
	    		groups += '<li><a href="./?group='+json.memberships[i].id+'">'+json.memberships[i].name + groupOwner + '</a></li>';
	    	}
	    	this.infoBoxEl.innerHTML = '<h4>'+json.name+'</h4>' +
	    		'<p>' + 
	    			status + network + '<br>' +
	    			'Profil: <a href="./?member='+json.id+'">'+json.my_memoz.name+'</a>' +
	    		'</p>'+
	    		((own_memozes == '') ? '' : 'Egne Memozer: <ul class="memozlist">'+own_memozes+'</ul>') +
	    		((part_memozes == '') ? '' : 'Deltar i Memozer: <ul class="memozlist">'+part_memozes+'</ul>') +
	    		((groups == '') ? '' : 'Medlem av: <ul class="grouplist">'+groups+'</ul>') +
	    		'';
	    	if (this.allowDeleteUser && json.id != this.userId) {
	    		this.infoBoxEl.innerHTML += '<p><input type="button" value="Slett bruker" id="btnDeleteUser"></p>';
	    	
				YAHOO.util.Event.onAvailable('btnDeleteUser', function() {
					this.btnDeleteUser = new YAHOO.widget.Button('btnDeleteUser', {
                		onclick: { fn: me.confirmDeleteUser, scope: me }
		            });
		            
				});			
			}
	    	
    	} else {
	    	this.infoBoxEl.innerHTML = "Fant ikke informasjon om brukeren";
	    	if (this.allowDeleteUser && (json.id) && (json.id != this.userId)) {
	    		this.infoBoxEl.innerHTML += '<input type="button" value="Slett bruker" id="btnDeleteUser">';	    		
	    	
				YAHOO.util.Event.onAvailable('btnDeleteUser', function() {
					this.btnDeleteUser = new YAHOO.widget.Button('btnDeleteUser', {
                		onclick: { fn: me.confirmDeleteUser, scope: me }
		            });
		            
				});			
			}
    	}
    },    
    
    /*
    	+---------------------------------------------------------------------------------------+
	   	| Section: Deleting user	                               								|
   		+---------------------------------------------------------------------------------------+ 
   	*/    
    
	/* 
    	Method: confirmDeleteUser
    	Uses <dlgConfirm> to ask the user for confirmation. If positive, we'll call <deleteUser>
    	
    	Parameters:
    		userId - the user id
    */
    confirmDeleteUser: function() {
    	var userId = this.selectedUser;
    	console.log(this.selectedUser);
        var me = this;
		MEMOZ.dialog.confirmDlg(this.getLabel('confirmDeleteUser'), function(doit) { 
			if (doit) me.deleteUser(userId); 
		});    

    },
    
    /* 
    	Method: deleteUser
    	Makes an AJAX-request to delete the user.
    	
    	Parameters:
    		userId - the user id
    */
    deleteUser: function(userId) {
    	if (this.isWorking) return;
    	this.setWorking(true);
    	this.ajaxReq('deleteUser', 'userDeleted', { 
            userId: userId
		});
		
    },
    
    /* 
    	Method: memozDeleted
    	Callback for the request made from <deleteUser>.
    	
    	Parameters:
    		json - server response
    */
	userDeleted: function(json) {
		this.setWorking(false);
		if (json.error == 0) {
			for (var i = 0; i < this.users.length; i++) {
				if (this.users[i]) {
					if (this.users[i].id == json.userId) {						
						YAHOO.util.Event.purgeElement('userlink'+this.users[i].id);
						this.listEl.removeChild($('userlistitem'+this.users[i].id));
						this.users[i] = null;
						this.selectUser();
						break;
					}
				}
			}
			alert("Brukeren ble slettet");
	    } else {
			alert("Brukeren ble ikke slettet pga. en feil: "+json.error);	    
			this.selectUser(json.userId);
	    }
    },

    /*
    	+---------------------------------------------------------------------------------------+
	   	| Section: The user finder                               								|
   		+---------------------------------------------------------------------------------------+ 
   	*/    
    
    /* 
    	Method: startUserFinder
    	Callback on the find user text field focus
    */
    startUserFinder: function() {
    	var me = this;
    	this.userFinderInt = setInterval(function() { me.userFinder(); }, 100);
    },
    
    /* 
    	Method: endUserFinder
    	Callback on the find user text field blur
    */
    endUserFinder: function() {
    	clearInterval(this.userFinderInt);
    },  
    
    /* 
    	Method: userFinder
    	Interval-function when textfield focused
    */
    userFinder: function() {

		var username = $('userFinder').value;
		if (username == this.userFinderTmp) return;
		this.userFinderTmp = username;

		var rExp = new RegExp(username,'i');
		var usr;
		for (var i = 0; i < this.users.length; i++) {			
			if (usr = this.users[i]) {
				if (username == '' || usr.name.search(rExp) > -1) {
					YAHOO.util.Dom.setStyle('userlistitem'+usr.id,'display','');
				} else {
					YAHOO.util.Dom.setStyle('userlistitem'+usr.id,'display','none');
				}
			}
		}
    
    }
    
});
