function isInternetExplorer() {
  return navigator.appName == 'Microsoft Internet Explorer';
}

function getInnerText(element) {
  var hasInnerText = (element.innerText != undefined) ? true : false;
  if (hasInnerText) {
    return element.innerText;
  } else {
    return element.textContent;
  }
}

function setInnerText(element, text) {
  var hasInnerText = (element.innerText != undefined) ? true : false;
  if (hasInnerText) {
    element.innerText = text;
  } else {
    element.textContent = text;
  }
}

function changeText(el, newText) {
  // Safari work around
  if (el.innerText)
    el.innerText = newText;
  else if (el.firstChild && el.firstChild.nodeValue)
    el.firstChild.nodeValue = newText;
}

function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else var expires = "";
  document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function eraseCookie(name) {
  createCookie(name,"",-1);
}

function addOnLoadEvent(func) {
  if (window.onloadEventList) {
    return window.onloadEventList.push(func);
  }
  window.onloadEventList = [];
  if (typeof(window.onload) == 'function') {
    window.onloadEventList.push(window.onload);
  }
  window.onloadEventList.push(func);
  window.onload = function() {
    for (var i=0; i < window.onloadEventList.length; ++i) {
      window.onloadEventList[i]();
    }
  };
}

function showHelpToggle() {
  if (!document.createTextNode) return;
	// Uses DOM calls to avoid document.write + XHTML issues

  var linkHolder = document.getElementById('miniHelp')
  if (!linkHolder)
    return;
  var outerSpan = document.createElement('span');
  outerSpan.className = 'helptoggle';
  
  var toggleLink = document.createElement('a');
  toggleLink.id = 'togglelink';
  toggleLink.className = 'internal';
  toggleLink.href = 'javascript:toggleHelp()';
  toggleLink.appendChild(document.createTextNode(helpHideText));
  
  outerSpan.appendChild(document.createTextNode('['));
  outerSpan.appendChild(toggleLink);
  outerSpan.appendChild(document.createTextNode(']'));
  
  linkHolder.appendChild(document.createTextNode(' '));
  linkHolder.appendChild(outerSpan);
  
  if (readCookie('hidehelp'))
    setHelpVisibility(0);
}

function toggleHelp() {
  var help = document.getElementById('miniHelpTable');
  setHelpVisibility(help.style.display == 'none' ? 1 : 0);
}

function setHelpVisibility(visible) {
  var help = document.getElementById('miniHelpTable');
  var toggleLink = document.getElementById('togglelink')
  changeText(toggleLink, visible ? helpShowText : helpHideText);
  help.style.display = visible ? 'block' : 'none';
  if (visible) {
    eraseCookie('hidehelp');
  } else {
    createCookie('hidehelp', 1, 1000 );
  }
}

function hideComments(evt) {
  var targetElement;
  if (evt != undefined) {
    targetElement = evt.target;
  } else {
    targetElement = document.activeElement;
  }
  var targetElementId = targetElement.id;
  var commentElementId = 'commentDiv' + targetElementId.substring(6, targetElementId.length);
  var commentElement = document.getElementById(commentElementId);
  commentElement.className = 'hiddenStuff';
  targetElement.onclick = showComments;
  return false;
}

function showComments(evt) {
  var targetElement;
  if (evt != undefined) {
    targetElement = evt.target;
  } else {
    targetElement = document.activeElement;
  }
  var targetElementId = targetElement.id;
  var commentElementId = 'commentDiv' + targetElementId.substring(6, targetElementId.length);
  var commentElement = document.getElementById(commentElementId);
  commentElement.className = 'commentDiv';
  targetElement.onclick = hideComments;
  return false;
}


/* Menu code */

var menuCloseTimer;
var openMenuItem;

function openMenu() {
  cancelCloseTimer();
  if (openMenuItem == this)  return;
  closeMenu();
  openMenuItem = this;
  this.className = 'open';
}

function closeMenu() {
  if (!openMenuItem)  return;
  openMenuItem.className = '';
  openMenuItem = null;
  cancelCloseTimer();
}

function closeMenuWithTimer() {
  if (openMenuItem != this)  return;
  menuCloseTimer = window.setTimeout(closeMenu, 500);
}

function cancelCloseTimer() {
  if (menuCloseTimer) {
    window.clearTimeout(menuCloseTimer);
    menuCloseTimer = null;
  }
}

function initMenu(ul) {
  // document.onclick = closeMenu;
  var items = ul.getElementsByTagName('li');
  for (var i=0; i < items.length; ++i) {
    if (items[i].parentNode != ul)  continue;
    items[i].onmouseover = openMenu;
    items[i].onmouseout = closeMenuWithTimer;
  }
}

/*
function onShowMenu(event) {
  var ul = this.getElementsByTagName('sup');
  if (ul.length) {
    ul[0].className = 'popup';
  }
}
function onHideMenu(event) {
  var ul = this.getElementsByTagName('sup');
  if (ul.length) {
    ul[0].className = '';
  }
}
function initMenu() {
  var nav = document.getElementById('pagePath');
  var elements = nav.getElementsByTagName('span');
  var i, element;
  for (i=0; i<elements.length; ++i) {
    element = elements[i];
    element.onmouseover = onShowMenu;
    element.onmouseout = onHideMenu;
  }
}
*/

function voteForBlog(number,id,vote) {
  var formDivName = 'vote' + number;
  var scoreDivName = 'score' + number;
  var formDiv = document.getElementById(formDivName);
  formDiv.innerHTML = "Vakicsit";
  Vote(['args__'+id, 'args__'+vote], [formDivName, scoreDivName], 'POST');
  return false;
}

function onShowSubmenu() {
  var links = '';
  var args = onShowSubmenu.arguments;
  var event = args[0];
  var target = event.target || event.srcElement;
  
  alert(target.tagName);
  alert(this);
  /*
  while (target.tagName.toLowerCase() != 'span') {
    target = target.parentNode;
    if (!target || target.tagName.toLowerCase() == 'div') return;
  }
  var submenu = target.getElementsByTagName('sup')[0];
  for (var i=1; i < args.length; i+=2) {
    links += '<a href="' + args[i] + '">' + args[i+1] + '</a><br>';
  }
  submenu.id = 'submenu';
  submenu.innerHTML = links;
  submenu.className = 'popup';
  target.appendChild(submenu);
  target.parentNode.onmouseout = onHideSubmenu;
  return false;
  */
}
function onHideSubmenu() {
  var submenu = document.getElementById('submenu');
  if (submenu) {
    submenu.parentNode.removeChild(submenu);
  }
  return false;
}


/* MINIMIZING/MAXIMIZING TEXTAREAS */

function addTextareaControls() {
  var textareas = document.getElementsByTagName('textarea');
  if (textareas.length <= 0) return;
  var ta = textareas[0];
  var div = document.createElement('div');
  var minMaxButton = document.createElement('a');
  minMaxButton.href = '#';
  minMaxButton.onclick = maximizeTextarea;
  div.id = 'editDiv';
  ta.parentNode.insertBefore(div, ta);
  ta.parentNode.removeChild(ta);
  div.appendChild(minMaxButton);
  div.appendChild(ta);
}

function maximizeTextarea() {
  // Lots of love for Internet Explorer.
  var height = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight);
  this.parentNode.getElementsByTagName('textarea')[0].style.height = height - 20 + "px";
  this.className = 'fullscreen';
  this.onclick = minimizeTextarea;
  scrollToElement(this.parentNode.getElementsByTagName('textarea')[0]);
  return false;
}

function minimizeTextarea() {
  this.parentNode.getElementsByTagName('textarea')[0].style.height = '';
  this.className = '';
  this.onclick = maximizeTextarea;
  return false;
}

function scrollToElement(theElement) {
  var posX = 0;
  var posY = 0;
  while (theElement != null) {
    posX += theElement.offsetLeft;
    posY += theElement.offsetTop;
    theElement = theElement.offsetParent;
  }
  window.scrollTo(posX, posY);
}


/* HIDING/SHOWING OF TAG FORM */

function initTagForm(divId) {
  var div = document.getElementById(divId);
  var form = div.getElementsByTagName('form')[0];
  var button = document.createElement('button');
  button.innerHTML = '>>';
  button.onclick = showTagForm;
  form.parentNode.insertBefore(button, form);
  form.style.display = 'none';
}

function showTagForm() {
  var form = this.parentNode.getElementsByTagName('form')[0];
  form.style.display = 'inline';
  this.onclick = hideTagForm;
  this.innerHTML = '&lt;&lt;';
}

function hideTagForm() {
  var form = this.parentNode.getElementsByTagName('form')[0];
  form.style.display = 'none';
  this.onclick = showTagForm;
  this.innerHTML = '&gt;&gt;';
}


/* CHAT RELATED METHODS */

function getCurrentChatId() {
  return document.getElementById('chatid').value;
}

function switchChat(page) {
  updatePending = 1;
  document.getElementById('chatid').value = page;
  ShowChat(['args__' + page, 'NO_CACHE'], ['chatLines', 'chatRooms', ajaxResponse_setLastUpdate], 'GET');
  return false;
}

function scrollChat(toLineNumber) {
  updatePending = 1;
  ShowChat(['args__' + getCurrentChatId(), 'args__' + toLineNumber, 'NO_CACHE'], ['chatLines', 'chatRooms', ajaxResponse_setLastUpdate], 'GET');
  return false;
}

function submitLine() {
  updatePending = 1;
  AddChatLine(['chatid', 'chatline'], ['chatLines', 'chatRooms', ajaxResponse_setLastUpdate], 'POST'); 
  document.getElementById('chatline').value='';
  return false;
}

/* Chat auto-update */

var chatUpdateTimer;
var updatePending = 0;
var lastUpdate;

function startUpdateTimer() {
  if (chatUpdateTimer) {
    return;   // Already running
  }
  chatUpdateTimer = window.setInterval(updateTimerFunc, 15000);  // every 15 secs
}

function stopUpdateTimer() {
  if (!chatUpdateTimer) {
    return;   // Already stopped
  }
  window.clearInterval(chatUpdateTimer);
  chatUpdateTimer = null;
}

function updateTimerFunc() {
  if (updatePending) {
    return;
  }
  var scrollDown = document.getElementById('scrollDown');
  if (scrollDown) {
    return;   // No auto-update if we are not at the bottom of the list
  }
  updatePending = 1;
  GetChatUpdate(['NO_CACHE'], [ajaxResponse_updateTimer]);
}

function ajaxResponse_updateTimer() {
  updatePending = 0;
  var serverLastUpdate = arguments[0];
  if (serverLastUpdate <= lastUpdate) {
    lastUpdate = serverLastUpdate;
    return;
  }
  lastUpdate = serverLastUpdate;
  updatePending = 1;
  ShowChat(['args__' + getCurrentChatId(), 'NO_CACHE'], ['chatLines', 'chatRooms', ajaxResponse_setLastUpdate], 'GET');
}

function ajaxResponse_setLastUpdate() {
  updatePending = 0;
  var serverLastUpdate = arguments[0];
  lastUpdate = serverLastUpdate;
}

/* BLOG TICKER RELATED METHODS */

// Ticker config
var cellWidth = 100;
var missingCells = 20;
var pageBase = '';
var imageBase = '';

var tickerPages;
var tickerImages;
var tickerPosition = 0;
var timerID = 0;
var tickerStarted = 0;
var tickerAdvances = 0;
var blogTicker;
var scrollSpeed = 1;

function scrollTicker() {
  if (!tickerStarted) return;
  var advances = getScrollAdvances();
  if (advances <=0 ) return;
  tickerPosition += advances;
  var firstTD = blogTicker.getElementsByTagName("td")[0];
  if (tickerPosition >= firstTD.offsetWidth + 2) {
    tickerPosition -= firstTD.offsetWidth + 2;
    removeFirstCell();
  }
  if (document.all && !window.opera) {
    blogTicker.style.left = -tickerPosition + 'px';    // For IE
  } else {
    blogTicker.parentNode.scrollLeft = tickerPosition; // For others
  }
}

function resetScrollAdvances() {
  tickerStarted = new Date().getTime();
  tickerAdvances = 0;
}

function getScrollAdvances() {
  var now = new Date().getTime();
  var advances = Math.floor( (now - tickerStarted) / 32 * scrollSpeed ) - tickerAdvances;
  tickerAdvances += advances;
  return advances <= 5*scrollSpeed ? advances : 5*scrollSpeed;
}

function removeFirstCell() {
  var firstTD = blogTicker.getElementsByTagName("td")[0];
  if (firstTD) firstTD.parentNode.removeChild(firstTD);
  ++missingCells;
  getMoreCells();
}

function getMoreCells() {
  if (!document.getElementById) return;
  blogTicker = document.getElementById('blogticker');
  while (missingCells > 0) {
    var tickerNum = Math.floor(Math.random() * tickerImages.length);
    var tr = blogTicker.getElementsByTagName("tr")[0];
    var td = document.createElement("td");
    td.innerHTML = '<a href="' + pageBase + '/' + tickerPages[tickerNum] + 
      '"><img src="' + imageBase + '/' + tickerImages[tickerNum] + '" alt=""></a>';
    tr.appendChild(td);
    --missingCells;
  }
}

function startScroll() {
  if (!document.getElementById) return;
  if (tickerStarted) return;
  getMoreCells();
  timerID = setInterval( scrollTicker, 10 );
  resetScrollAdvances();
}

function stopScroll() {
  if (!tickerStarted) return;
  tickerStarted = 0;
  clearInterval(timerID);
}

/* Time zone guessing */

function guessTimeZone() {
  var timezonePopup = document.getElementById('fid_timezone');
  var options = timezonePopup.getElementsByTagName('option');
  var now = new Date();
  var timezoneOffset = 0 - now.getTimezoneOffset();
  
  for (var i=1; i<options.length; ++i) {
    if (options[i].value == timezoneOffset) {
      options[i].selected = true;
      document.getElementById('timezoneContainer').style.display = 'none';
      break;
    }
  }
}


/* KOZOSMESSAGE */

function onMessageDeleted(messageid) {
  if (messageid <= 0) return;
  var inbox = document.getElementById('msginbox');
  deleteMessageFrom(inbox, messageid);
  var outbox = document.getElementById('msgoutbox');
  deleteMessageFrom(outbox, messageid);
  if (window.ForceMailUpdate) {
    ForceMailUpdate();
  }
}

function deleteMessageFrom(div, messageid) {
  if (!div) return;
  var anchors = div.getElementsByTagName('a');
  var searchLink = '/messages/' + messageid;
  
  for (var i=0; i<anchors.length; ++i) {
    var href = anchors[i].href;
    if (href.length < searchLink.length)
      continue;
    href = href.substr(href.length-searchLink.length, searchLink.length);
    if (href != searchLink) {
      continue;
    }
    deleteMessageFromTr(anchors[i].parentNode.parentNode);
    return;
  }
}

function deleteMessageFromTr(tr) {
  tr.className = tr.className.replace(' unread', '');
  var tds = tr.getElementsByTagName('td');
  var strike;
  for (var i=0; i<tds.length; ++i) {
    strike = document.createElement('strike');
    setInnerText(strike, getInnerText(tds[i]));
    tds[i].innerHTML = '';
    tds[i].appendChild(strike);
  }
}

function onInstantMessageUpdate(id, html) {
  var div = document.getElementById('instantmsg');
  div.innerHTML = html;
  div.style.display = html.length ? 'block' : 'none';
  lastIM = id;
}

function selectAllButton(id, labelText) {
  var div = document.getElementById(id);

  var label = document.createElement('label');
  var input = document.createElement('input');
  input.type = 'checkbox';
  input.messageDiv = div;
  input.onchange = onSelectButtonClicked;
  label.appendChild(input);
  label.appendChild(document.createTextNode(labelText));
  label.style.paddingRight = '1em';

  var allInputs = div.getElementsByTagName('input');
  var lastInput = allInputs[allInputs.length - 1];
  lastInput.parentNode.insertBefore(label, lastInput);
}

function onSelectButtonClicked() {
  var checked = this.checked;
  var allInputs = this.messageDiv.getElementsByTagName('input');
  for (var i=0; i < allInputs.length; ++i) {
    if (allInputs[i] == this)  continue;
    allInputs[i].checked = checked;
  }
}


/* Date widget */

function loadJs(src) {
  var e = document.createElement('script');
  e.setAttribute('type', 'text/javascript');
  e.setAttribute('src', src);
  document.body.appendChild(e);
}

function loadCss(src) {
  var e = document.createElement('link');
  e.setAttribute('rel', 'stylesheet');
  e.setAttribute('type', 'text/css');
  e.setAttribute('href', src);
  document.getElementsByTagName("head")[0].appendChild(e);
}

function loadDateWidget(locale) {
  loadCss("/Content/Style/calendar.css");
  loadJs("/Content/Script/calendar.js");
  loadJs("/Content/Script/calendar-" + locale + ".js");
  loadJs("/Content/Script/calendar-setup.js");
}
