var doc=document; 
function $(n) {
  return doc.getElementById(n);
}

function trim(s) {
  return s.replace(/^\s+|\s+$/g, "");
}


/*** IE Hacks ***/
function refreshFooter() {
  $('footer').style.display = 'none';
  $('footer').style.display = 'block';
}


/*** Keyboard / Mouse ***/
var _windowOnkeydown, _windowOnkeyup, _windowOnkeypress;
/* Disable keyboard */
function disableKeyEvents() {
	var dk = function (e) {
			if (window.event) e = window.event;
		if (!e) return false;
		if (!e.preventDefault) e.preventDefault = function() { e.returnValue = false;	return false;	}
		return e.preventDefault();		
	}
	_windowOnkeydown = window.onkeydown;
	_windowOnkeypress = window.onkeypress;
	_windowOnkeyup = window.onkeyup;
	window.onkeydown = dk;
	window.onkeypress = dk;
	window.onkeyup = dk;	
}
/* Reenable keyboard */
function enableKeyEvents() {
	window.onkeydown = _windowOnkeydown;
	window.onkeypress = _windowOnkeypress;
	window.onkeyup = _windowOnkeyup;
}

/* Disable mouse*/
var _disableMouseEventsObject=null;
function disableMouseEvents() {
	if (_disableMouseEventsObject) return false;
	this.body = document.getElementsByTagName("body")[0];
	_disableMouseEventsObject = document.createElement('div');
	_disableMouseEventsObject.style.top='0px';
	_disableMouseEventsObject.style.bottom='0px';
	_disableMouseEventsObject.style.left='0px';
	_disableMouseEventsObject.style.right='0px';
	_disableMouseEventsObject.style.position='absolute';
	_disableMouseEventsObject.id='_disableMouseEventsObject';
	body.appendChild(_disableMouseEventsObject);
}
/* Reenable mouse */
function enableMouseEvents() {
	if (!_disableMouseEventsObject) return false;
	this.body = document.getElementsByTagName("body")[0];
	body.removeChild(_disableMouseEventsObject);
	_disableMouseEventsObject = null;
}


/** Cookie functions **/
function setCookie(c_name, value, path, expiredays) {
  var exdate=new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  
  if (path == 'this') {
    path = window.location.href;
    path = path.replace(/http:\/\/[^\/]*/, '');
    path = path.replace(/\/[^\/]*$/, '/');
  }
  
  document.cookie=c_name+ "=" +escape(value)+
    ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())+
    ((path==null) ? "" : ";path="+path);
}

function getCookie(c_name) {
  if (document.cookie.length > 0) {
    c_start = document.cookie.indexOf(c_name + "=");
    if (c_start != -1) {
      c_start = c_start + c_name.length + 1;
      c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) c_end = document.cookie.length;
      return unescape(document.cookie.substring(c_start, c_end));
    }
  }
  return "";
}



/** Debug **/

/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 */
function dump(arr, level) {
  var dumped_text = "";
  if (!level) level = 0;
  
  //The padding given at the beginning of the line.
  var level_padding = "";
  for (var j = 0; j < level + 1; j++) 
    level_padding += "    ";
  
  if (typeof(arr) == 'object') { //Array/Hashes/Objects
    for (var item in arr) {
      var value = arr[item];
      
      if (typeof(value) == 'object') { //If it is an array,
        dumped_text += level_padding + "'" + item + "' ...\n";
        dumped_text += dump(value, level + 1);
      }
      else {
        dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
      }
    }
  }
  else { //Stings/Chars/Numbers etc.
    dumped_text = "===>" + arr + "<===(" + typeof(arr) + ")";
  }
  return dumped_text;
}

