/*
  Another WebSnapr preview bubble

  Source modified from Link Preview V2
  by Filitov Chang
  http://filitov.twcat.org - filitov@twcat.org

  Link Preview V2
  Author: Brian McAllister
  http://www.frequency-decoder.com/2006/10/25/link-preview-v2/
  
  WebSnapr - Preview Bubble Javascript
  Author: Juan Xavier Larrea 
  http://www.websnapr.com - xavier@websnapr.com   

  BrowserDetect
  Author: Peter-Paul Koch
  http://www.quirksmode.org/js/detect.html
*/

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"
		}
	]

};


var DeleUI = {
	doc:document.documentElement,
	init: function () {

	},
	addEvent: function( obj, ets, fn ){
		var et;
		for(var i=0; i<ets.length; i++){
			et = ets[i];
			if(obj.addEventListener) obj.addEventListener(et,fn,false);
			else if(obj.attachEvent){
				obj['e'+et+fn] = fn;
				obj[et+fn] = function(){obj['e'+et+fn]( window.event );}
				obj.attachEvent( 'on'+et, obj[et+fn] );
			}
		}
	},
	addChild: function( p, c ){
		if( p ) p.appendChild(c); else document.getElementsByTagName('body')[0].appendChild(c);
	},
	createElement: function( tag ){
		return document.createElement( tag );
	},
	eventPos: function( e ){
		if(String(e.type).toLowerCase().search(/mouseover/) != -1) {
			if(document.captureEvents) return {x:e.pageX,y:e.pageY};
			if(window.event.clientX)
			return {x:window.event.clientX+DeleUI.doc.scrollLeft,y:window.event.clientY+DeleUI.doc.scrollTop};
		}
		var obj = e.target? e.target : e.srcElement;
		var cL = cT = 0;
		if( obj.offsetParent ) {
			cL=obj.offsetLeft;
			cT=obj.offsetTop;
			while ( obj = obj.offsetParent ) {
				cL += obj.offsetLeft;
				cT += obj.offsetTop;
			}
		}
		return { x:cL, y:cT };
	},
	posQuad: function(x,y){
		var zX=zY=0;
		zX=DeleUI.doc.scrollLeft+DeleUI.doc.clientWidth/2;
		zY=DeleUI.doc.scrollTop+DeleUI.doc.clientHeight/2;
		return x<=zX?(y<= zY?4:3):(y<=zY?1:2);
	},
	title: function( s ){
		document.title = s ;
	}
};

var fWSnapr = {
	bubble:null,
	loading:null,
	image:null,
	timerDelayShow:null,
	imageCache:[],
	baseURI: './',
	init: function( baseURI ){
		fWSnapr.baseURI = baseURI?baseURI:'./';
		DeleUI.addEvent( window, ['load'], fWSnapr.load );
	},
	load:function(){
		var lnks = document.getElementsByTagName('a');
		var reg=new RegExp("(^|\\s)preview(\\s|$)");
		var actLnk = 0;
		for(var i=0;i<lnks.length;i++){
			if( lnks[i].className && reg.test(lnks[i].className) ){
				DeleUI.addEvent(lnks[i], ["focus", "mouseover"], fWSnapr.hoverThumb);
				DeleUI.addEvent(lnks[i], ["blur",  "mouseout"],  fWSnapr.hideThumb);
				actLnk++;
			}
		}
		if( actLnk ){
			fWSnapr.preloadImages();
			fWSnapr.draw();
		}
	},
	draw:function(){
		var bb=DeleUI.createElement('div');
		if(BrowserDetect.browser!='Explorer')
			bb.setAttribute("style","position:absolute;display:block;overflow:hidden;z-index:99999;width:243px;height:195px;top:0;left:0;border:0 none;padding:0;margin:0;visibility:hidden;");
		else{
			bb.style.position='absolute';
			bb.style.display='block';
			bb.style.overflow='hidden';
			bb.style.zIndex=99999;
			bb.style.width='243px';
			bb.style.height='195px';
			bb.style.top='0';
			bb.style.left='0';
			bb.style.border='0 none';
			//bb.style.background='transparent';
			bb.style.visibility = 'hidden';
		}
		
		var onL=DeleUI.createElement('img');
		onL.alt='Loading';
		if(BrowserDetect.browser!='Explorer')
			onL.setAttribute("style","position:absolute;display:block;overflow:hidden;z-index:1;width:32px;height:32px;top:0;left:0;border:0 none;padding:0;margin:0;visibility:hidden;");
		else{
			onL.style.position='absolute';
			onL.style.zIndex=1;
			onL.style.display='block';
			onL.style.width='32px';
			onL.style.height='32px';
			onL.style.top='0';
			onL.style.left='0';
			onL.style.border='0 none';
			onL.style.visibility = 'hidden';
		}

		var img=DeleUI.createElement('img');
		img.alt='Preview';
		if(BrowserDetect.browser!='Explorer')
			img.setAttribute("style","position:absolute;display:block;overflow:hidden;z-index:1;width:202px;height:152px;top:0;left:0;border:0 none;padding:0;margin:0;visibility:hidden;");
		else{
			img.style.position='absolute';
			img.style.zIndex=2;
			img.style.display='block';
			img.style.width='202px';
			img.style.height='152px';
			img.style.top='0';
			img.style.left='0';
			img.style.border='0 none';
			img.style.visibility = 'hidden';
		}

		DeleUI.addEvent(img, ["load"],fWSnapr.showThumbLoaded);
		DeleUI.addEvent(img, ["error"],fWSnapr.hideThumb);
		DeleUI.addEvent(img, ["mouseout"],fWSnapr.hideThumb);

		DeleUI.addChild(bb,onL);
		DeleUI.addChild(bb,img);
		DeleUI.addChild(null,bb);
		fWSnapr.bubble=bb;
		fWSnapr.loading=onL;
		fWSnapr.image=img;
	},
        preloadImages: function() {
		var imgList=["bg1.gif", "bg2.gif", "bg3.gif", "bg4.gif", "error.gif", "loading.gif"];
		var imgObj=DeleUI.createElement('img');
		for(var i = 0, img; img = imgList[i]; i++) {
			fWSnapr.imageCache[i] = imgObj.cloneNode(false);
			fWSnapr.imageCache[i].src = fWSnapr.baseURI+img;
		}
        },
	hoverThumb:function(e){
		var obj = e.target? e.target : e.srcElement;
		if( !obj.href ) return;
		var pos = DeleUI.eventPos(e);
		fWSnapr.timerDelayShow = window.setTimeout('fWSnapr.showThumb('+pos.x+','+pos.y+',"'+encodeURIComponent(obj.href)+'")',500);
	},
	showThumb:function(x,y,href){
		var qu = DeleUI.posQuad(x, y);

		fWSnapr.bubble.style.background='transparent url('+fWSnapr.baseURI+'bg'+qu+'.gif) no-repeat 0 0;';
		fWSnapr.bubble.style.left=((qu==3||qu==4)?(x+10):(x-10-fWSnapr.bubble.offsetWidth))+'px';
		fWSnapr.bubble.style.top=((qu==1||qu==4)?(y+0):(y-0-fWSnapr.bubble.offsetHeight))+'px';
		fWSnapr.bubble.style.visibility = 'visible';

		fWSnapr.loading.src=fWSnapr.baseURI+'loading.gif';
		fWSnapr.loading.style.top=(qu==1||qu==4?82:75)+'px';
		fWSnapr.loading.style.left=(qu==1||qu==2?103:105)+'px';
		fWSnapr.loading.style.visibility = 'visible';

		fWSnapr.image.style.top=(qu==1||qu==4?28:16)+'px';
		fWSnapr.image.style.left=(qu==1||qu==2?15:25)+'px';
		fWSnapr.image.style.visibility = 'hidden';
		
		fWSnapr.image.src = 'http://images.websnapr.com/?url='+href+'&size=s';
	},
	showThumbLoaded:function(){
		if( fWSnapr.timerDelayShow ) clearTimeout( fWSnapr.timerDelayShow );
		if( fWSnapr.bubble.style.visibility == 'visible' ){
			fWSnapr.loading.style.visibility = 'hidden';
			fWSnapr.image.style.visibility = 'visible';
		}
	},
	hideThumb:function(e){
		if( fWSnapr.timerDelayShow ) clearTimeout( fWSnapr.timerDelayShow );
		fWSnapr.image.style.visibility = 'hidden';
		fWSnapr.loading.style.visibility = 'hidden';
		fWSnapr.bubble.style.visibility = 'hidden';
	},
	nothing: 0 
};

BrowserDetect.init();
fWSnapr.init('http://filitov.twcat.org/blog/wp-content/plugins/fili-websnapr/');
