// Navigation ------------------------------------------------------------------
var id   = -1;
var nav  = 1;
var sub  = -1;
var page = "home";
var callback = "doscroll(true)";

function loadPage(inNav, inSub, inItem, inPage, inCallback, inForm) {
  
  // Select navigation
  selectNavigation("navigation" + inNav);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNav + "&sub=" + inSub + "&page=" + inPage, '', '', false);
  
  // Load content 
  queueContent("contentContainer", "pages/" + inPage + ".php?id=" + inItem, inForm, inCallback, false);
  
  // Save location
  id   = inItem;
  nav  = inNav;
  sub  = inSub;
  page = inPage;
  callback = inCallback;
}

function login(inForm) {

  // Submit login
  queueContent("loginContainer", "pages/login.php", inForm, '', false);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + nav + "&sub=" + sub + "&page=" + page, '', '', false);
  
  // Load navigation
  queueContent("navigation", "pages/navigation.php?id=" + nav, '', '', false);
  
  // Load content 
  queueContent("contentContainer", "pages/" + page + ".php?id=" + id, '', callback, false);
  
  return false;
}

function logout() {
  // Submit login
  queueContent("loginContainer", "pages/prelogin.php?action=logout", '', '', false);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + nav + "&sub=" + sub + "&page=" + page, '', '', false);
  
  // Load navigation
  queueContent("navigation", "pages/navigation.php?id=" + nav, '', '', false);
  
  // Load content 
  queueContent("contentContainer", "pages/" + page + ".php?id=" + id, '', callback, false);
}

function saveGeneric(inForm) {

  // Fetch some info from form
  var inNav  = inForm.elements["navigation"].options[inForm.elements["navigation"].options.selectedIndex].value;
  var inSub  = inForm.elements["id"].value;
  var inItem = inForm.elements["id"].value;
  var inPage = "genericcontent";

  // Save content 
  queueContent("contentContainer", "pages/genericcontent.php", inForm, '', false);
  
  // Select right navigation
  selectNavigation("navigation" + inNav);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNav + "&sub=" + inSub + "&page=" + inPage, '', '', false);
  
  // Load navigation
  queueContent("navigation", "pages/navigation.php?id=" + inNav, '', '', false);
  
  // Save location
  id   = inItem;
  nav  = inNav;
  sub  = inSub;
  page = inPage;
  callback = "";
  
  // Abort event
  return false;
}

function hideGeneric(inId, inNav) {
  // Queue hiding
  queueContent("contentContainer", "pages/genericcontent.php?id=" + inId + "&action=hidegeneric", '', '', false);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNav + "&sub=" + inId + "&page=genericcontent", '', '', false);
}

function showGeneric(inId, inNav) {
  // Queue showing
  queueContent("contentContainer", "pages/genericcontent.php?id=" + inId + "&action=showgeneric", '', '', false);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNav + "&sub=" + inId + "&page=genericcontent", '', '', false);
}

function deleteGeneric(inNavigation, inId) {
  // Queue deleting
  queueContent("contentContainer", "pages/blank.php?action=deletegeneric&generic=" + inId, '', '', false);
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNavigation, '', '', false);
  queueContent("navigation", "pages/navigation.php?id=" + inNavigation, '', '', false);
  
  // Save location
  id   = -1;
  nav  = inNavigation;
  sub  = -1;
  page = "blank";
  callback = "";
}

function saveProject(inForm) {

  // Fetch some info from form
  var inNav  = 3;
  var inSub  = inForm.elements["category"].options[inForm.elements["category"].options.selectedIndex].value;
  var inItem = inForm.elements["id"].value;
  var inPage = "project";
  
  // Save content 
  queueContent("contentContainer", "pages/project.php", inForm, '', false);
  
  // Select right navigation
  selectNavigation("navigation" + inNav);
  
  // Load subnavigation
  queueContent("subnavigation", "pages/subnavigation.php?id=" + inNav + "&sub=" + inSub + "&page=" + inPage, '', '', false);
  
  // Load navigation
  queueContent("navigation", "pages/navigation.php?id=" + inNav, '', '', false);
  
  // Save location
  id   = inItem;
  nav  = inNav;
  sub  = inSub;
  page = inPage;
  callback = "";
  
  // Abort event
  return false;
}

function hideProject(inId) {
  // Queue hiding
  queueContent("contentContainer", "pages/project.php?id=" + inId + "&action=hideproject", '', '', false);
}

function showProject(inId) {
  // Queue showing
  queueContent("contentContainer", "pages/project.php?id=" + inId + "&action=showproject", '', '', false);
}

function deleteProject(inCategory, inId) {
  // Queue deleting
  queueContent("contentContainer", "pages/projectlist.php?id=" + inCategory + "&project=" + inId + "&action=deleteproject", '', '', false);
  
  // Save location
  id   = -1;
  nav  = inCategory;
  sub  = inCategory;
  page = "projectlist";
  callback = "";
}

function selectNavigation(inId) {
  var navObj = null;
  for (var i=0; i<20; i++) {
    if (navObj = document.getElementById("navigation" + i)) {
      if (("navigation" + i) == inId) {
        navObj.className = "navigationLinkSelected";
      } else {
        navObj.className = "navigationLink";
      }
    }
  }
}

function selectSubnavigation(inId) {
  var navObj = null;
  for (var i=0; i<20; i++) {
    if (navObj = document.getElementById("subnavigation" + i)) {
      if (("subnavigation" + i) == inId) {
        navObj.className = "navigationLinkSelected";
      } else {
        navObj.className = "navigationLink";
      }
    }
  }
  for (var i=0; i<20; i++) {
    if (navObj = document.getElementById("category" + i)) {
      if (("category" + i) == inId) {
        navObj.className = "navigationLinkSelected";
      } else {
        navObj.className = "navigationLink";
      }
    }
  }
}


// Images ----------------------------------------------------------------------
function swapImage(inId, inSrc) {
  document.getElementById(inId).src = inSrc;
}


// Sound -----------------------------------------------------------------------
function soundOn() {
  document.getElementById("soundContainer").src = "/sound/sound.html";
  document.getElementById("soundOn").className  = "navigationLinkSelected";
  document.getElementById("soundOff").className = "navigationLink";
}

function soundOff() {
  document.getElementById("soundContainer").src = "about:blank";
  document.getElementById("soundOn").className  = "navigationLink";
  document.getElementById("soundOff").className = "navigationLinkSelected";
}


// Scrolling -------------------------------------------------------------------
var scrollDelay = 25;
var scrollWidth = -1;
var scrollObjWidth = 206;
var scrollTimeout = null;
var initialized = 0;

function doscroll(inInitialize) {

  if (!initialized || inInitialize) {
    var i = 0;
    while (scrollObj = document.getElementById("scrollObj" + i)) {
		  scrollObj.style.left = i*scrollObjWidth;
      i++;
	  }
    scrollObjects = i;
		initialized   = 1;
	} else {
    try {
      for (var i=0; i<scrollObjects; i++) {
	      scrollObj = document.getElementById("scrollObj" + i);
		    scrollObj.style.left = (parseInt(scrollObj.style.left) + scrollWidth);
			  
			  if (parseInt(scrollObj.style.left) < -scrollObjWidth) {
			    scrollObj.style.left = (parseInt(scrollObj.style.left) + scrollObjects*scrollObjWidth);
			  }
	    }
    } catch (e) {
      // Ignore
    }
	}
	
  // Clear any other timeout
  self.clearTimeout(scrollTimeout);
  
  // Set new timeout
	scrollTimeout = self.setTimeout("doscroll()", scrollDelay);
}

function stopscroll() {
  self.clearTimeout(scrollTimeout);
}


// Dynamic data loading --------------------------------------------------------
var serverPresent   = location.hostname;
var requestQueue    = [];
var request         = null;
var requestTarget   = 0;
var requestCallback = "";
var requestRunning  = false;
function distributeContent() {
  if (request.readyState == 4) {
    if (request.status == 200 || !serverPresent) {
      
      // Javascript transfer hack
      if (request.responseText.indexOf("javascript:") === 0) {
        eval(request.responseText.substr(11));
      } else {
        var targetObj = document.getElementById(requestTarget);
        targetObj.innerHTML = request.responseText;
      }
      
      // Invoke callback
      if (requestCallback) {
        eval(requestCallback);
      }
      
      // Reset request state
      requestRunning = false;
      loadContent();
    }
  }
}

function loadContent() {

  // Check wheter a request is running
  if (!requestRunning && requestQueue.length) {

    // Lock requesting
    requestRunning = true;
  
    // Get last queued request
    var thisRequest = requestQueue.shift();
    var inUrl       = thisRequest[1];
    var inTargetId  = thisRequest[0];
    var inForm      = thisRequest[2];
    var inCallback  = thisRequest[3];
    var paramString = "";
    
    // Check if there's a form to post
    if (formObj = inForm) {
      for (var i=0; i<formObj.elements.length; i++) {
        switch (formObj.elements[i].tagName) {
          case "select": // Multiple select is not implemented
          case "SELECT":
            var selectedIndex = formObj.elements[i].options.selectedIndex;
            var selectedValue = formObj.elements[i].options[selectedIndex].value;
            paramString += "&" + formObj.elements[i].name + "=" + encodeURIComponent(selectedValue);
            break;
            
          case "input":
          case "INPUT":
            switch (formObj.elements[i].type) {
                
              case "checkbox":
              case "radio":
                if (formObj.elements[i].checked) {
                  paramString += "&" + formObj.elements[i].name + "=" + encodeURIComponent(formObj.elements[i].value);
                }
                break;
                
              case "file":
                break;
                
              case "text":
              case "hidden":
              case "submit":
              default:
                paramString += "&" + formObj.elements[i].name + "=" + encodeURIComponent(formObj.elements[i].value);
                break;
            }
            break;
            
          case "textarea":
          case "TEXTAREA":
          default:
            paramString += "&" + formObj.elements[i].name + "=" + encodeURIComponent(formObj.elements[i].value);
            break;
        }
      }
    }
    
    // Load last queue
    requestTarget   = inTargetId;
    requestCallback = inCallback;
    if (window.XMLHttpRequest) {
      request = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
      request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.open("POST", inUrl, true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.onreadystatechange = distributeContent;
    request.send(paramString);
  }
}

function queueContent(inTargetId, inUrl, inForm, inCallback, inDirect) {
  // Check wheter it is direct call that overrides everything else
  if (inDirect) {
    requestRunning = false;
    requestQueue   = [];
  }
  
  // Queue the request
  requestQueue.push([inTargetId, inUrl, inForm, inCallback]);
  
  // Load last queue
  loadContent();
}
