/*
    WebSnapr - Preview Bubble Javascript
    Written by Juan Xavier Larrea 
    http://www.websnapr.com - xavier@websnapr.com   
    
*/

// Point this variable to the correct location of the bg.png file
var bubbleImageUp = 'resources/bubble_up.png';
var bubbleImageDown = 'resources/bubble_down.png';

if(typeof Array.prototype.push!="function"){
   Array.prototype.push=ArrayPush;

   function ArrayPush(_1){
      this[this.length]=_1;
   }
}

function WSR_getElementsByClassName(oElm, strTagName, oClassNames){
   var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
   var arrReturnElements = new Array();
   var arrRegExpClassNames = new Array();
   if(typeof oClassNames == "object"){
      for(var i=0; i<oClassNames.length; i++){
         arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames[i].replace(/-/g, "\-") + "(\s|$)"));
      }
   }
   else{
      arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames.replace(/-/g, "\-") + "(\s|$)"));
   }
   var oElement;
   var bMatchesAll;
   for(var j=0; j<arrElements.length; j++){
      oElement = arrElements[j];
      bMatchesAll = true;
      for(var k=0; k<arrRegExpClassNames.length; k++){
         if(!arrRegExpClassNames[k].test(oElement.className)){
            bMatchesAll = false;
            break;
         }
      }
      if(bMatchesAll){
         arrReturnElements.push(oElement);
      }
   }
   return (arrReturnElements)
}
/*function WSR_getElementsByClassName(_2,_3,_4){

   var _5=(_3=="*"&&_2.all)?_2.all:_2.getElementsByTagName(_3);
         window.alert(_5[0]);
   var _6=new Array();
   _4=_4.replace(/\-/g,"\\-");
   var _7=new RegExp("(^|\\s)"+_4+"(\\s|$)");
   var _8;
   for(var i=0;i<_5.length;i++){
      _8=_5[i];
      if(_7.test(_8.className)){
         _6.push(_8);
      }
   }
   return (_6);
}*/

function bindBubbles(e){
   lbActions=WSR_getElementsByClassName(document,"img","thumb");
   for(i=0;i<lbActions.length;i++){
      if(window.addEventListener){ // Mozilla, Firefox
         lbActions[i].addEventListener("mouseover",attachBubble,false);
         lbActions[i].addEventListener("mouseout",detachBubble,false);
         lbActions[i].addEventListener("click",detachBubble,false);
      }else if (window.attachEvent) { // IE
         lbActions[i].attachEvent("onmouseover",attachBubble);
         lbActions[i].attachEvent("onmouseout",detachBubble);
         lbActions[i].attachEvent("onclick",detachBubble);
      } else {
         // it seems this browser doesn't support any eventhandling
      }  
   }
}

function attachBubble(_b){
   var _c;
   if(_b["srcElement"]){ // IE
      _c=_b["srcElement"];
   }else{ // Mozilla, Firefox
      _c=_b["target"];
   }
   if (_c.href == undefined){
      _c=_c.parentNode;
   }

   var _d=_c.href;

   var _10=document.createElement("div");
   document.getElementsByTagName("body")[0].appendChild(_10);
   _10.className="bubble";

   if(BrowserDetect.browser != 'Explorer') {

      var _e=findPos(_c)[0]+5;
      var cur_height = findPos(_c)[1]-get_scroll_position() + 283;

      // should the bubble be displayed above or below the object
      if(cur_height >= get_page_height()) {
         var _f=findPos(_c)[1]-363;
         bubbleImage = bubbleImageUp;
      }
      else {
         var _f=findPos(_c)[1]+17;
         bubbleImage = bubbleImageDown;
      }
   }
   else {
         var _e=findPos(_c)[0]+5;
         var _f=findPos(_c)[1]+129;
         bubbleImage = bubbleImageDown;
   }
   if (BrowserDetect.browser == 'Explorer') {
      _10.style.width="275px";
      _10.style.height="275px";
      _10.style.position="absolute";
      _10.style.top=_f;
      _10.style.zIndex=99999;
      _10.style.left=_e;
      _10.style.textAlign="left";
      _10.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + bubbleImage + "',sizingMethod='image')";
   } else if (BrowserDetect.browser == 'Safari' || BrowserDetect.browser == 'Konqueror' ) {
      _10.setAttribute("style","text-align: center; z-index: 99999; position: absolute; top: "+ _f +"px ; left: "+ _e +"px ; background: url("+ bubbleImage +") no-repeat; width: 275px; height: 275px; padding: 0; margin: 0;");
   } else {
      _10.setAttribute("style","text-align: center; z-index: 99999; position: absolute; top: "+_f+"px ; left: "+ _e +"px ; background: url("+ bubbleImage +") no-repeat; width: 275px; height: 275px; padding: 0; margin: 0;");
   }

   if(cur_height >= get_page_height()) 
      showBubbleDetails(_10, _c.id, 'up');
   else
      showBubbleDetails(_10, _c.id, 'down');

}

function detachBubble(_12){
   lbActions=WSR_getElementsByClassName(document,"div","bubble");
   for(i=0;i<lbActions.length;i++){
      lbActions[i].parentNode.removeChild(lbActions[i]);
   }
}

function findPos(obj){
   var _14=curtop=0;
   if(obj.offsetParent){
      _14=obj.offsetLeft;
      curtop=obj.offsetTop;
      while(obj=obj.offsetParent){
         _14+=obj.offsetLeft;
         curtop+=obj.offsetTop;
      }
   }
   return [_14,curtop];
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

function var_dump(arr,level) {
   var dumped_text = "";
   if(!level) level = 0;
   
   //The padding given at the beginning of the line.
   var level_padding = "";
   for(var j=0;j<level+1;j++) level_padding += "    ";
   
   if(typeof(arr) == 'object') { //Array/Hashes/Objects 
      for(var item in arr) {
         var value = arr[item];
         
         if(typeof(value) == 'object') { //If it is an array,
            dumped_text += level_padding + "'" + item + "' ...\n";
            dumped_text += dump(value,level+1);
         } else {
            dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
         }
      }
   } else { //Stings/Chars/Numbers etc.
      dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
   }
   return dumped_text;

}//end function var_dump

function get_page_height()
{
   var myHeight = 0;
   if( typeof( window.innerHeight ) == 'number' ) {
      //Non-IE
      myHeight = window.innerHeight;
   } else if( document.documentElement && document.documentElement.clientHeight  ) {
      //IE 6+ in 'standards compliant mode'
      myHeight = document.documentElement.clientHeight;
   } else if( document.body &&  document.body.clientHeight ) {
      //IE 4 compatible
      myHeight = document.body.clientHeight;
   }

   return myHeight;
}

function get_scroll_position()
{
   if (typeof window.pageYOffset != 'undefined') {
      return window.pageYOffset;
   }
   else {
      if (typeof document.compatMode != 'undefined' &&
         document.compatMode != 'BackCompat' &&
         typeof window.scrollTop != 'undefined')
         return window.scrollTop;
      else {
         if(typeof document.documentElement.scrollTop != 'undefined')
            return document.documentElement.scrollTop;
         else {
            if (typeof document.body.scrollTop != 'undefined')
               return document.body.scrollTop;
         }
      }
   }

   return 0;

}

BrowserDetect.init();