/**
 * Basic javascript redirect.
 */
function redirect(location) {
  window.location.href = location;
}

function whereami() {
  return "http://" + window.location.host;
}

/*
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, lamdaFunction, useCapture);
        return true;
    } else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, lamdaFunction);
        return r;
    } else {
        return false;
    }
}

/*
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
    if (eventObject && eventObject.stopPropagation) {
        eventObject.stopPropagation();
    }
    if (window.event && window.event.cancelBubble ) {
        window.event.cancelBubble = true;
    }

    if (eventObject && eventObject.preventDefault) {
        eventObject.preventDefault();
    }
    if (window.event) {
        window.event.returnValue = false;
    }
}

/*
 * Safari doesn't support canceling events in the standard way, so we must
 * hard-code a return of false for it to work.
 */
function cancelEventSafari() {
  return false;
}

/*
 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
 */
function getElementStyle(elementID, CssStyleProperty) {
    var element = document.getElementById(elementID);
    if (element.currentStyle) {
        return element.currentStyle[toCamelCase(CssStyleProperty)];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(element, '');
        return compStyle.getPropertyValue(CssStyleProperty);
    } else {
        return '';
    }
}

/*
 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
 * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
 */
function toCamelCase(CssProperty) {
    var stringArray = CssProperty.toLowerCase().split('-');
    if (stringArray.length == 1) {
        return stringArray[0];
    }
    var ret = (CssProperty.indexOf("-") == 0)
              ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1)
              : stringArray[0];
    for (var i = 1; i < stringArray.length; i++) {
        var s = stringArray[i];
        ret += s.charAt(0).toUpperCase() + s.substring(1);
    }
    return ret;
}

/*
 * Disables all 'test' links, that point to the href '#', by Ross Shannon
 */
function disableTestLinks() {
  var pageLinks = document.getElementsByTagName('a');
  for (var i=0; i<pageLinks.length; i++) {
    if (pageLinks[i].href.match(/[^#]#$/)) {
      addEvent(pageLinks[i], 'click', knackerEvent, false);
    }
  }
}

/*
 * Cookie functions
 */
function createCookie(name, value, days) {
  var expires = '';
  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days*24*60*60*1000));
    var expires = '; expires=' + date.toGMTString();
  }
  document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
  var cookieCrumbs = document.cookie.split(';');
  var nameToFind = name + '=';
  for (var i = 0; i < cookieCrumbs.length; i++) {
    var crumb = cookieCrumbs[i];
    while (crumb.charAt(0) == ' ') {
      crumb = crumb.substring(1, crumb.length); /* delete spaces */
    }
    if (crumb.indexOf(nameToFind) == 0) {
      return crumb.substring(nameToFind.length, crumb.length);
    }
  }
  return null;
}

function eraseCookie(name) {
  createCookie(name, '', -1);
}

function generatePaging(targetId, currentPage, totalPages, limit, functionName) {
  var i,start,pageLocation,pageUL,pageLI,pageA;

  // Find the target and build the structure
  pageLocation = document.getElementById(targetId);
  pageLocation.innerHTML = "";
  pageUL = document.createElement('ul');
  pageLocation.appendChild(pageUL);

  // Add the previous tag.
  pageLI = document.createElement('li');
  pageA = document.createElement('a');
  pageA.innerHTML = "< prev";
  if (currentPage == 1) {
    pageA.className = "disable";
    pageA.href = "#";
  } else
    pageA.href = "javascript:"+functionName+"("+(parseInt(currentPage) - 1)+")";
  pageLI.appendChild(pageA);
  pageUL.appendChild(pageLI);
  pageUL.appendChild(document.createTextNode("\n"));

  // Calculate starting page
  if (currentPage <= (limit/2) + 1)
    start = 1;
  else if (currentPage > totalPages - Math.floor((limit/2)))
    start = totalPages - limit + 1;
  else
    start = currentPage - Math.floor(((limit/2)));
  
  if (start == 0)
    start = 1;

  // Draw pages
  for (i=0; i < limit; i++) {
    if (i + start <= totalPages) {
      pageLI = document.createElement('li');
      pageA = document.createElement('a');
      pageA.innerHTML = (start + i);
      if (i == currentPage - start) {
        pageA.className = "current";
        pageA.href = "#";
      } else
        pageA.href = "javascript:"+functionName+"("+(parseInt(start) + parseInt(i))+")";
      pageLI.appendChild(pageA);
      pageUL.appendChild(pageLI);
      pageUL.appendChild(document.createTextNode("\n"));
    }
  }

  // Check if we need to put any elipseeeees
  if (start + limit <= totalPages) {
    if (start + limit < totalPages) {
      // Add ...
      pageLI = document.createElement('li');
      pageLI.innerHTML = "...";
      pageUL.appendChild(pageLI);
      pageUL.appendChild(document.createTextNode("\n"));
    }

    // Add last page.
    pageLI = document.createElement('li');
    pageA = document.createElement('a');
    pageA.innerHTML = totalPages;
    pageA.href = "javascript:"+functionName+"("+totalPages+")";
    pageLI.appendChild(pageA);
    pageUL.appendChild(pageLI);
    pageUL.appendChild(document.createTextNode("\n"));
  }

  // Add the next tag.
  pageLI = document.createElement('li');
  pageA = document.createElement('a');
  pageA.innerHTML = "next >";
  if (currentPage == totalPages) {
    pageA.className = "disable";
    pageA.href = "#";
  } else
    pageA.href = "javascript:"+functionName+"("+(parseInt(currentPage) + 1)+");";
  pageLI.appendChild(pageA);
  pageUL.appendChild(pageLI);
  pageUL.appendChild(document.createTextNode("\n"));
}

function getElementYpos(name){
  var y = 0;
  var element = document.getElementById(name);
  while(element.offsetParent){
    y += element.offsetTop
    element = element.offsetParent;
  }
  return y;
}

function setCharacterLimit(idData,limit) {
  var limitField=document.getElementById(idData);
  
	if (limitField.value.length > limit) {
		limitField.value = limitField.value.substring(0, limit);
	}
}