function update_lang(page,lang)
{
  self.location.href = "index.php?" + ((page!="")?("page=" + page + "&"):"") + "action=" + lang;
}


function getObjById(id)
{
  if (document.layers)
    return document.layers[id];
  else if (document.getElementById)
    return document.getElementById(id);
  else if (document.all)
    return document.all[id];
}

function changeElement(elem, fs) // change background color
{
  elem.style.backgroundColor = fs;
}


//------------------------------------------------------------
function toggle_show(id)
{
  var obj = getObjById(id);

  if (document.layers)
  {
    var new_setting = (obj.display == 'none') ? 'block' : 'none';
    obj.display = new_setting;
  }
  else
  {
    var new_setting = (obj.style.display == 'none') ? 'block' : 'none';
    obj.style.display = new_setting;
  }
}


function set_show_aux(name, val)
{
  if (document.layers)
    document.layers[name].display = val;
  else if (document.getElementById)
    document.getElementById(name).style.display = val;
  else if (document.all)
    document.all[name].style.display = val;
}

function set_show_off(name)
{
  set_show_aux(name, 'none');
}

function set_show_on(name)
{
  set_show_aux(name, 'inline');
}

function set_show_on_b(name)
{
  set_show_aux(name, 'block');
}

//------------------------------------------------------------


function set_vis_aux(name, val)
{
  if (document.layers)
    document.layers[name].visibility = val;
  else if (document.getElementById)
    document.getElementById(name).style.visibility = val;
  else if (document.all)
    document.all[name].style.visibility = val;
}

function set_vis_off(name)
{
  set_vis_aux(name, 'hidden');
}

function set_vis_on(name)
{
  set_vis_aux(name, 'visible');
}



//------------------------------------------------------------
function find(elem, array)
{
  for (var i=0 ; i < array.length ; ++i)
    if (array[i] == elem)
      return true;
  return false;
}


function isArray(obj) 
{
  if (obj.constructor.toString().indexOf("Array") == -1)
    return false;
  else
    return true;
}


function skip_spaces(str, idx)
{
  while(str.charAt(idx) == ' ')
    ++idx;
  return idx;
}


function read_a_la_lisp_aux(param, array)
{
  if (param == "")
    return array;
  
  var idx = 1; // Skip first '('
  var idx2 = idx;
  while (idx2 < param.length)
  {
    var c = param.charAt(idx2);

    if (c == '(') // sub-element
    {
      if (idx2 != idx)
        array[array.length] = param.slice(idx, idx2);
      idx = idx2;
      idx2 = param.indexOf(")", idx);
      array[array.length] = read_a_la_lisp_aux(param.slice(idx, idx2+1), new Array());
      idx = ++idx2;
    }
    else if ((c == ' ') || (c == ')')) // Found a word terminator
    {
      array[array.length] = param.slice(idx, idx2);
      idx = ++idx2;
    }
    else
      ++idx2;
    
    if (c == ')')
      return array;
  }
  return "Error on read-a-la-lisp: ill-formed param:" + param;
}



function read_a_la_lisp(param)
{
  return read_a_la_lisp_aux(param, new Array());
}

function write_a_la_lisp(array)
{
  var str="(";
  for (var i=0 ; i < array.length ; ++i)
  {
    if (isArray(array[i]))
      str += write_a_la_lisp(array[i]);
    else
    {
      str += array[i];
      if (i != array.length-1)
        str += " ";
    }
  }
  str += ")";
  return str;
}



function add_numeric_options(select_id, start, end, param_idx, parameters, default_selected)
{
  var obj_select = document.getElementById(select_id);

  for (var n=start ; n <= end ; ++n)
  {
    var obj_option = document.createElement("OPTION");  
    obj_option.text=n;
    obj_option.value=n;

    obj_select.options[obj_select.options.length] = obj_option; 
 }

  var selected = default_selected;
  if (parameters != "")
  {
    var array_param = read_a_la_lisp(parameters);
    selected = array_param[param_idx];
  }
  obj_select.options[selected - start].selected = true;
}


function removeChildrenFromNode(node)
{
  while (node.hasChildNodes())
  {
    node.removeChild(node.firstChild);
  }
}

function p_add(obj, msg)
{
  newSpan = document.createElement("span");
  newSpan.innerHTML = msg;
  obj.appendChild(newSpan);
//  obj.appendChild(document.createTextNode(msg));
}
function p_clean(obj)
{
  removeChildrenFromNode(obj);
}
function p_length(obj)
{
  return obj.childNodes.length;
}


function myParseInt(str)
{
  if ((str == "") || isNaN(str))
    return 0;
  else
    return parseInt(str);
}

function remove_last_char(str)
{
  if (str.length == 0)
    return str;
  else
    return str.substring(0, str.length-1);
}



//----------------------------------------------------------
// Board operations
//----------------------------------------------------------
function get_number(idx, number)
{
  return getObjById("n_" + idx + "_" + number);
}
function get_counter(idx)
{
  return getObjById("n_numbers_selected_" + idx);
}
  
function select_number(board, idx, number)
{
//  alert("" + idx + " - " + number);
//  get_number(idx, number).bgColor = "#007700";
  get_number(idx, number).bgColor = "#44bb44";
  board[number] = 1;
  var n_obj = get_counter(idx);
  n_obj.value = parseInt(n_obj.value)+1;
}

function unselect_number(board, idx, number)
{
  get_number(idx, number).bgColor = "#ffffff";
  board[number] = 0;
  var n_obj = get_counter(idx);
  n_obj.value = parseInt(n_obj.value)-1;
}
  
function touch_number(board, idx, number)
{
  if (board[number] == 1)
    unselect_number(board, idx, number);
  else
    select_number(board, idx, number);
}

function clean_numbers(board, idx)
{
  for (var i=0 ; i < board.length ; ++i)
    if (board[i] == 1)
      unselect_number(board, idx, i);
}


function init_board(board, idx, selected_numbers)
{
/*
  var str="";
  for (var i=0 ; i < selected_numbers.length ; ++i)
    str += " " + selected_numbers[i];
  alert(str);
*/
  for (var i=0 ; i < selected_numbers.length ; ++i)
    select_number(board, idx, selected_numbers[i]);
}

// Random
function create_numbers_array(board)
{
  var total = board.length -1;
  var all_numbers = new Array(total);
  for (i=0 ; i < total ; ++i)
    all_numbers[i] = i+1;
  return all_numbers;
}

function shift_numbers_array(all_numbers, position)
{
  for (i=position+1 ; i < all_numbers.length ; ++i)
    all_numbers[i-1] = all_numbers[i];
}


function generate_random_numbers(board, idx)
{
  var howmany = getObjById("n_rand_" + idx).value;
  var all_numbers = create_numbers_array(board);
  var remaining = all_numbers.length;

  clean_numbers(board, idx);
  while (howmany > 0)
  {
    position = Math.round((remaining-1) * Math.random());
    var num = all_numbers[position];
    shift_numbers_array(all_numbers, position);
    select_number(board, idx, num);
    --remaining;
    --howmany;
  }
}

//----------------------------------------------
// TOC
//----------------------------------------------
function H_getText(el) 
{
  var text = "";
  for (var i = el.firstChild; i != null; i = i.nextSibling) 
  {
    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)
      text += i.data;
    else if (i.firstChild != null)
      text += H_getText(i);
  }
  return text;
}

function TOC_EL(el, text, level) 
{
  this.element = el;
  this.text = text;
  this.level = level;
}

function getHeadlines(el) {
  var l = new Array;
  var rx = /[hH]([1-6])/;
  // internal recursive function that scans the DOM tree
  var rec = function (el) {
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
        if (rx.exec(i.tagName))
          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));
        rec(i);
      }
    }
  }
  rec(el);
  return l;
}

function generate_TOC(parent_id) 
{
  var parent = document.getElementById(parent_id);
  var hs = getHeadlines(document.getElementsByTagName("body")[0]);
  for (var i = 0; i < hs.length; ++i) {
    var hi = hs[i];
    var d = document.createElement("div");
    if (hi.element.id == "")
      hi.element.id = "gen" + i;
    var a = document.createElement("a");
    a.href = "#" + hi.element.id;
    a.appendChild(document.createTextNode(hi.text));
    d.appendChild(a);
    d.className = "level" + hi.level;
    parent.appendChild(d);
  }
}
//----------------------------------------------

<!-- Paste this code into an external JavaScript file named: bookMark.js  -->

/* This script and many more are available free online at
The JavaScript Source :: http://javascript.internet.com
Created by: Philip Myers :: http://virtualipod.tripod.com/bookmark.html */

function bookmark(url,title){
  if ((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4)) {
  window.external.AddFavorite(url,title);
  } else if (navigator.appName == "Netscape") {
    window.sidebar.addPanel(title,url,"");
  } else {
    alert("Press CTRL-D (Netscape) or CTRL-T (Opera) to bookmark");
  }
}

