var global_request_count = 0;
var global_user_info 	 = null;

function RPCProxy(url){	
	
	this.dispatcherUrl 	= url;		
		
	//methods		
	this.onCreateRequest 	= onCreateRequest;
	this.onCompleteRequest 	= onCompleteRequest;
	this.onException		= onException;
	
	this.goNewbie		= goNewbie;
	this.onGoNewbie		= onGoNewbie;
	this.loginCookie	= loginCookie;
	this.onLoginCookie	= onLoginCookie;		
	this.login 			= login;
	this.onLogin		= onLogin;		
	this.logout			= logout;
	this.onLogout 		= onLogout;		
	this.signup			= signup;
	this.onSignup		= onSignup;	
	this.updateUser		= updateUser;	
	this.onUpdateUser	= onUpdateUser;
	this.updateNote		= updateNote;		
	this.onUpdateNote	= onUpdateNote;		
	this.deleteNote		= deleteNote;	
	this.onDeleteNote	= onDeleteNote;		
	this.emailNote		= emailNote;
	this.onEmailNote	= onEmailNote;
	
	this.resetPassword  = resetPassword;
	this.onResetPassword  = onResetPassword;
	
	this.getNotes 		= getNotes;
	this.onGetNotes 	= onGetNotes;
	
	this.createNote		= createNote;		
	this.updateNoteView	  = updateNoteView;
	this.updateNotePosMulti = updateNotePosMulti;
	this.saveFocusSequences = saveFocusSequences;
	
	
	Ajax.Responders.register({
		onCreate: this.onCreateRequest, 
		onComplete: this.onCompleteRequest,
		onException: this.onException
	});
	
	function onCreateRequest(){						
		global_request_count++;				
		$("status").innerHTML="loading";
		$("status").style.color = "#EFEFEF";
		$("status").style.backgroundColor = "#DD0000";
	}		
	
	function onCompleteRequest(){
		global_request_count--;
		if(global_request_count==0){
			$("status").innerHTML="done";
			$("status").style.color = "#DD0000";
			$("status").style.backgroundColor = "#EFEFEF";
		}		
	}
	
	function onException(e){
		// show error msg and cancel all other requests
		setView("error");				
		
	}

	function goNewbie(){
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onGoNewbie, parameters: {method:15}});		
	}
	
	function onGoNewbie(res,jdom){
		eval("var result="+res.responseText);				
		if(result.status){
			global_user_info = { "username":result.msg,"status":"3","email":result.msg+"@noteti"};
			$("userTagUname").innerHTML = global_user_info.username;
			$("newbieAlert").style.display="block";
			setView("desktop");						
			message("Welcome!");
		}else{
			alert(result.msg+"\nTry again later!");
			setView("welcome");									
		}
	}
	
	function loginCookie(){
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onLoginCookie, parameters: {method:16}});		
	}
		
	function onLoginCookie(res){	
		//should return object uname/status or false
		//resp = eval("resp="+res.responseText);				
		eval("global_user_info="+res.responseText);		
		if(global_user_info){					
			$("welcome").style.display="none";				
			$("userTagUname").innerHTML=global_user_info.username;
			$("newbieAlert").style.display=(global_user_info.status==3)?"block":"none";		
			changeTheme(global_user_info.theme_id);
			rpc.getNotes();			
		}else{
			setView("welcome");
		}
	}
	
	function login(username,password,remember){					
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onLogin, parameters: {"method":10, "username": username, "password": password,"remember":remember}});		
	}
	
	function onLogin(res,json){				
		
		eval("global_user_info="+res.responseText);		
		
		if(global_user_info){								
			$("userTagUname").innerHTML=global_user_info.username;
			$("newbieAlert").style.display="none";						
			changeTheme(global_user_info.theme_id);
			rpc.getNotes();
		}else{
			$("loginFailed").innerHTML="Login failed!";			
			setView("welcome");
		}		
	}

	function logout(){
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onLogout, parameters: {method:11}});				
	}
	
	function onLogout(res){				
		global_user_info=null;
		maskScreen(1);	
		$("userTagUname").innerHTML="";
		for(i=0;i<WindowMng.windows.length;i++){		//clean up
			try{
				document.body.removeChild(WindowMng.windows[i].mainDiv)
			}catch(e){}
		}
		WindowMng.windows = new Array();
		setView("welcome");
	}		
		
	
	function resetPassword(email){
		setView("loginAction");
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onResetPassword, parameters: {method:18,email:email}});				
	}

	function onResetPassword(res){
		var sent = eval(res.responseText);		
		if(!sent){
			$("loginFailed").innerHTML="User not found !";
		}else{
			$("email").value="";
			$("loginFailed").innerHTML="New password sent !";
			$('loginTable').style.display='block';
			$('passRecoveryTable').style.display='none'		
		}					
		setView("welcome");
	}			
	
	
	function getNotes(){		
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onGetNotes, parameters: {method:20}});		
	}
		
	function onGetNotes(res){		
		var notes = eval(res.responseText);		
		var w = null;
		for(m=0;m<notes.length;m++){
			// create window for each note						
			w = new Window("win"+notes[m].id,notes[m].title,{"editable":true,"x":notes[m].pos_x,
			"y":notes[m].pos_y,"width":notes[m].width,"height":notes[m].height,
			"onChange":saveNote,"onClose":removeNote,"onMove":saveNoteView,"onEnterEditor":startEditNote});
			
			if(notes[m].content!=null)
				w.setContent(notes[m].content);							
		}
		saveFocusSequences();
		setView("desktop");
		message("Welcome!");
	}
	
	function saveFocusSequences(){
		var fslist = new Array();
		var i = 0;
		for(i=0;i<WindowMng.windows.length;i++){				
			var w = WindowMng.windows[i];
			fslist.push({"id":w.id.substr(3),"fs":w.focusSeq});					
		}
		new Ajax.Request(rpc.dispatcherUrl , { method: 'post', parameters: {method:35,fslist_js:Object.toJSON(fslist)}});		
	}
	
	function createNote(note){		
		new Ajax.Request(this.dispatcherUrl , { method: 'post', parameters: {method:21,note_js:Object.toJSON(note)}});		
	}

	function updateNote(note){		
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onUpdateNote, parameters: {method:22,note_js:Object.toJSON(note)}});		
	}

	function onUpdateNote(res){		
		message("Note saved");
	}	

	function updateNoteView(note){				
		new Ajax.Request(this.dispatcherUrl , { method: 'post', parameters: {method:23,note_js:Object.toJSON(note)}});		
	}
			
	
	function updateNotePosMulti(poslist){			
		new Ajax.Request(this.dispatcherUrl , { method: 'post', parameters: {method:30,poslist_js:Object.toJSON(poslist)}});		
	}			
	
	function deleteNote(noteId){					
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onDeleteNote,parameters: {method:24,note_id:noteId}});		
	}
	
	function onDeleteNote(res){
		message("Note deleted");
	}
	
	function emailNote(noteId,email){
		new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onEmailNote,parameters: {method:25,note_id:noteId,email:email}});			
	}
	
	function onEmailNote(res){
		message("Note sent as email");
	}
			
	function signup(uname,password,password2,email,agree){
			$("reg_uname").style.backgroundColor="#DDE3C9";
			$("reg_pass").style.backgroundColor="#DDE3C9";
			$("reg_pass2").style.backgroundColor="#DDE3C9";			
			$("reg_email").style.backgroundColor="#DDE3C9";
			$("agreeCell").style.backgroundColor="";
			
			new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onSignup, parameters: {method:17,reg_uname:uname,reg_pass:password,reg_pass2:password2,reg_email:email,reg_agree:agree}});					
	}
	
	function onSignup(res){				
		
		eval("res="+res.responseText);				
		if(!res.status){
			$("reg_error_msg").innerHTML=res.msg;
			if(res.input){
				for(r=0;r<res.input.length;r++){
					$(res.input[r]).style.backgroundColor="#DD2222";					
				}
			}
			setView("register");					
		}else{			
			rpc.login($("reg_uname").value,$("reg_pass").value,true); // with cookie
			$("reg_uname").value="";
			$("reg_pass").value="";
			$("reg_pass2").value="";
			$("reg_email").value="";						
			$("reg_agree").checked=false;
		}
			
	}
	
	function updateUser(theme,new_password,new_password_confirm){									
			$("profile_error_msg").style.display="none";
			new Ajax.Request(this.dispatcherUrl , { method: 'post', onSuccess:this.onUpdateUser, parameters: {method:14,themeId:theme,password:new_password,password_confirm:new_password_confirm}});					
	}
	
	function onUpdateUser(res){		
		if(res.responseText=="1"){
			$("changePassword").checked = false;		
			$("passwordChangeDiv").style.display="none";
			$("new_password").value = "";
			$("new_password_confirm").value = "";			
			setView("desktop");
			message("Profile saved");
			return;
		}
		$("profile_error_msg").style.display="block";
		$("profile_error_msg").innerHTML =res.responseText;
		setView("profile");				
	}
	
	function message(msg){
		var scrCenter = getCenter();		
		fadeOutMessage(msg,2*scrCenter.x-220,2*scrCenter.y-20,"fadeOutMsg");		
	}

	
}