
	function initImageZoom(_options) {
		var options = $extend({
			rel: 'imagezoom'
		}, _options || {});
		var elements = $$(document.links).filter(function(el) {
			if ((el.rel) && (el.rel.indexOf(options.rel) != -1)) 
				return true;
			else
				return false;
		});
		for (var i = 0; i < elements.length; i++) {
			var el = elements[i];
			el.addEvent("click", function() {
				this.blur();
				var sEl = this;
				var imgCap = "";
				if (this.getElements("img").length > 0)
					sEl = this.getElements("img")[0];
				if ((sEl.alt) && (sEl.alt != ""))
					imgCap = sEl.alt;
				else if (sEl.title)
					imgCap = sEl.title;
				else if (sEl.parentNode.title)
					imgCap = sEl.parentNode.title;
				var _options = $extend({
					image: this.href,
					caption: imgCap,
					startElement: sEl
				}, options || {});
				_options.image = this.href;
				_options.caption = imgCap;
				var imagezoom = new Imagezoom(_options);
				imagezoom.preloadImage();
				imagezoom.show();
				return false;
			});
		}
	}
	
	var Imagezoom = function(_options) {	
		var options = $extend({
			image: false,
			caption: "",
			enableCaptions: true,
			startElement: false,
			x: 10,
			y: 10,
			initWidth: 50,
			initHeight: 50,
			draggable: true,
			loadImage: "../img/qaic_loader.gif",
			loadDelay: 150,
			duration: 800,
			closeDuration: 500,
			transition: Fx.Transitions.Cubic.easeOut,
			startOpacity: 0.6,
			closeText: 'Close',
			rel: 'imagezoom',
			showCaptionBar: true,
			overlay: false,
			overlayColor: "#000",
			overlayOpacity: .75
		}, _options || {});
		
		var box = document.createElement("div");		
		var instance = this;
		
		/* shadow divs */
		var tl = document.createElement("div");
		tl.className = "s s_tl";
		var tr = document.createElement("div");
		tr.className = "s s_tr";
		var bl = document.createElement("div");
		bl.className = "s s_bl";
		var br = document.createElement("div");
		br.className = "s s_br";
		var top = document.createElement("div");
		top.className = "s s_top";
		var bottom = document.createElement("div");
		bottom.className = "s s_bottom";
		var left = document.createElement("div");
		left.className = "s s_left";
		var right = document.createElement("div");
		right.className = "s s_right";
		
		this.preloadImage = function() {
			if (options.image != false) {
				var img = new Image();
				img.src = options.image;
				img.style.visibility = "hidden";
				img.style.position = "absolute";
				img.style.top = "-9999999999px";
				img.setAttribute("id", "imagezoom-" + options.image);
				$$('body')[0].appendChild(img);
				
			}	
		}
		
		this.getImage = function() {
			if (($('imagezoom-' + options.image)) && ($('imagezoom-' + options.image).width != "0")) {
				var img = $('imagezoom-' + options.image).clone();
				img.setAttribute("id", "");
				img.style.position = "relative";
				img.style.top = "0px";
				img.style.visibility = "visible";
			} else {
				instance.preloadImage();
				window.setTimeout(function() {
					instance.getImage();
				}, 50);
			}
			return img;
		}		
		
		this.show = function() {
			if (options.image != false) {
				box.style.position = "absolute";
				box.style.overflow = "hidden";
				box.setAttribute("id", "imagezoom-open-" + options.image);
				
				if (options.startElement != false)
					options.startElement.blur();
				
				var x = options.x;
				var y = options.y;
				var boxWidth =box.offsetWidth;// options.initWidth;
				var boxHeight = box.offsetHeight;// options.initHeight;
				if (options.startElement != false) {
					var displayedImg=null;
					$("content_left").getElements('a').each(function(e){if(e.style.display!='none')displayedImg=e;});
					x =displayedImg.getPosition().x;//options.startElement.getPosition().x;
					y =displayedImg.getPosition().y; //options.startElement.getPosition().y;
					
					if(x==0 || y==0)
					{
						if($("flashholder"))
						{
							x=$("flashholder").getPosition().x;
							y=$("flashholder").getPosition().y;
						}
					}
					boxWidth = box.offsetWidth;// options.startElement.offsetWidth;
					boxHeight = box.offsetHeight;//options.startElement.offsetHeight;
				}
				box.style.left = x + "px";
				box.style.top = y + "px";
				box.style.width = boxWidth + "px";
				box.style.height = boxHeight + "px";
				
				var fx = new Fx.Morph(box);
				fx.set({opacity: options.startOpacity});
				
				box.className = "imagezoom";
				$$('body')[0].appendChild(box);
				box.style.cursor = "pointer";
				box.addEvent("click", function() {
					var fx = new Fx.Morph(box, {duration: 200});
					fx.start({opacity: 0}).chain(function() {
						$$('body')[0].removeChild(box);
					});
				});

				this.loadImage();
			}
		}
		
		this.loadImage = function() {
			if (box.getElements(".loading").length == 0) {
				var loading = new Image();
				loading.src = options.loadImage;
				loading.className = "loading";
				box.appendChild(loading);
			}	
			if ($('imagezoom-' + options.image)) {
				var el = $('imagezoom-' + options.image);
				if (el.width != "0") {
					var newEl = new Image();
					newEl.src = options.image;
					var dv=document.createElement("div")
					dv.appendChild(newEl);
					window.setTimeout(function() { instance.insertImage(dv) }, options.loadDelay);
				} else {
					window.setTimeout(function() { instance.loadImage(); }, 50);
				}
			} else {
				instance.preloadImage();
				window.setTimeout(function() { instance.loadImage(); }, 50);
			}
		}
		
		this.insertImage = function(img)
		{
			if (img)
			{
				if (img.children)
				{	
					var im=img.children[0];
				}
				else
				{
					var im=img.getElement('img');
				}
				
				if (im)
				{
					box.removeEvents("click");
					box.style.cursor = "default";
					box.style.overflow = "visible";
					var w =  box.offsetWidth;
					var h =  box.offsetHeight;
					img.style.width = (box.offsetWidth-10) + "px";
					img.style.height =(box.offsetHeight-10)  + "px";
					img.style.overflow='hidden';
					img.className = 'image';
					var ptop = (window.getSize().y / 2) + window.getScroll().y - (h/2);
					var pleft = (window.getSize().x / 2) + window.getScroll().x - (w/2);
					var fx = new Fx.Morph(box, {duration: options.duration, transition: options.transition});
					fx.start({
						top: ptop,
						left: pleft,
						width: w,
						height: h,
						opacity: 1
					}).chain(function() {
						if (options.overlay == true) {
							if (!$('imagezoom_overlay')) {
								var overlay = $(document.createElement("div"));
								overlay.setAttribute("id", "imagezoom_overlay");
								overlay.style.backgroundColor = options.overlayColor;
								overlay.setOpacity(0);
								$$('body')[0].appendChild(overlay);
							} else {
								var overlay = $('imagezoom_overlay');
							}
							overlay.style.width = window.getScrollSize().x + "px";
							overlay.style.height = window.getScrollSize().y + "px";
							var overlayfx = new Fx.Morph(overlay, {duration: 600});
							overlayfx.start({
								opacity: options.overlayOpacity
							});
							
						}
						var close = $(document.createElement("div"));
						close.innerHTML = "<span>" + options.closeText + "</span>";
						close.className = "close";
						close.addEvent("click", function() {
							instance.close(true);
						});
						var loading = box.getElements(".loading");
						if (loading.length > 0)
							box.removeChild(loading[0]);
						var elements = [close, tl, tr, bl, br, top, bottom, left, right, img];
						for (var i = 0; i < elements.length; i++) {
							var elFx = new Fx.Morph(elements[i], {duration: 600});
							elFx.set({opacity: 0});
							box.adopt(elements[i]);
							elFx.start({opacity: 1});
							if(i==elements.length-1)
							{
								im.style.marginTop="0px";
								im.style.marginLeft=(box.offsetWidth-10-im.offsetWidth)+"px";
								if(parseInt(im.style.marginLeft)>0) im.style.marginLeft="0px";
								moveImage(im,options,box);
							}
						}
						var caption;
						var totalImg=$("content_left").getElements('a').length;
						var currentImg=0;
						var counts=0;
							$("content_left").getElements('a').each(function(e1){
								counts++;																	 
								if(options.image.indexOf(e1.href)>=0)
								{
									options.caption=e1.getElement('img').getAttribute('title');
									currentImg=counts
								}
							});
							
					
						if ((options.caption != "") && (options.enableCaptions == true)) {
							caption = document.createElement("div");
							caption.className = "caption";
							caption.innerHTML = "<p>" + options.caption+"&nbsp;&nbsp;"+currentImg+" of "+totalImg+"</p>";
							box.appendChild(caption);
						}
						instance.addSetNavigation();
						if (box.getElements(".caption").length > 0) {
							caption = box.getElements(".caption")[0];
							var cfx = new Fx.Morph(caption, {duration: 200});
							cfx.set({opacity: 0});
							if (options.showCaptionBar == true) {
								caption.className += " visibleCaption";
								var cStartFx = new Fx.Morph(caption, {duration: 600});
								cStartFx.start({
									opacity: 1
								});
							}
							box.addEvent("mouseenter", function() {
								cfx.start({opacity: 1}).chain(function() { caption.className += " visibleCaption"; });
							});
							box.addEvent("mouseleave", function() {
								cfx.start({opacity: 0}).chain(function() { caption.className = caption.className.replace(/visibleCaption/g, ""); });
							});
							close.addEvent("mouseenter", function() {
								cfx.start({opacity: 0}).chain(function() { caption.className = caption.className.replace(/visibleCaption/g, ""); });
							});
							box.getElements(".image")[0].addEvent("click", function() {
								var action = "show";
								if (caption.className.indexOf("visibleCaption") != -1)
									action = "hide";
								if (action == "show")
									cfx.start({opacity: 1}).chain(function() { caption.className += " visibleCaption"; });
								else
									cfx.start({opacity: 0}).chain(function() { caption.className = caption.className.replace(/visibleCaption/g, ""); });
							});				
						}
						top.style.width = box.offsetWidth + "px";
						bottom.style.width = box.offsetWidth + "px";
						left.style.height = box.offsetHeight + "px";
						right.style.height = box.offsetHeight + "px";
						if (options.draggable == true)
							var move = new Drag.Move(box, {handle: img});
					});		
				}
			}
		}
		
		this.addSetNavigation = function() {
			var links = $$(document.links).filter(function(link) {
				if ((link.rel) && (link.rel.indexOf(options.rel) != -1))
					return true;
				else
					return false;
			});
			var set = false;
			for (var i = 0; i < links.length; i++) {
				if ((links[i].href.indexOf(options.image) != -1) && (links[i].rel) && (links[i].rel.indexOf(options.rel + '[' != -1))) {
					var rel = links[i].getAttribute("rel");
					set = instance.scanRel("after", options.rel + "[", this.scanRel("before", "]", rel));
				}
			}
			if (set != false) {
				var prevLink = false;
				var nextLink = false;
				var setLinks = new Array();
				for (i = 0; i < links.length; i++) {
					if (links[i].rel.indexOf(options.rel + "[" + set + "]") != -1) {
						setLinks[setLinks.length] = links[i];
					}
				}
				
				for (i = 0; i < setLinks.length; i++) {
					var link = setLinks[i];
					if ((link.href.indexOf(options.image) != -1) && (link.rel) && (link.rel.indexOf(options.rel != -1))) {
						if (i != 0)
							prevLink = setLinks[i - 1];
						if (i != setLinks.length - 1)
							nextLink = setLinks[i + 1];
					}
				}
				if ((prevLink != false) || (nextLink != false)) {
					if (box.getElements(".caption").length == 0) {
						var caption = document.createElement("div");
						caption.className = "caption";
						box.appendChild(caption);
					} else {
						var caption = box.getElements(".caption")[0];
					}
				}
				if (prevLink != false) {
					var previousButton = $(document.createElement("div"));
					previousButton.className = "previous";
					var prevCap = '';
					if (prevLink.title)
						prevCap = prevLink.title;
					var prevEl = prevLink;
					if (prevLink.getElements("img").length > 0)
						prevEl = prevLink.getElements("img")[0];
					previousButton.addEvent("click", function() {
						var newOptions = $unlink(options);
						var imagezoomPrev = new Imagezoom($extend(newOptions, {
							image: prevLink.href,
							caption: prevCap,
							rel: options.rel,
							startElement: prevEl,
							showCaptionBar: true
						}));
						instance.close();
						imagezoomPrev.show();
					});
					caption.appendChild(previousButton);
				}
				if (nextLink != false) {
					var nextButton = $(document.createElement("div"));
					nextButton.className = "next";
					var nextCap = '';
					if (nextLink.title)
						nextCap = nextLink.title;
					var nextEl = nextLink;
					if (nextLink.getElements("img").length > 0)
						nextEl = nextLink.getElements("img")[0];
					nextButton.addEvent("click", function() {
						var newOptions = $unlink(options);
						var imagezoomNext = new Imagezoom($extend(newOptions, {
							image: nextLink.href,
							caption: nextCap,
							rel: options.rel,
							startElement: nextEl,
							showCaptionBar: true
						}));
						instance.close();
						imagezoomNext.show();
					});
					
					caption.appendChild(nextButton);					
				}
			}
		}
		
		this.scanRel = function(where, needle, string) {
			var newstring = '';
			if (where == "after") {
				var startpos = string.indexOf(needle) + needle.length;
				var endpos = string.length;
			} else if (where == "before") {
				var startpos = 0;
				var endpos = string.indexOf(needle);
			}
			for (var i = startpos; i < endpos; i++) {
				newstring += string.charAt(i);
			}
			return newstring;
		}
		
		this.close = function(hideOverlay) {
			var img = box.getElements(".image")[0];
			box.removeChild(img);
			var close = box.getElements(".close")[0];
			box.removeChild(close);
			var caption = box.getElements(".caption");
			if (caption.length > 0)
				box.removeChild(caption[0]);
			var s = box.getElements(".s");
			for (var i = 0; i < s.length; i++)
				box.removeChild(s[i]);
			var x = options.x;
			var y = options.y;
			var boxWidth = options.initWidth;
			var boxHeight = options.initHeight;
			if (options.startElement != false) {
				var displayedImg=null;
				$("content_left").getElements('a').each(function(e){if(e.style.display!='none')displayedImg=e;});
				x=displayedImg.getPosition().x;//500;// options.startElement.getPosition().x;
				y=displayedImg.getPosition().y; //500;//options.startElement.getPosition().y;
				if(x==0 || y==0)
					{
						if($("flashholder"))
						{
							x=$("flashholder").getPosition().x;
							y=$("flashholder").getPosition().y;
						}
				}
				boxWidth = options.startElement.offsetWidth;
				boxHeight = options.startElement.offsetHeight;
			}
			if ((hideOverlay == true) && ($('imagezoom_overlay'))) {
				var oFx = new Fx.Morph($('imagezoom_overlay'), {duration: options.closeDuration});
				oFx.start({opacity: 0}).chain(function() {
					$$('body')[0].removeChild($('imagezoom_overlay'));
				});
			}
			var fx = new Fx.Morph(box, {duration: options.closeDuration});
			fx.start({
				left: x,
				top: y,
				width: boxWidth,
				height: boxHeight,
				opacity: options.startOpacity
			}).chain(function() {
				fx.start({
					opacity: 0
				}).chain(function() {
					$$('body')[0].removeChild(box);
				});
			});
		}	
	}

	var myImg;
	var myDuration
	var myBox;
	var arrTitles=new Array();
	var arrImageIndex=new Array();
	function moveImage(img,options,box)
	{
		myImg=img;
		myDuration=options.loadDelay;
		myBox=box;
		moveImageByDuration();
	}
	
	function moveImageByDuration()
	{
		if(((myBox.offsetHeight-myImg.offsetHeight-10)*1<parseInt(myImg.style.marginTop)*1))
			myImg.style.marginTop=(parseInt(myImg.style.marginTop)-1)+"px";
		if((parseInt(myImg.style.marginLeft)<0)){
			myImg.style.marginLeft=(parseInt(myImg.style.marginLeft)+1)+"px";
		}
		if(((myBox.offsetHeight-myImg.offsetHeight-10)*1<parseInt(myImg.style.marginTop)*1)){
			setTimeout("moveImageByDuration()",70);
			return;
		}
		if((parseInt(myImg.style.marginLeft)<0))
		 {
			 setTimeout("moveImageByDuration()",70);
			return;
		 }
	}
