
/**
* BClass
* created by Ingo Taraske (zoo2002.de)
*
* used for storage of server data objects
* has many BObjects
**/

model = new Object();



/**
* abstraction class for domain model
* version 0.2 (25.05.2005)
*
*/

// Business Class Object, constructor class needs title
model.BClass = Class.create();
model.BClass.prototype = {
	
	initialize: function(title){
		var me = this;
		this.title = title
		this.objects = new Hash();
		this.listRefresh = false;
		this.objectList = null;
		this.listLanguage = null;
		this.objectRequests = new Hash();
	},
	
	
	// to get shortlist of objects
getObjectList: function(properties){
	
	if (this.objectList && this.listRefresh == false){
		var item;
		if(this.title == 'Language' || this.listLanguage == C().getLang())
		return this.objectList;
	}
	
	var requestId = this.title+Math.floor(Math.random()*100);
	
	// pars and url depends on the server side
	// TODO: this should not be hardcoded here
	var pars = 'lang='+C().getLang()+'&bclass='+this.title+'&requestId='+requestId;
	var url = '/'+this.title.camelize()+'/viewJsonList';
	new msg.Message('loading Content', requestId, -1);
	//new msg.Message('zendf.taraskecon.de'+url+'?'+pars, null, 6);

	
	net.getCommunicator().
	request({'url': url, 'pars' : pars, onComplete: model.BClass.onObjectListArrival});
	
	this.objectRequests.add(requestId, {'notify' :
	properties.notify, 'url': url, callback: model.BClass.onObjectListArrival});
	
	//setTimeout("model.BClass.resendRequest({requestId: ['"+requestId+"'], classTitle: ['"+this.title+"']})", 10*1000);
	
	return null;
	
},

	
	// function for helpers etc. to get Objects
getObject: function(properties){
		
		var object;
		if (object = this.isValid(properties.id)){
			if(object.langid == C().getLang())
			return object;
			
			else
			return 'wrong language';
		}
	
		
		// if object is not there, we have to request it asynchronously from server,
		// locally the request is saved with an Id to differentiate the response
		var requestId = this.title+properties.id+Math.floor(Math.random()*100);
		
		// pars and url depends on the server side
		// TODO: this should not be hardcoded here
		var pars = 'lang='+C().getLang()+'&bclass='+this.title+'&id='+properties.id+'&requestId='+requestId;
		
		if (properties.pars)
			pars += '&'+properties.pars;
		
		var url = '/'+this.title.camelize()+'/viewJsonOne';
		//new msg.Message('zendf.taraskecon.de'+url+'?'+pars, null, 6);

		new msg.Message('loading Content', requestId, -1);
		
		net.getCommunicator().
		request({'url': url, 'pars' : pars, onComplete: model.BClass.onObjectArrival});
		
		this.objectRequests.add(requestId, {'id' : properties.id, 'notify' :
		properties.notify, 'url': url, callback: model.BClass.onObjectArrival});
	
		//setTimeout("model.BClass.resendRequest({requestId: ['"+requestId+"'], classTitle: ['"+this.title+"']})", 10*1000);
		
		return null;
	},

	submitObject: function(properties){
		
		var requestId = this.title+properties.id+Math.floor(Math.random()*100);
		
		// pars and url depends on the server side
		// TODO: this should not be hardcoded here
		var pars = 'bclass='+this.title+'&requestId='+requestId;
		
		if (properties.pars)
			pars += '&'+properties.pars;
		
		var url = '/'+this.title.camelize()+'/submitJsonOne';
		//new msg.Message('zendf.taraskecon.de'+url+'?'+pars, null, 6);
		
		new msg.Message('submitting Content', requestId, -1);
		
		net.getCommunicator().
		request({'url': url, 'pars' : pars, onComplete: model.BClass.onObjectArrival});

		this.objectRequests.add(requestId, {'id' : properties.id,
		'notify' : properties.notify, 'url': url, callback: model.BClass.onObjectArrival});
	
		// for timeout resend requests
		//setTimeout("model.BClass.resendRequest({requestId: ['"+requestId+"'], classTitle: ['"+this.title+"']})", 30*1000);
		
		//new msg.Message(url+'?'+pars, null, -1);
		
		// toggle to true to let app fetch updated list
		this.listRefresh = true;
		
		return true;
	},
	
	
// add Objects to class, parameter is json-object
addObject: function(properties){
	var id = properties.id;
	if (id){
		if(this.objects.has(id))
			this.removeObject(id);
		
		return this.objects.add(id, new model.BObject(properties));
	}
	return null;
},

// remove objects
removeObject: function(id){
	this.objects.del(id);
},

// check for objects
isValid: function(id){
	var object;
	if (object = this.objects.has(id)){
		return object;
	}
	object = null;
	return null;
}

};
	

model.BClass.onObjectArrival = function(xhr, xjson){
	
	eval("var messages = "+xhr.responseText);
	
	for (var i = 0; i < messages.length; i++){
		var message = messages[i];
		
		var me = C().bClassIsValid(message.bclass);
	
		if(!me)
			new msg.Message('received invalid message', null, 1);
		
		var objectRequest = me.objectRequests.has(message.requestId);
		
		if (objectRequest){
			
			msg.clear({id: message.requestId});
			
			if (message.status == 'ok'){
				if(message.data)
				me.addObject(message.data);
				
				if(objectRequest.notify)
					objectRequest.notify.call(message);
			}
			
			me.objectRequests.del(message.requestId);
		}
		
		else
			new msg.Message('received invalid message', null, 1);
	}
		
	
}

model.BClass.onObjectListArrival = function(xhr, xjson){
	
	eval("var messages = "+xhr.responseText);
	
	for (var i = 0; i < messages.length; i++){
		var message = messages[i];
		
		var me = C().bClassIsValid(message.bclass);
		if(!me)
			new msg.Message('received invalid message', null, 1);
		
		var list = new Array();
		for (var j = 0; j < message.data.length; j++){
			list.append(message.data[j]);
		}
			
			var objectRequest = me.objectRequests.has(message.requestId);
			if (objectRequest){
				msg.clear({id: message.requestId});
				
				if(message.status == 'ok'){
					me.objectList = list;
					me.listLanguage = C().getLang();
					me.listRefresh = false;
					objectRequest.notify.call(me.objectList);
				}
				
				me.objectRequests.del(message.requestId);
			}
			
			else
				new msg.Message('received invalid message', null, 1);
	}
}

model.BClass.resendRequest = function(properties){
		
		var objectClass = B(properties.classTitle);
		var old;
		if(old = objectClass.objectRequests.has(properties.requestId)){
			
			var requestId = objectClass.title+Math.floor(Math.random()*100);
			msg.clear({id: properties.requestId});
			
			var pars = 'bclass='+properties.classTitle+'&requestId='+requestId+'&id='+old.id;
			new msg.Message('timeout, resending Request.', requestId, -1);
		
			net.getCommunicator().
			request({'url': old.url, 'pars' : pars, onComplete: old.callback});
			
			objectClass.objectRequests.add(requestId, {'notify' :
			old.notify, 'url': old.url, 'id': old.id, 'callback': old.callback});
			
			setTimeout("model.BClass.resendRequest({requestId: ['"+requestId+"'], classTitle: ['"+properties.classTitle+"']})", 10*1000);
			
			objectClass.objectRequests.del(properties.requestId);
			
			return null;
			
		}
		
	}




// Business Objects
model.BObject = function(properties){
	
	for (var key in properties){
		this[key] = properties[key];
	}
		
}
