// Updated 11/29/2007
//
// ----------------------------------------- xray viewer ------------------------------------------------

// clibdb_register('xray_v');


function silksite_init() {
	clibp_newPassCode('xray', 'toggleViewer()');
	document.onmousemove = dragViewer;
	document.onmouseup = releaseViewer;
	bugs_init(30);
	}

function toggleViewer(fOn) {
	if (clib_isNull(fOn)) fOn = !xray_v.fViewerOn;
	if (fOn) viewerOn();
	else viewerOff();
	}

function viewerOn() {
	xray_v.fViewerOn = true;
	var srcCode = '';
	var html = '';
	html += bugs_divHtml();
	srcCode = document.body.outerHTML;
	srcCode = clib_insertText(srcCode,"<",'<span style="color:blue;">&lt;');
	srcCode = clib_insertText(srcCode,">","&gt;</span>");
	srcCode = clib_insertText(srcCode,"\n"," ");
	html += '<p style="color:#d82c38; margin:10px; text-align:left; font-size:xx-small;">' + srcCode + '</p>';
	clib_writeln(html,'hiddenHtml');

	var vId = clib_getElementId(xray_v.divID);
	vId.onmousedown = function(ev) {
		xray_v.obj = vId.style;
		xray_v.obj.zIndex = 100;
		var mouseOffset = sitexray_getMouseOffsetXY(this,ev);
		xray_v.mouseOffsetX = mouseOffset.x;
		xray_v.mouseOffsetY = mouseOffset.y;
		xray_v.fMoved = false;
		return false;
		}
	moveViewer(10,10);
	bugs_on(Math.floor(Math.random()*200)+100, Math.floor(Math.random()*200)+100);
	}

function viewerOff() {
	xray_v.fViewerOn = false;
	xray_v.obj = null;
	bugs_off();
	hideViewer();
	clib_writeln('&nbsp;','hiddenHtml');
	}

function silksite_initDivs() {
	var html = '<style>\n';
	html += '#hiddenHtml { position:absolute; top:0px; left:0px; visibility:hidden; }\n';
	html += '#vDiv { visibility:hidden; position:absolute; top:0px; left:0px; margin:0px; cursor:move; }\n';
	html += bugs_styleHtml();
	html += '</style>\n';
	html += '<div id=hiddenHtml></div>\n';
	html += '<div id=vDiv><img id=vPic name=vPic src="' + clib_homePrefix + clib_unhideUrl('silk~|~xray_images~|~viewer~g~') + '"></div>';
	return html;
	}

function moveViewer(x,y) {
	xray_v.xViewer = Math.max(xray_v.xViewer + x,-xray_v.wViewer/2);
	xray_v.yViewer = Math.max(xray_v.yViewer + y,-xray_v.hViewer/2);
	clib_placeDiv('vDiv', xray_v.xViewer, xray_v.yViewer, 100, true)
	clib_placeDiv('hiddenHtml',0,0,2,true);
	clib_clipDiv('hiddenHtml',xray_v.xViewer+xray_v.xViewerOffset,xray_v.yViewer+xray_v.yViewerOffset,xray_v.wViewer,xray_v.hViewer);
	}

function placeViewer(x,y) {
	xray_v.xViewer = Math.max(x,-xray_v.wViewer/2);
	xray_v.yViewer = Math.max(y,-xray_v.hViewer/2);
	clib_placeDiv('vDiv', xray_v.xViewer, xray_v.yViewer, 100, true)
	clib_placeDiv('hiddenHtml',0,0,2,true);
	clib_clipDiv('hiddenHtml',xray_v.xViewer+xray_v.xViewerOffset,xray_v.yViewer+xray_v.yViewerOffset,xray_v.wViewer,xray_v.hViewer);
	}

function hideViewer() {
	clib_placeDiv('vDiv', 0, 0, 0, false);
	clib_placeDiv('hiddenHtml', 0, 0, 0, false);
	}

var xray_v = new _xrayVRecord(clib_unhideUrl('silk~|~xray_images~|~viewer~g~'),240,240,200,100,20,10);
function _xrayVRecord(url,width,height,peekWidth,peekHeight,peekLeft,peekTop) {
	this.members = 'url,width,height,peekWidth,peekHeight,peekLeft,peekTop,image,divID,imageName,div,x,y,z,fOn,obj,mouseOffsetX,mouseOffsetY';
	this.url = url;
	this.width = width;
	this.height = height;
	this.peekWidth = peekWidth;
	this.peekHeight = peekHeight;
	this.peekLeft = peekLeft;
	this.peekTop = peekTop;
	this.image = new Image();
	this.image.src = url;
	this.divID='vDiv';
	this.imageName='vPic';
	this.div = null;
	this.x = 0;
	this.y = 0;
	this.z = 0;
	this.fOn = false;
	this.obj = null;
	this.mouseOffsetX = 0;
	this.mouseOffsetY = 0;
	this.members += ',xViewerOffset,yViewerOffset,wViewer,hViewer,xViewer,yViewer,fViewerOn,fMoved';
	this.xViewerOffset = 20;
	this.yViewerOffset = 10;
	this.wViewer = 200;
	this.hViewer = 100;
	this.xViewer = 0;
	this.yViewer = 0;
	this.fViewerOn = false;
	this.fMoved = false;
	}

// 	document.onmousemove = dragViewer;
function dragViewer(ev) {
	if (!xray_v.obj) return;
	xray_v.fMoved = true;
	ev = ev || window.event;
	var mousePos = sitexray_getMouseXY(ev);
	var x = mousePos.x - xray_v.mouseOffsetX;
	var y = mousePos.y - xray_v.mouseOffsetY;
	var dim = clib_screenDimensions();		// dim.x,y,w,h,scrollX,scrollY,windowX,windowY,screenX,screenY
	x = Math.max(dim.scrollX, Math.min(dim.windowX + dim.scrollX - xray_v.width-30, x));
	y = Math.max(dim.scrollY, Math.min(dim.windowY + dim.scrollY - xray_v.height-25, y));
	xray_v.x = x;
	xray_v.y = y;
	placeViewer(x,y);
	return false;
	}

//	document.onmouseup = releaseViewer
function releaseViewer() {
	if (xray_v.obj) {
		xray_v.obj = null;
		if (!xray_v.fMoved) toggleViewer(false);
		}
	}

function sitexray_getMouseOffsetXY(target, ev) {
	ev = ev || window.event;
	var docPos = sitexray_getObjXY(target);
	var mousePos = sitexray_getMouseXY(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
	}
function sitexray_getMouseXY(ev) {
	if(ev.pageX || ev.pageY) return {x:ev.pageX, y:ev.pageY};
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	}
function sitexray_getObjXY(e) {
	var left = 0;
	var top  = 0;
	while (e.offsetParent) {
		left += e.offsetLeft;
		top += e.offsetTop;
		e = e.offsetParent;
		}
	left += e.offsetLeft;
	top  += e.offsetTop;
	return {x:left, y:top};
	}


// ----------------------------------------- bugs ------------------------------------------------
var bugs_nrgBugMax = 20;

// clibdb_register('bg_rgBug');
//
// -- private variables --
//
var bg_wBug = 13;
var bg_hBug = 13;
var bg_wHole = 50;
var bg_hHole = 50;
var bg_rgBugUrl = new Array();
var bg_rgBugAltUrl = new Array();
var bg_rgBugDeadUrl = new Array();
var bg_rgCheckImages = new Array();
var bg_nrgCheckImages = 0;
var bg_rgBug = new Array();
var bg_nrgBug = 20;
var bg_fBugsOn = false;
var bg_fAltImage = false;
var bugs_imageLocation = clib_unhideUrl('silk~|~bugs~|~');
var bg_nullImage, bg_homeObj, bg_holeObj, bg_poisonObj;
var hclick = '';

function bugs_init(n) {
	if ((n == null) || (n == 0)) return;
	bg_nrgBug = n;
	var html = '';
	for (var i = 0; i < bg_nrgBug; i ++) bg_rgBug[i] = new bg_bugType();
	bg_initVars();
	}

function bugs_divHtml() {
	var html = '<div id=' + bg_holeObj.divId + ' class=divClass>';
	html += '<img class=holeImgClass id=' + bg_holeObj.imgId + ' src="' + bg_nullImage + '" width=' + bg_wHole + ' height=' + bg_hHole + hclick + '></div>\n';
	for (var i = 0; i < bg_nrgBug; i ++) {
		var b = bg_rgBug[i];
		html += '<div id=' + b.divId + ' class=divClass>';
		html += '<img class=bugImgClass id=' + b.imgId + ' src="' + bg_nullImage + '" width=' + bg_wBug + ' height=' + bg_hBug + '></div>\n';
		}
	return html;
	}

function bugs_styleHtml() {
	var html = '.divClass { position:absolute; }\n';
	html += '.bugImgClass { filter:blendTrans(duration=1.5); }\n';
	html += '.holeImgClass { filter:blendTrans(duration=1.5); }\n';
	return html;
	}

function bugs_on(xHole,yHole) {
	if ((xHole == null) || (yHole == null)) {
		var sd = clib_windowDimensions();
		xHole = sd.xMin + bg_wHole + Math.floor(Math.random() * (sd.xMax - sd.xMin - (2 * bg_wHole)));
		yHole = sd.yMin + (bg_hHole * 3) + Math.floor(Math.random() * (sd.yMax - sd.yMin - (4 * bg_wHole)));
		}
	bg_holeObj.x = xHole;
	bg_holeObj.y = yHole;
	bg_holeObj.z = 1;
	clib_swapImage(bg_holeObj.imgId,bg_holeObj.url);
	clib_placeDiv(bg_holeObj.divId, bg_holeObj.x, bg_holeObj.y, bg_holeObj.z);
	bg_homeObj.x = xHole + 20;
	bg_homeObj.y = yHole + 15;
	bg_homeObj.z = 1;
	for (var i = 0; i < bg_nrgBug; i++) bg_conceiveBug(i);
	bg_fBugsOn = true;
	setTimeout('bg_moveBugs()', 100);
	}

function bugs_off(fCleanup) {
	bg_fBugsOn = false;
	if ((fCleanup != null) && fCleanup) {
		clib_swapImage(bg_holeObj.imgId,bg_nullImage);
		for (i=0; i < bugs_nrgBugMax; i++) clib_swapImage(bg_rgBug[i].imgId, bg_nullImage);
		}
	}

function bugs_resize() {
	}

//
// Bug private routines
//
function bg_initVars() {
	function getName(b) {
		var url = clib_normalizeUrl(bugs_imageLocation + 'bug_' + b + '.gif');
		bg_rgCheckImages[bg_nrgCheckImages] =  new Image();
		bg_rgCheckImages[bg_nrgCheckImages].src = url;
		bg_nrgCheckImages++;
		return url;
		}
	var rgBugName = new Array('n','ne','e','se','s','sw','w','nw');
	bg_nullImage = getName('null');
	bg_homeObj = new bg_objType();
	bg_holeObj = new bg_objType(getName('hole'));
	for (var i = 0; i < 8; i++) {
		bg_rgBugUrl[i] = getName(rgBugName[i]);
		bg_rgBugAltUrl[i] =  getName(rgBugName[(i + 4) % 8]);
		bg_rgBugDeadUrl[i] =  getName(rgBugName[i] + '_dead');
		}
	}

function bg_bugType() {
	this.members = 'divId,imgId,status,speed,x,y,targetX,targetY,iExitingWomb,fWomb,fLiving,fKilling,fHeaven,iWombTime,iLifeTime,iKilling,iHeavenTime,irgImgKilling';
	this.divId = clib_newElementId('div');
	this.imgId = clib_newElementId('img');
	this.status = null;
	this.speed = 0;
	this.x = 0;
	this.y = 0;
	this.targetX = 0;
	this.targetY = 0;
	this.fWomb = false;
	this.fLiving = false;
	this.fKilling = false;
	this.fHeaven = false;
	this.iWombTime = 0;
	this.iExitingWomb = 0;
	this.iLifeTime = 0;
	this.iKilling = 0;
	this.iHeavenTime = null;
	this.irgImgKilling = 0;
	}

function bg_objType(url) {
	this.members = 'url,divId,imgId,x,y,z,fade';
	this.url = url;
	this.divId = clib_newElementId('div');
	this.imgId = clib_newElementId('img');
	this.x = 0;
	this.y = 0;
	this.z = 0;
	this.fade = 0;
	}

function bg_checkImages() {
	for (var i = 0; i < bg_rgCheckImages.length; i++) {
		if (bg_rgCheckImages[i].complete==false) return false;
		}
	return true;
	}

function bg_setBugTarget(iBug) {
	var b = bg_rgBug[iBug];
	var wd = clib_windowDimensions();
	var x = Math.floor(Math.random() * (wd.xMax - wd.xMin));
	var y = Math.floor(Math.random() * (wd.yMax - wd.yMin));
	var s = Math.floor(Math.random() * 4);		// pick a random direction
	if (s == 0) x = wd.xMin - bg_wBug;				// head for left side
	if (s == 1) x = wd.xMax + bg_wBug;				// head for right side
	if (s == 2) y = wd.yMin - bg_hBug;				// head for top
	if (s == 3) y = wd.yMax + bg_hBug;				// head for bottom
	b.targetX = x;
	b.targetY = y;
	}

function bg_conceiveBug(iBug,cd) {				// all tics are 1/10 second
	var b = bg_rgBug[iBug];
	b.x = bg_homeObj.x;
	b.y = bg_homeObj.y;
	b.fWomb = true;
	b.fLiving = false;
	b.fKilling = false;
	b.fHeaven = false;
	b.speed = Math.floor(Math.random() * 10 + 4);
	b.iWombTime = Math.floor(Math.random() * 20) + 10;						// preborn: 1 seconds min + random 0-2 secs
	b.iExitingWomb = Math.floor(Math.random() * 5) + 2;						// exiting: enough tics to get clear of hole
	b.iLifeTime = b.iExitingWomb + Math.floor(Math.random() * 200) + 50;	// lifetime: 5 seconds + random 0-20 secs
	b.iKilling = Math.floor(Math.random() * 50) + 10;						// dying: 1 second + random 0-5 secs 
	b.iHeavenTime = Math.floor(Math.random() * 50) + 20;					// heaven: 2 secs + random 0-5 secs
	b.irgImgKilling = Math.floor(Math.random() * bg_rgBugUrl.length)
	bg_setBugTarget(iBug);
	clib_swapImage(b.imgId, bg_nullImage,2);
	}

function bg_sendToHeaven(iBug) {
	var b = bg_rgBug[iBug];
	clib_swapImage(b.imgId, bg_rgBugDeadUrl[b.irgImgKilling],2);
	b.fKilling = false;
	b.fHeaven = true;
	}

function bg_sickenBug(iBug) {
	var b = bg_rgBug[iBug];
	b.fLiving = false;
	b.fKilling = true;
	b.iKilling = Math.floor(Math.random() * 50) + 10;
	}

function bg_birthBug(iBug) {
	var b = bg_rgBug[iBug];
	b.fWomb = false;
	b.fLiving = true;
	}

function bg_sendHome(iBug) {
	var b = bg_rgBug[iBug];
	b.x = bg_homeObj.x;
	b.y = bg_homeObj.y;
	b.iExitingWomb = Math.floor(Math.random() * 5) + 2;
	}

function bg_moveBugs() {
	if (!bg_fBugsOn) return;
	var dx, dy, degree, d;
	for (var i = 0; i < bg_nrgBug; i++) {
		var b = bg_rgBug[i];

		if (b.fWomb) {
			b.iWombTime--; 
			if (b.iWombTime <= 0) bg_birthBug(i);
			}

		else if (b.fLiving) {
			b.iLifeTime--;
			if (b.iLifeTime <= 0) bg_sickenBug(i);
			d = b.speed;
			dx = b.targetX - b.x;
			dy = b.targetY - b.y;
			var fEscaped = (Math.abs(dx) < d && Math.abs(dy) < d) 
			degree = Math.round(Math.atan2(-dy, dx) * 180 / Math.PI);
			if (degree < 0) degree += 360;
			if (b.iExitingWomb > 0) {									// go straight up at first
				b.iExitingWomb--;
				irg = 0;
				dx = 0;
				dy = -d;
				}
			else {														// go in various directions
				var rgdX = new Array(0,1,1,1,0,-1,-1,-1);
				var rgdY = new Array(-1,-1,0,1,1,1,0,-1);
				var irg = Math.floor(((720 - degree - 245) % 360) / 45);
				if (irg > 7 || irg < 0) alert(degree + ' = ' + irg);
				var dx = rgdX[irg] * d;
				var dy = rgdY[irg] * d;
				}				
			var img = bg_rgBugUrl[irg];
			var img_wg = bg_rgBugAltUrl[irg];
			b.x += dx;
			b.y += dy;
			var wd = clib_windowDimensions();
			if ((b.x < wd.xMin - bg_wBug) || (b.x > wd.xMax - bg_wBug) ||
				(b.y < wd.yMin - bg_hBug) || (b.y > wd.yMax - bg_hBug)) bg_sendHome(i); // send back into hole if escaped
			else {
				clib_placeDiv(b.divId, b.x, b.y, 5);
				clib_swapImage(b.imgId, (bg_fAltImage ? img : img_wg));
				}
			}

		else if (b.fKilling) {
			b.iKilling--;
			if (b.iKilling <= 0) bg_sendToHeaven(i);
			else if (b.iKilling > Math.floor(Math.random()*5)) {
				b.x += Math.floor(Math.random() * 4) - 2;
				b.y += Math.floor(Math.random() * 4) - 2;
				clib_placeDiv(b.divId, b.x, b.y, 5);
				var img = bg_rgBugUrl[b.irgImgKilling];
				var img_wg = bg_rgBugAltUrl[b.irgImgKilling];
				clib_swapImage(b.imgId, (bg_fAltImage ? img : img_wg));
				}
			}

		else if (b.fHeaven) { b.iHeavenTime--; if (b.iHeavenTime <= 0) bg_conceiveBug(i); }

		}
	setTimeout('bg_moveBugs()', 100);
	bg_fAltImage = !bg_fAltImage;
	return;
	}

