// Returns an object's keys
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

// Trim function if not defined (IE7 IE8)
// http://stackoverflow.com/questions/2308134/trim-in-javascript-not-working-in-ie
if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
  }
}

// debug function if not defined
// TODO something to debug on those browser
if(typeof console !== 'object' && typeof console !== 'function') {
  window.console = function() {
    return "";
  }
}
if(typeof console.debug !== 'function') {
  console.debug = function() {
    return "";
  }
}
if(typeof console.dir !== 'function') {
  console.dir = function() {
    return "";
  }
}
if(typeof console.log !== 'function') {
  console.debug = function() {
    return "";
  }
}


// General function to handle async. requests
var __gReqCount = 0;
var __gReqRef = $(new Array());
var __gReqCallers = $(new Array());
function psRequest(caller, method, handler, func, params, callback) {
	if(caller == window || caller == document)
		caller = $('body');	// Use body instead of document
	else if(!caller.jquery)
		caller = $(caller);	// Make sure the caller is a jQuery object

	// Initialize caller on first request
	if($.inArray(caller, __gReqCallers) < 0) {
		caller.data('ref', 0);
		caller.data('cursor', $(caller).css('cursor'));
	}
	// Only allow one request at a time
	if(caller.data('ref') >= 1)
		return false;

	if(__gReqCount++ == 0)
		$('body').css('cursor', 'wait');

	caller.data('ref', caller.data('ref') + 1);
	caller.data('params', params);
	caller.css('cursor', 'wait');

	var jqMethod = null;
	var controller = '';
	switch(method)
	{
	// Recommanded
	case 'json':
		jqMethod = $.getJSON;
		controller = 'json';
		break;
	case 'post':
		jqMethod = $.post;
		controller = 'json';
		break;
	case 'whr':
		jqMethod = $.post;
		controller = 'whr';
		break;
	}

	if(method == 'json') {
		// Generate parameters string
		__reqParams = '';
		$(params).each(function(i,e){
			if($.type(e) != 'object')
				__reqParams += e;
			else {
				var key = Object.keys(e)[0];
				__reqParams += key+'='+e[key];
			}

			if (i < params.length - 1)
				__reqParams += '/';
		});

		jqMethod('/'+controller+'/'+handler+'/'+func+'/'+__reqParams, function(data, textStatus, jqXHR){
				if(callback != undefined)
					callback(data, caller.data('params'));

				if(--__gReqCount == 0)
					$('body').css('cursor', 'auto');

				/// TODO: Shouldn't use "caller" here, use local variable
				var refCaller = caller.data('ref') - 1;
				caller.data('ref', refCaller);

				if(refCaller == 0)
					caller.css('cursor', caller.data('cursor'));
			}
		).error(function(){
				if(--__gReqCount == 0)
					$('body').css('cursor', 'auto');

				var refCaller = caller.data('ref') - 1;
				caller.data('ref', refCaller);

				if(refCaller == 0)
					caller.css('cursor', caller.data('cursor'));

				alert('Nous éprouvons actuellement quelques difficultés.  Veuillez réessayer plus tard.');
			});
	}
	else {
		jqMethod('/'+controller+'/'+handler+'/'+func, params, function(data, textStatus, jqXHR){
				if(callback != undefined)
					callback(data, caller.data('params'));

				if(--__gReqCount == 0)
					$('body').css('cursor', 'auto');

				/// TODO: Shouldn't use "caller" here, use local variable
				var refCaller = caller.data('ref') - 1;
				caller.data('ref', refCaller);

				if(refCaller == 0)
					caller.css('cursor', caller.data('cursor'));
			},
			'json'
		).error(function(){
				if(--__gReqCount == 0)
					$('body').css('cursor', 'auto');

				var refCaller = caller.data('ref') - 1;
				caller.data('ref', refCaller);

				if(refCaller == 0)
					caller.css('cursor', caller.data('cursor'));

				alert('Nous éprouvons actuellement quelques difficultés.  Veuillez réessayer plus tard.');
			});
	}

} // psRequest
function remoteRequest (url, callbackFunctionName)
{
	
	var remLoader = document.createElement('script');
	remLoader.setAttribute('src', url);
	if (callbackFunctionName != undefined)
	{
		remLoader.setAttribute('onerror',callbackFunctionName+'()');
	}
	$('head')[0].appendChild(remLoader);
};

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}
