/*
Written by Spellcoder (Mark de Jong) in 2009

(C)2008 B-Lex IT
*/

var toddUserAgent = navigator.userAgent.toLowerCase();
var toddUserAgentIsGecko = (toddUserAgent.indexOf('gecko') != -1); // Mozilla, Firefox or compatible, using Gecko engine
//var toddUserAgentIsFirefox = toddUserAgentIsGecko && (toddUserAgent.indexOf('firefox') != -1);
var toddUserAgentIsOpera = (toddUserAgent.indexOf('opera') != -1);
var toddUserAgentIsIE = (typeof document.attachEvent != 'undefined') && (!toddUserAgentIsOpera);
var toddUserAgentIsIE7 = toddUserAgentIsIE && !!window.XMLHttpRequest;
//var toddUserAgentIsMac = (toddUserAgent.indexOf('macintosh') != -1);
//var toddUserAgentIsWebKit = (toddUserAgent.indexOf('applewebkit') != -1); // Safari or compatible, using WebKit engine
//var toddUserAgentIsCamino = (toddUserAgent.indexOf('camino') != -1);
//var toddUserAgentIsKonqueror = (toddUserAgent.indexOf('konqueror') != -1);

if (toddUserAgentIsOpera && window.opera != undefined && window.opera.version != undefined)
  var toddUserAgentOperaVersion = parseFloat(opera.version());




var toddHoverOnlyWorksOnAnchor = toddUserAgentIsIE && !toddUserAgentIsIE7;

if (typeof window.console == 'undefined') {
  window.console = {};
  console.log = function() { };
  console.warn = function() { };
  console.error = function() { };
  console.group = function() { };
  console.groupEnd = function() { };
}


// tell IE not to keep reloading background images over and over and over
if(toddUserAgentIsIE)
{
  //ignore any errors
  try { document.execCommand("BackgroundImageCache", false, true); }
  catch(e) { }
}

function timeToString(got_time) {
  var tInSec  = got_time/1000;
  var hours   = Math.floor(tInSec/ 3600);
  var minutes = Math.floor((tInSec/60) % 60);
  var seconds = Math.floor(tInSec % 60);
  if ( hours   < 10 ) hours   = "0"+hours;
  if ( minutes < 10 ) minutes = "0"+minutes;
  if ( seconds < 10 ) seconds = "0"+seconds;
  return hours+":"+minutes+":"+seconds;
}

/*
http://webreflection.blogspot.com/2006/11/my-domcontentloaded-final-solution.html

- FireFox 1+
- Opera 8+ (not tested in 7)
- Safari 2+ (not tested in 1)
- KDE 3.4 or greater
- Internet Explorer 5+ (not tested in IE 5.2 for Mac)
*/
function onContent(f){//(C)webreflection.blogspot.com
  var a,b=navigator.userAgent,d=document,w=window,
  c="__onContent__",e="addEventListener",o="opera",r="readyState",
  s="<scr".concat("ipt defer src='//:' on",r,"change='if(this.",r,"==\"complete\"){this.parentNode.removeChild(this);",c,"()}'></scr","ipt>");
  w[c]=(function(o){return function(){w[c]=function(){};for(a=arguments.callee;!a.done;a.done=1)f(o?o():o)}})(w[c]);
  if(d[e])d[e]("DOMContentLoaded",w[c],false);
  if(/WebKit|Khtml/i.test(b)||(w[o]&&parseInt(w[o].version())<9))
  (function(){/loaded|complete/.test(d[r])?w[c]():setTimeout(arguments.callee,1)})();
  else if(/MSIE/i.test(b))d.write(s);
}

// see http://www.spellcoder.nl/showpage.php?page=CSS-Transparancy
function setOpacity(elem, opacity)
{
  if(toddUserAgentIsIE)
  {
//    if (opacity < 1)
//      opacity = 1; // IE7 bug, text smoothing cuts out if 0

    if (opacity==100)
      elem.style.filter = 'none'; // don't make IE waste CPU time by filtering when it has no effect
    else
      elem.style.filter = 'alpha(opacity='+opacity+')';
  }
  else
    elem.style.opacity = opacity/100;
}

function capableofRGBA()
{
  /*
  Browsers capable of RGBA:
    - Firefox 3
    - Google Chrome
    - Safari 3 (not tested in SF2)
    - Opera core 2.2 engine (Opera 10?)

  Browsers *not* capable of RGBA:
    - Firefox 1, 1.5, 2
    - Internet Explorer 6/7
    - Opera 9.2x / 9.5x / 9.6x
  */

  var elem = document.createElement('div');

  if (toddUserAgentIsIE)
  {
    // IE doesn't allow setting seperate properties before the element is in the DOM
    // we can't use this for other browsers since Opera won't directly clean cssText of unparsable stuff
    elem.style.cssText = 'color: rgba(255,255,255,0.5)';
  }
  else
  {
    // test works for Firefox, Chrome and IE (Safari not tested), fails with Opera
    elem.style.color = 'rgba(255,255,255,0.5)';
  }

  return (elem.style.cssText != '')
}

function toddInArray(needle, haystack)
{
  var acount = haystack.length;

  while(acount--)
    if (haystack[acount] == needle)
      return true;

  return false;
}

function getPointerX(e) {
  return (e.pageX)?e.pageX:e.clientX;
}
function getPointerY(e) {
  return (e.pageY)?e.pageY:e.clientY;
}

function GetViewportPositionOfElement(obj)
{
        var curleft = 0;
        var curtop = 0;
        if (obj.offsetParent) {
                curleft = obj.offsetLeft
                curtop = obj.offsetTop
                while (obj = obj.offsetParent) {
                        curleft += obj.offsetLeft
                        curtop += obj.offsetTop
                }
        }
        return { x: curleft
               , y: curtop};
}

// see http://adomas.org/javascript-mouse-wheel/
function toddExplainScrollWheel(e)
{
  var scrollbar;
  var vertical = true;
  var d = 0;
  if (e.detail)
  {
    d = e.detail;// / 3;
  }
  else if (e.wheelDelta)
  {
    d = -e.wheelDelta / 40;// / 120;
    if (e.wheelDeltaX) // Horizontal scrolling (e.g. Mighty Mouse in Safari)
      vertical = false;
  }

  // Opera up to 9.10 had a bug which means the delta was inverted
  // The first release without this bug is 9.20
  if (toddUserAgentIsOpera && toddUserAgentOperaVersion < 9.20)
    d = -d;

  return {vertical: vertical, delta: d};
}

function hasClass(ele,cls) {
        return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(ele,cls) {
        if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}

function removeClass(ele,cls) {
//      if (hasClass(ele,cls)) {
                var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
                ele.className=ele.className.replace(reg,' ');
//      }
}

function setInnerXHTML(myXHTML, myObject)
{
  myObject.innerHTML = myXHTML;
}


function toddAddEvent(obj, type, fn)
{
  if (obj.addEventListener)
  {
    obj.addEventListener(type, fn, false);
  }
  else
  {
    obj['e' + type + fn] = fn;
    obj[type + fn] = function()
    {
      obj['e'+type+fn](window.event);
    }
    obj.attachEvent('on'+type, obj[type+fn]);
  }
}

function toddRemoveEvent(obj, type, fn)
{
  if (obj.removeEventListener)
  {
    obj.removeEventListener(type, fn, false);
  }
  else
  {
    obj.detachEvent('on'+type, obj[type+fn]);
    obj[type+fn]=null;
  }
}

function showData(data)
{
    txt = '';
    for (prop in data)
      txt += prop+' = '+data[prop]+"\n";
    alert(txt);
}




function getWindowSize() {
//	return {width:  map.mapView.clientWidth
//	       ,height: map.mapView.clientHeight};

//	from Quirksmode.org
	var x,y;

	if (self.innerHeight) {
	//	all except Explorer
		x = self.innerWidth;
		y = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
	//	Explorer 6 Strict Mode
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	} else if (document.body && document.body.clientWidth) {
	//	other Explorers
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}

	return {width:x, height:y};
}



var getElementsByClassName = function() 
{ 
    // native 
/*
    if (document.getElementsByClassName) 
    { 
        return function(className, nodeName, parentElement) 
        { 
				// Spellcoder
				return parentElement.getElementsByClassName(className);


            var s = (parentElement || document).getElementsByClassName(className); 

            if (nodeName && nodeName != '*') 
            { 
                nodeName = nodeName.toUpperCase(); 
                return Array.filter(s, function(el) { return el.nodeName == nodeName; }); 
            } 
            else 
                return [].slice.call(s, 0); 
        } 
    } 
*/
    // xpath 
    if (document.evaluate) 
    { 
        return  function(className, nodeName, parentElement) 
        { 
            if (!nodeName) nodeName = '*'; 
            if (!parentElement) parentElement = document; 

            var results = [], s, i = 0, element; 

            s = document.evaluate( 
                ".//" + nodeName + "[contains(concat(' ', @class, ' '), ' " + className + " ')]", 
                parentElement, 
                null, 
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
                null 
            ); 

            while ((element = s.snapshotItem(i++))) 
                results.push(element); 

            return results; 
        } 
    } 

    // generic 
    return function(className, nodeName, parentElement) 
    { 
        if (!nodeName) nodeName = '*'; 
        if (!parentElement) parentElement = document; 

        var results = [], s, i = 0, element; 
        var re = new RegExp('(^|\\s)' + className + '(\\s|$)'), elementClassName; 

        s = parentElement.getElementsByTagName(nodeName); 

        while ((element = s[i++])) 
        { 
            if (    (elementClassName = element.className) && 
                (elementClassName == className || re.test(elementClassName)) 
            ) 
                results.push(element); 
        } 

        return results; 
    } 
}();