/*  ******************************************************************
 **  Soubor  :  /ariadne/javascript/lib.js
 **
 **  Modul   :  Pomocné funkce
 **  Verze   :  0.1.0
 **
 **  Autor   :  Michal Hromádko      michal.hromadko@lifeweb.cz
 **  Revize  :  Martin Jonáš         martin.jonas@lifeweb.cz
 **
 **  Popis   :  Knihovna pomocných funkcí v javascriptu
 ** ***************************************************************** */

/**
 * Funkce vrací element stránky podle jeho Id
 * @param id Id hledaného elementu
 * @return Vrací referenci na hledaný element
  Zdroj: http://www.netlobo.com/javascript_get_element_id.html
 */
function returnObjById( id ) {
    if (document.getElementById) {
        var returnVar = document.getElementById(id);
    } else if (document.all) {
        var returnVar = document.all[id];
    } else if (document.layers) {
        var returnVar = document.layers[id];
    }
    return returnVar;
}

/**
 * Funkce zjišťuje, zda je zadaný rok přestupný
 * @param year Zkoumaný rok
 * @return Vrací true, pokud je rok přestupný
 */
function IsLeapYear (year) {
  return (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0));
}

/**
 * Funkce zjišťuje zda jde o integer
 * @param val Zkoumaná proměnná
 * @return Vrací true, pokud jde o integer
 */
function IsInteger (val) {
  if (val == "")
    return false;

  for (i = 0 ; i < val.length ; i++) {
    if ((val.charAt(i) < '0') || ('9'< val.charAt(i))) return false;
  }

  return true;
}

/**
 * Funkce zjišťuje zda je prohlížečem Internet Explorer
 * @return Vrací true, pokud jde o Internet Explorer
 */
function isIE() {
  return (document.all) ? (true) : (false);
}

/**
 * Funkce vrací pozici myši
 * @param e Event
 *
  Capturing The Mouse Position in IE4-6 & NS4-6
  (C) 2000 www.CodeLifter.com
  Free for all users, but leave in this  header
 */
function GetMousePos(e) {

  var tempX = 0;
  var tempY = 0;
  var Pos;

  if (isIE()) { // grab the x-y pos.s if browser is IE
    tempX = event.clientX + document.body.scrollLeft;
    tempY = event.clientY + document.body.scrollTop;
  } else {  // grab the x-y pos.s if browser is NS
    tempX = e.pageX;
    tempY = e.pageY;
  }
  // catch possible negative values in NS4
  if (tempX < 0) {
    tempX = 0;
  }
  if (tempY < 0) {
    tempY = 0;
  }

  Pos = [tempX, tempY];

  return Pos;
}

document.getElementsByClassName = function(className) {
  var children = document.getElementsByTagName('*') || document.all;
  var elements = new Array();

  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }
  return elements;
}

/**
 * Funkce zjistí zda je prvek obsažen v poli
 * @param item Hledaný prvek
 * @param array Pole
 * @return Vrací true, pokud je prvek nalezen. Jinak vrací false
 */
function isInArray(item, array) {
  for(var i = 0; i < array.length; i++) {
    if(array[i] == item) {
      return true;
    }
  }
  return false;
}

/**
 * Funkce přidá prvek do pole
 * @param item Přidávaný prvek
 * @param array Pole
 */
function addToArray(item, array) {
  array.push(item);
}

/**
 * Funkce odstraní prvek z pole
 * @param item Odebíraný prvek
 * @param array Pole
 */
function removeFromArray(item, array) {
  for(var i = 0; i < array.length; i++) {
    if(array[i] == item) {
      array.splice(i, 1);
    }
  }
}

/**
 * Funkce zastaví vyvolání události
 * @param e Událost
 */
function stopEvent(e) {
  if (!e) var e = window.event;
  if (!e) {
    alert("!event");
    return;
  }

  if (isIE()) {
    e.returnValue = false;
    e.cancelBubble = true;
  }

  e.preventDefault && e.preventDefault();
  e.stopPropagation && e.stopPropagation();

  return false;
}


/**
 * Funkce detekuje, zda eventa se váže k pravému kliku myší.
 * POZOR: Jako pravý klik se bere i levý klik s controlem (kvůli Opeře).
 *
 * @param Event event událost, která se má kontrolovat
 */
function isRightClick(event) {
  if (!event) {
    return false;
  }
  else if (event.which && (event.which != 3 && !(event.which == 1 && event.ctrlKey))) {
    // FF a ostatní
    return false;
  }
  else if (typeof(event.button) != 'undefined' && event.button != 2) {
    // IE
    return false;
  }

  return true;
}


/**
 * Rušení kontextového menu pro browsery bez události oncontextmenu.
 *
 * @param Object element objekt, kde byla událost vyvolána
 * @param Event e
 */
function cancelContextMenu(element, e) {
  if (!e) var e = window.event;
  // blokujeme pouze když se skutečně jedná o pravý klik
  if (!isRightClick(e)) {
    return true;
  }

  if (!element) var element = e.target || e.srcTarget;

  $(element).add('UL.contextMenu').bind('contextmenu', function() { return false; });

  if ($.browser.mozilla || 'oncontextmenu' in document.createElement('span')) {
    // není co dál řešit
    return stopEvent(e);
  }

  var overrideButton;
  // zablokujeme původní menu (nefunguje v Opeře)


  if (!overrideButton) {
    var doc = e.target.ownerDocument;
    overrideButton = doc.createElement('input');
    overrideButton.type='button';
    (doc.body||doc.documentElement).appendChild(overrideButton);
  }

  // spočítáme pozici buttonku
  var butX = 0;
  var butY = 0;
  if (e.pageX || e.pageY) {
    butX = e.pageX;
    butY = e.pageY;
  }
  else if (e.clientX || e.clientY) {
    butX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    butY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  }

  overrideButton.setAttribute('style', 'position:absolute;top:'+(butY-2)+'px;left:'+(butX-2)+'px;width:5px;height:5px;opacity:0.001');

  // zrušení zobrazení overrideButtonu
  if (addEventListener) {
    addEventListener('mouseup', function(e) {
      if (overrideButton) {
        overrideButton.parentNode.removeChild(overrideButton);
        overrideButton = undefined;
      }
    }, true);
  }

  return stopEvent(e);
}


/**
 * Vystřelí syntetickou eventu události typu <tt>evType</tt> (výchozí je contextmenu). Tímto
 * můžeme měnit typy událostí, které se odehrávají.
 *
 * @param Event e eventa, na níž bude syntetická eventa založena
 * @param string evType typ události
 */
function dispatchCustomEvent(e, evType) {
  var doc = e.target.ownerDocument || (e.view ? e.view.document : null) || e.target;
  var newEv = doc.createEvent('MouseEvent');
  newEv.initMouseEvent(evType || 'contextmenu', true, true, doc.defaultView, e.detail,
  e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey,
  e.shiftKey, e.metaKey, e.button, e.relatedTarget);
  newEv.synthetic = true;
  e.target.dispatchEvent(newEv);
}

function var_dump(obj) {
   if(obj == null) {
     return 'null';
   }
   if(typeof obj == "object") {
     return "Type: "+typeof(obj)+((obj.constructor) ? "\nConstructor: "+obj.constructor : "")+"\nValue: " + obj;
   } else {
     return "Type: "+typeof(obj)+"\nValue: "+obj;
   }
}

