// <!--

/*
Custom session class
DEPENDENCIES:
prototype.js

AUTHOR: jorrit Duin
COMPANY: www.jorr-it.net
COPYRIGHT (c) www.jorr-it.net

Wordt gebruikt om op een 'custom' sessieid
variabele op te slaan in het 'ob_session' jorr-api object
Het is een server onafhankelijke manier om met sessies om te gaan
Het gebruikt de cookiemanager.js om de sid (server ID) op te slaan
in een javascript cookie.

Op het moment dat een geldig cookie aanwezig is wordt de functie:

	start_jorr_app()
	
aangeroepen:

Alle scripts die afhankelijk zijn van een sessie kunnen dan 
worden geinstandieerd. Er is dan een gedlige sessie aanwezig.



 --- Als er geen cookies geacepteerd worden --
dan werkt dit ook:
Alleen zolang de pagina niet ververst wordt. 
Bij een refresh worden een nieuwe SID gegeven

EXAMPLES:
	// Open een cookiemanager met 2 dagen verlooptijd en zet de serverside handler
sessionmanager = new Jorr_custom_sessions({shelfLife: 2,connectionurl:"http://localhost/handle.php"});
	// Kijkt of er een cookie is
	// Zo ja controleer of de cookie geldig is
	// Als er geen (geldige) cookie is wordt
	// een nieuwe aangemaakt
sessionmanager.check(); 
	// Haal de sessieid op
var SID = sessionmanager.getSID();
	// Override the sid (niet verstandig, niet gebruiken)
sessionmanager.setSID()
	// Verwijder de SID, er bestaat geen aktieve sessie meer
	// Alle variabele zijn verdwenen
sessionmanager.clearSID();
	// Bewaar data
	// [name] is de naam van de data (cookievar)
	// [o] is een javascript struct, array , object, string (en wordt als JSON verwerkt)
	// [callback] het javascript object welke de data afhandeld
		     // De server retourneerd javascript/text
		     // En wordt meteen ge-eval()-led
		     // de response ziet er als volgt uit: [callback(SID);] 
		     // Als de SID is ongelijk aan de huidge SID dan is er een probleem (verlopen sessie)
sessionmanager.store(name,o,callback)

	// HAAL IETS OP (het kan werkelijk alles zijn
	// De geretourneerde waarde is pure javascript en wordt meteen ge-eval()-ed
	// [name] is de naam van de data (cookievar)
	// [callback] De callback wordt gebruikt worden om de response op te vangen in een bestaand javascript object
	// De response ziet er als volgt uit:
	// [callback](json_string)
	// De json_string bevat de opgervraagde waarde (of is leeg) {}
sessionmanager.load(name,callback)


/////////////   SERVERSIDE /////////////////////

$session = &getObject('af_base:ob_session');
$session->setDatabase($a->db);
$session->handleAjaxRequest();
*/


Jorr_custom_sessions = Class.create();
Jorr_custom_sessions.prototype = {
	BROWSER_IS_IE:
		(document.all
		 && window.ActiveXObject
		 && navigator.userAgent.toLowerCase().indexOf("msie") > -1
		 && navigator.userAgent.toLowerCase().indexOf("opera") == -1),

	    /**
	     * I hate navigator string based browser detection too, but when Opera alone
	     * chokes on cookies containing double quotes...
	     */
	BROWSER_IS_OPERA:(navigator.userAgent.toLowerCase().indexOf("opera") != -1),
	
	BROWSER_IS_SAFARI:(navigator.userAgent.toLowerCase().indexOf("Safari") != -1),
	
	initialize:function(options){
		
		this.options = 
		{
			shelfLife: 2, // Lifetime sessions
			userDataForIE: true, // Userdate for IE
			connectionurl:"", // The URL (reciever) serverside
			sessionname:"jorr_sid" // The COOKIE NAME
		}
		Object.extend(this.options,options); // Override defaults
		Object.extend(this,this.options); // Set options as properies
		 if (this.BROWSER_IS_IE && this.userDataForIE){
		    this.IE_CACHE_NAME = "storage";
		    if ($(this.IE_CACHE_NAME) == null)
		    {
			var div = document.createElement("DIV");
			div.id = this.IE_CACHE_NAME;
			document.body.appendChild(div);
		    }
		    this.store = $(this.IE_CACHE_NAME);
		    this.store.style.behavior = "url('#default#userData')";
		}
		this.id = null;
	},
	setSID:function(aCookieValue){
		 
		  if (this.BROWSER_IS_IE && this.userDataForIE){
			    this.store.setAttribute(this.sessionname, aCookieValue);
			    this.store.save(this.IE_CACHE_NAME);
		  }else{
			    if (this.BROWSER_IS_OPERA)
			    {
				aCookieValue = aCookieValue.replace(/"/g, "%22");
			    }
			    var date = new Date();
			    date.setTime(date.getTime() + (this.shelfLife * 24*60*60*1000));
			    var expires = '; expires=' + date.toGMTString();
			    document.cookie = this.sessionname + '=' + aCookieValue + expires + '; path=/';
		 }
		 this.id = aCookieValue;
	},
	getSID:function(){
		var result = null;
		if (this.BROWSER_IS_IE && this.userDataForIE)
		{
		    this.store.load(this.IE_CACHE_NAME);
		    result = this.store.getAttribute(this.sessionname);
		}
		else
		{
		    for (var i = 0; i < document.cookie.split('; ').length; i++)
		    {
			var crumb = document.cookie.split('; ')[i].split('=');
			if (crumb[0] == this.sessionname && crumb[1] != null)
			{
			    result = crumb[1];
			    break;
			}
		    }
		}
	
		if (this.BROWSER_IS_OPERA && result != null)
		{
		    result = result.replace(/%22/g, '"');
		}
		this.id = result;
		return result;
	},
	check:function(){
		this.getSID();
		this._doCheckSession();
	},
	safe:function(name,o,callback){
		this._doStoreItems(name,o,callback)
		
	},
	load:function(name,callback){
		this._doLoadItems(name,callback);
	},
	_doCheckSession:function(){
		var date = new Date();
		var t = date.getTime();
		var url = this.connectionurl+"?action=af_base:ob_session:createsid&sid="+this.id+"&t="+t;
		var s = new Ajax.Request(url,
		  {
		    method:'get',
		    asynchronous:true,
		    onSuccess: function(transport){
		      var response = transport.responseText.strip() || "failure";
		      if((response=="failure")||(response.length!=36)){
			        alert("ERROR: unable te retrieve cookie information: "+response);
				return false;
		      };
		      o = new Jorr_custom_sessions({shelfLife:3,userDataForIE: true,sessionname:"jorr_sid"});
		      o.setSID(response);
		      start_jorr_app();
		    },
		    onFailure: function(){ alert('Unable to create session...') }
		  });
		
	},
	_doLoadItems:function(name,callback){
		name = encodeURIComponent(name);
		callback = encodeURIComponent(callback);
		var date = new Date();
		var t = date.getTime();
		var url = this.connectionurl+"?action=af_base:ob_session:load&sid="+this.id+"&name="+name+"&callback="+callback+"&t="+t;
		var s = new Ajax.Request(url,
		  {
		    method:'get',
		    asynchronous:false,
		    onSuccess: function(transport){
		    
		    },
		    onFailure: function(){ alert('Unable to load var...') }
		  });
		
	},
	_doStoreItems:function(name,o,callback){
		// name = escape(name);
		name = encodeURIComponent(name);
		val = o.toJSON();
		val = encodeURIComponent(val);
		callback = encodeURIComponent(callback);
		var date = new Date();
		var t = date.getTime();
		var url = this.connectionurl+"?action=af_base:ob_session:store&sid="+this.id+"&name="+name+"&val="+val+"&callback="+callback+"&t="+t;
		var s = new Ajax.Request(url,
		  {
		    method:'get',
		    asynchronous:false,
		    onSuccess: function(transport){
		  
		    },
		    onFailure: function(){ alert('Unable to store var...') }
		  });
	},
	     /**
	     * Clears the cookie 
	     */
	    clearSID: function()
	    {
		if (this.BROWSER_IS_IE && this.userDataForIE)
		{
		    this.store.load(this.IE_CACHE_NAME);
		    this.store.removeAttribute(this.sessionname);
		    this.store.save(this.IE_CACHE_NAME);
		}
		else
		{
		    document.cookie =
			this.sessionname + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
		}
	    }
}


// -->

