// JavaScript routines for the MediaArchive Tool.
// Authors:
//   Christian d'Heureuse (chdh@inventec.ch)
//   Juergen Ragaller (ragaller@null-oder-eins.ch)

//--- Misc. utility routines --------------------------------------------------

// Registers an event handler.
function registerEventHandler (node, eventName, eventHandler) {
   if (node.addEventListener) {                            // DOM compatible
      node.addEventListener (eventName,eventHandler,true); }
    else if (node.attachEvent) {                           // IE6
      node.attachEvent ("on"+eventName,eventHandler); }
    else {                                                 // old browsers
      node["on"+eventName] = eventHandler; }}

function getTime() {
   return new Date().getTime(); }

// Returns the elapsed time in milliseconds.
function getElapsedTime (startTime) {
   if (startTime === undefined) return undefined;
   return getTime() - startTime; }

function setFocus (elementId) {
   document.getElementById(elementId).focus(); }

/*
  getElementsByClassName
  Written by Jonathan Snook, http://www.snook.ca/jonathan
  Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(oElm, strTagName, strClassName){
  var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
  var arrReturnElements = new Array();
  strClassName = strClassName.replace(/-/g, "\-");
  var oRegExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");
  var oElement;
  for(var i=0; i<arrElements.length; i++){
    oElement = arrElements[i];
    if(oRegExp.test(oElement.className)){
      arrReturnElements.push(oElement);
    }
  }
  return (arrReturnElements)
}

//--- Type checking and string routines ---------------------------------------

// Returns true if the argument string contains a valid number.
function isNumber (s) {
   return !isNaN(Number(s)); }

// Returns true if the argument string contains a valid integer value.
function isInteger (s) {
   var n = Number(s);
   if (isNaN(n)) return false;
   if ((n%1)!=0) return false;
   return true; }

// Removes leading and trailing blanks from a string value.
function trimString (s) {
   return s.replace(/^\s+/,"").replace(/\s+$/,""); }

function skipListDelimiters (s,p,mode) {
   while (p < s.length) {
      var c = s.charAt(p);
      var i = s.charCodeAt(p);
      if ((c == ' ' || c == ',' || c == ';' || i == 9) != mode) break;
      p++; }
   return p; }

// Returns true if the argument string contains an integer list.
function isIntegerList (s) {
   var p = 0;
   var cnt = 0;
   while (true) {
      var p0 = skipListDelimiters(s,p,true);
      if (p0 >= s.length) break;
      p = skipListDelimiters(s,p0,false);
      if (!isInteger(s.substring(p0,p))) return false;
      cnt++; }
   return cnt > 0; }

function combineStrings (s1,delimiter,s2) {
   var s = (s1 == null) ? "" : s1;
   if (s2 != null && s2 != "") {
      if (s != "") s += delimiter;
      s += s2; }
   return s; }

//--- Cookies -----------------------------------------------------------------

var cookiePrefix = "PORTAL_";

function setCookie (cookieName, cookieValue, permanent, path) {
   if (cookieValue == "") {deleteCookie (cookieName, path); return; }
   var s = cookieName + "=" + encodeURIComponent(cookieValue)
   if (path) s += "; path=" + path;
   if (permanent) s += "; expires=Thu, 31-Dec-2037 23:00:00 GMT; max-age=315360000"; // (IE6 needs "expires")
   document.cookie = s; }

function deleteCookie (cookieName, path) {
   var s = cookieName + "="
   if (path) s += "; path=" + path;
   // s += "; max-age=0";             // max-age=0 is DOM compatible but does not work with Safari 3.1.2
   s += "; expires=Thu, 01-Jan-70 00:00:01 GMT";
   document.cookie = s; }

function getCookie (cookieName, defaultValue) {
   var m = document.cookie.match("(^|;)\\s*"+cookieName+"=([^;]*)");
   if (m == null) return defaultValue;
   var s = m[2];
   if (s == "") return defaultValue;
   return decodeURIComponent(s); }

//--- Stylesheets -------------------------------------------------------------

var colorSchemes = ["1","2","3","4"];
var fontSchemes  = ["1","2"];

function enableStyleSheet (id, enabled) {
   var l = document.getElementById(id);
   if (l != null) {
      l.disabled = !enabled;
      return; }
   var ssl = document.styleSheets;                            // for old browsers
   if (ssl != null) {
      for (var i=0; i<ssl.length; i++) {
         var sh = ssl[i];
         if (sh.ownerNode != null && sh.ownerNode.id == id)  // Gecko
            sh.disabled = !enabled;
         else if (sh.id == id)                               // IE6
            sh.disabled = !enabled; }}}

function enableStyleSheetGroup (prefix, suffixes, enabledSuffix) {
   for (var p=0; p<suffixes.length; p++) {
      enableStyleSheet (prefix+suffixes[p], false); }       // for Safari 3.1.2, all Stylesheets of the group have to be disabled first before the selected stylesheet is enabled
   enableStyleSheet (prefix+enabledSuffix, true); }

function showLeftColumn (visible, doSetCookie) {
   enableStyleSheet ("styleNoLeftColumn",!visible);
   if (doSetCookie) setCookie (cookiePrefix+"NoLeftColumn",visible?"":"1"); }

function showColorScheme (colorScheme, doSetCookie) {
   enableStyleSheetGroup ("styleColor",colorSchemes,colorScheme);
   if (doSetCookie) setCookie (cookiePrefix+"ColorScheme",(colorScheme=="1")?"":colorScheme,true, '/'); }

function showFontScheme (fontScheme, doSetCookie) {
   enableStyleSheetGroup ("styleFont",fontSchemes,fontScheme);
   if (doSetCookie) setCookie (cookiePrefix+"FontScheme",(fontScheme=="1")?"":fontScheme,true, '/'); }

function initStyleSheets() {
   showLeftColumn (getCookie(cookiePrefix+"NoLeftColumn")!="1");
   showColorScheme (getCookie(cookiePrefix+"ColorScheme","1"));
   showFontScheme (getCookie(cookiePrefix+"FontScheme","1")); }

function getEffectiveStyle (element,stylePropName,cssPropName) {
   if (cssPropName === undefined) cssPropName = stylePropName;
   if (window.getComputedStyle) {                          // DOM 2
      return window.getComputedStyle(element,null).getPropertyValue(cssPropName); }
   if (element.currentStyle) {                             // IE6
      return element.currentStyle[stylePropName]; }
   return element.style[stylePropName]; }                  // fallback for Safari: (not the effective style)

function addClass (e,className) {
   if (e.className === undefined)
      e.className = className;
    else
      e.className += " " + className; }

function setBodyClassColorScheme() {
   addClass (document.body, "colorScheme" + getCookie(cookiePrefix+"ColorScheme","1")); }

//--- Show / hide elements and text -------------------------------------------

function setElementText (elementId, text) {
   document.getElementById(elementId).firstChild.nodeValue = text; }

function getElementText (elementId) {
   return document.getElementById(elementId).firstChild.nodeValue; }

function setElementTitle (elementId, title) {
   document.getElementById(elementId).title = title; }

function showElement (elementId, visible, visibleDisplayAttrib) {
   if (visible === undefined) visible = true;
   if (visibleDisplayAttrib === undefined) visibleDisplayAttrib = "block";
   var e = document.getElementById(elementId);
   if (e == null) {alert ("showElement: Element \""+elementId+"\" not found."); return; }
   var newDisplay = visible ? visibleDisplayAttrib : "none";
   e.style.display = newDisplay; }

function isElementVisible (elementId, defaultState) {
   if (defaultState === undefined) defaultState = false;
   e = document.getElementById(elementId);
   var s = getEffectiveStyle(e,"display");
   if (s == "none") return false;
   if (s == "") return defaultState;
   return true; }

function toggleElementVisibility (elementId, visibleDisplayAttrib) {
   var v = isElementVisible(elementId);
   showElement (elementId,!v,visibleDisplayAttrib); }

function toggleVisibilityWithButton (contentId, buttonId, buttonText1, buttonText2, buttonTitle1, buttonTitle2, visibleDisplayAttrib) {
   v = isElementVisible(contentId);
   showElement (contentId,!v,visibleDisplayAttrib);
   setElementText (buttonId,v?buttonText1:buttonText2);
   setElementTitle (buttonId,v?buttonTitle1:buttonTitle2); }

function showLegend (mediaObjKey, on) {
   toggleVisibilityWithButton ("legend"+mediaObjKey,"legendOpenButton"+mediaObjKey,"i","-",'Legende öffnen',"Legende schliessen","block"); }

function showContent(id, visible) {
   var container = new Array();

   // close all the containers
   container = getElementsByClassName(document, "*", "container");
   for (var i=0; i<container.length; i++ ) {
       container[i].style.display = "none";
   }


   // set all class names (for titles) to "close"
   var openTitles = new Array();
   openTitles = getElementsByClassName(document, "*", "open");
   for (var i=0; i<openTitles.length; i++) {
       openTitles[i].className = "close";
   }

   showElement ("content"+id, visible);
   var e = document.getElementById("openContentTitle"+id);
   e.className = isElementVisible("content"+id) ? "open" : "closed";
   var e2 = document.getElementById("openContentTitle"+id);
   e2.firstChild.title = isElementVisible("content"+id) ? "close" : "open";
   // var e3 = document.getElementById("info"+id);
   // e3.firstChild.nodeValue = isElementVisible("content"+id) ? "-" : "";
}

function toggleContent(id) {
   showContent(id, !isElementVisible("content"+id));
}

//--- AJAX / asynchronous HTTP transfer ---------------------------------------

function getAsynchContent (url, targetId) {
   var req;
   if (window.XMLHttpRequest) {
      req = new XMLHttpRequest(); }
    else if (window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP"); }
    else {
      alert ("Unable to retrieve dynamic content because your browser does not support XMLHttpRequest.");
      return; }
   req.onreadystatechange = function() {
      handleHttpRequestEvent (req,url,targetId); }
   req.open ("GET", url, true);
   req.send (null); }

function handleHttpRequestEvent (req, url, targetId) {
   if (req.readyState != 4) return;
   var s;
   if (req.status == 200) {
      s = req.responseText; }
    else {
      s = "Error while retrieving "+url+": "+req.statusText; }
   document.getElementById(targetId).innerHTML = s; }

//--- Various -----------------------------------------------------------------

function refreshPage() {
   location.reload(); }

// wait

function wait(millis) {
   var date = new Date();
   var curDate = null;

   do { curDate = new Date(); }
   while(curDate-date < millis);
}

//-----------------------------------------------------------------------------
function postLoadInit() {
   setBodyClassColorScheme(); }

function preLoadInit() {
   initStyleSheets();
   window.onload = postLoadInit; }


