function $GS (ref) { return jsref(ref, "gstr"); }
function $GO (s)   { return jsref(s,   "gobj"); }
function CallCallback (cfunc, carg)  { $GO(cfunc)(carg); }
function jsref (ref, what) {

  // guess
  if (!what) {
    what = (typeof(ref) == "string") ? "gobj" : "gstr";
  }

  var c = jsref;

  if (!c.str_ref) c.str_ref = {};
  if (!c.ref_str) c.ref_str = {};
  if (!c.n) c.n = 0;

  if (what == "gstr") {
    if (!c.ref_str[ref]) {
      c.n++;
      c.ref_str[ref] = c.n;
      c.str_ref[c.n] = ref;
    }
    return "jsref:"+ c.ref_str[ref];
  }
  else if (what == "gobj") {
    ref = ref.replace(/\D+/g, '');
    return c.str_ref[ref];
  }
  return null;
}

// quote word
function qw (s) {
  return s.replace(/^\s+|\s+$/g,'').split(/\s+/);
}

// (hash_slice) vrati array sa $keys vrijednostima
function hsk (hash, keys) {
  var hslice = {};

  if (typeof keys == "string") keys = qw(keys);
  for (var i=0; i<keys.length; i++) {
    var key = keys[i];
    hslice[key] = hash[key];
  }
  return hslice;
}

/*
function hash (ary) {
  if (ary.constructor != Array) return ary;
  var h = {};
  for(var k in  ary) { if (typeof ary[k] != "function") h[k] = ary[k]; }
  return h;
}
*/

/**
 * 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.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
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;
}

function ShowHideMe(id){
  var smthng = document.getElementById(id);
  var additi = id + " link";
  var smthng2 = document.getElementById(additi);
  var smthngls = smthng.className;
  var splt = smthngls.split(' ');
  if (splt[1] == 'hideme') {
    smthng.className = splt[0];
    smthng2.className = "hidemeoff";
  }
  else {
    smthng.className = splt[0] + " hideme";
    smthng2.className = "hidemeon";
  }
}
