/****c* oos.comm.ajax/PushObject
  *  NAME
  *    PushObject - Class representing a PushObject
  *  VERSION
  *    1.00
  *  AUTHOR
  *    Reinhard Holzmann
  *  CREATION DATE
  *    11/04/2006
  *  HISTORY
  *    1.00	Basic version
  *  SYNOPSIS
  *    var myPushletObject = new PushletObject();
  *  DESCRIPTION
  *    A pushlet object.
  ***/
function PushObject(inSubject, inCallback, inDeserializer, inMode) {
	var me = this;
	var mySubject;
	var myCallback;
	var myMode;
	var mySId=null;
	var myDeserializer;
	
	var myActive = false;
	
	oosconstructor = function(inSubject, inCallback, inDeserializer, inMode) {
		mySId = null;
		
		me.setSubject(inSubject);
		me.setCallback(inCallback);
		me.setDeserializer(inDeserializer);
		me.setMode(inMode);
	}
	
	me.activate = function(inSubject, inCallback, inDeserializer, inMode) {	
		var saveSubject = mySubject;
		if(typeof(inSubject)!="undefined")
			me.setSubject(inSubject);		
		if(typeof(inCallback)!="undefined")
			me.setCallback(inCallback);
		if(typeof(inDeserializer)!="undefined")
			me.setDeserializer(inDeserializer);
		if(typeof(inMode)!="undefined")
			me.setMode(inMode);

		// verify parameter
		if ( (typeof(mySubject) == "undefined" || mySubject == null)
			||
			(typeof(myCallback) == "undefined" || myCallback == null))
			return false;	
		
		// already running - force mode - just change subscription!						
		if(myActive == true) {
			if(mySubject != saveSubject)
				if(!Pushlets.unsubscribe(mySId))
						return false;
		}
		
		// not running yet - start!	
		else {			
			// embed iframe
			if(Pushlets.Embedded == false) {	
				Pushlets.embed()
			}
								
			// join/listen = create session	
			if(Pushlets.Joined == false) {
				Pushlets.join(myMode);
			}	
			
			// add to Vector which is searched when a message occurs
			Pushlets.addObject(me);
		}
				
		// subscribe to the subject	
		if(!Pushlets.subscribe(mySubject))
			return false;
		
		myActive = true;	
		return true;
	}

	me.deactivate = function() {
		if(myActive == false)
			return true;
			
		// unsubscribe from subject with id
		Pushlets.unsubscribe(mySId);
		
		Pushlets.removeObject(me);
		
		// no more objects: close session and leave from server
		if( Pushlets.sizeOfObjects() == 0) {
			Pushlets.leave();
		}
		
		myActive = false;		
		return true;
	}		
	
	me.change = function(inSubject) {
		me.setSubject(inSubject);	
		
		// if not active - all done
		if(myActive == false)
			return true;
	
		// otherwise try to change subscription
		if(Pushlets.unsubscribe(mySId))
			if(Pushlets.subscribe(mySubject))
				return true;
		return false;	
	}		
	
	me.setCallback = function(inCallback) {
		if (typeof(inCallback)!="function")
			myCallback = null;
		else		
			myCallback = inCallback;	
	}
	
	me.setMode = function(inMode) {
		if (typeof(inMode) == "undefined" || inMode == null)
			myMode = Pushlets.DefaultMode;	
		else	
			myMode = inMode;
	}
	
	me.setDeserializer = function(inDeserializer) {
		if(typeof(inDeserializer) != "undefined" && inDeserializer == null )
			myDeserializer = null;
		else if(typeof(inDeserializer) != "function")
			myDeserializer = Pushlets.DefaultDeserializer;
		else
			myDeserializer = inDeserializer;	
	}	

	me.setSubject = function(inSubject) {
		if (typeof(inSubject) == "undefined")
			mySubject = null;	
		else
			mySubject = inSubject;
	}	
		
	me.getSubject = function() {
		return mySubject;
	}
	
	me.setSId = function(inSId) {
		mySId = inSId;
	}	
		
	me.getSId = function() {
		return mySId;
	}	
	
	me.getActive = function() {
		return myActive; 
	}			
	
	me.callback = function(inParam) {
		// call callback function  - 
		// if an object deserializer is given use it!
		if(myDeserializer)
			inParam = myDeserializer(inParam);
		myCallback(inParam);
	}
	
	oosconstructor(inSubject, inCallback, inDeserializer, inMode);
}	
