// Browser detection
var isOpera  = (navigator.userAgent.toLowerCase().indexOf('opera') > -1);
var isIE     = (!isOpera && navigator.userAgent.toLowerCase().indexOf('msie') > -1);
var isSafari = (navigator.userAgent.indexOf('AppleWebKit') != -1); // Detecting not only Safari but WebKit-based browsers
var isKonqueror = (navigator.userAgent.toLowerCase().indexOf('khtml') > -1);
var isMoz    = (document.implementation && document.implementation.createDocument && !isKonqueror && !isSafari ? true : false);
var isFF     = (isMoz && navigator.userAgent.toLowerCase().indexOf('firefox')!= -1);

if (isIE) {
   var verIE = parseInt(navigator.appVersion.split('MSIE')[1]);
}
if (isOpera) {
   var verOpera = parseFloat(navigator.userAgent.split('Opera ')[1]);
   if (isNaN(verOpera)) {
      verOpera = parseFloat(navigator.userAgent.split('Opera/')[1]);
   }
}

/*
Function by Simon Willison from sitepoint.com
Modified by Cameron Cooke adding Safari's rgba support
*/
function setOpacity(obj,opacity) {
   opacity = (opacity == 100) ? 99.999 : opacity;

   if (typeof(obj.style.opacity) != 'undefined') {
      // W3C
      obj.style.opacity = opacity / 100;
   } else if (typeof(obj.style.MozOpacity) != 'undefined') {
      // Older Mozilla
      obj.style.MozOpacity = opacity / 100;
   } else if (typeof(obj.style.filter) != 'undefined') {
      // IE
      obj.style.filter = 'alpha(opacity:' + opacity + ')';
   } else if (typeof(obj.style.KHTMLOpacity) != 'undefined') {
      // Older KHTML Based Browsers
      obj.style.KHTMLOpacity = opacity / 100;
   }
}


function getElementsByClassName(strClass, aTags, objContElm) {
   if (!aTags) {
      aTags = ['*'];
   } else if (!(aTags instanceof Array)) {
      aTags = [aTags];
   }
   objContElm = objContElm || document;
   if (inArray(aTags,'*') && document.all && !window.opera) {
      var objColl = document.all;
   } else {
      var objColl = [];
      for (var i=0; i<aTags.length; i++) {
         var hc = objContElm.getElementsByTagName(aTags[i]);
         for (var j=0; j<hc.length; j++) {
            objColl.push(hc[j]);
         }
      }
   }
   var arr = new Array();
   var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
   var arrClass = strClass.split(delim);
   for (var i = 0, j = objColl.length; i < j; i++) {
      var arrObjClass = objColl[i].className.split(' ');
      if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
      var c = 0;
      comparisonLoop:
      for (var k = 0, l = arrObjClass.length; k < l; k++) {
         for (var m = 0, n = arrClass.length; m < n; m++) {
            if (arrClass[m] == arrObjClass[k]) c++;
            if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
               arr.push(objColl[i]);
               break comparisonLoop;
            }
         }
      }
   }
   return arr;
}

function addClass(obj,className) {
   var classes = getClasses(obj);
   for (var i=0; i<classes.length; i++) {
      if (classes[i].toLowerCase() == className.toLowerCase()) {
         classes[i] = '';
      }
   }
   classes.push(className);
   obj.className = classes.join(' ');
}

function removeClass(obj,className) {
   var classes = getClasses(obj);
   for (var i=0; i<classes.length; i++) {
      if (classes[i].toLowerCase() == className.toLowerCase()) {
         classes[i] = '';
      }
   }
   obj.className = classes.join(' ');
}

function hasClass(obj,className) {
   var classes = getClasses(obj);
   if (!(className instanceof Array)) {
      className = new Array(className.toString());
   }
   var matchAll = (className.length > 0);
   for (var i=0; i<className.length; i++)
   {
      var matchAll = (matchAll && inArray(classes,className[i]) !== false);
   }
   return matchAll;
}

function getClasses(obj) {
   return (obj && obj.className ? obj.className.split(/\s+/) : []);
}

function addEvent(obj,evType,fn,useCapture) {
   if (window.opera && obj.addEventListener) {
      // Prevent an Opera bug where event added in capture mode to form elements do not get triggered
      useCapture = false;
   }
   if (obj.addEventListener) {
      obj.addEventListener(evType,fn,useCapture);
      return true;
   } else if (obj.attachEvent) {
      var r = obj.attachEvent('on'+evType,fn);
      return r;
   } else {
      return false;
   }
}

function removeEvent(obj,evType,fn,useCapture) {
   if (window.opera && obj.addEventListener) {
      // Prevent an Opera bug where event added in capture mode to form elements do not get triggered
      useCapture = false;
   }
   if (obj.removeEventListener) {
      obj.removeEventListener(evType,fn,useCapture);
      return true;
   } else if (obj.detachEvent) {
      var r = obj.detachEvent('on'+evType,fn);
      return r;
   } else {
      return false;
   }
}



