	var jjthumb;
	var jjzoom;
	var ac = 0;
	var lastclick;
	var ivalue; 
	var ev_ms = false;
	var offset;
	var newpos = { left:0, top:0 };		
	var newzoom = { "left":0, "top":0, "scale":1, "width":0 };		
	var oldzoom = { "left":0, "top":0, "width":0  };		


	$e = function(id) {
		return (document.getElementById) ? document.getElementById(id): document.all[id];
	}
	
	$t = function(tag, obj) {
		if (obj) {
			return jjthumb.getElementsByTagName(tag);
		} else {	
			return document.getElementsByTagName(tag);
		}	
	}
	
	$eve = function(ev) {
		ev = ev || window.event ;
		return ev.target || ev.srcElement;
	}

	$a = function(vobj,attrib) {
		if (typeof(vobj) != "object") {
			return $e(vobj).getAttribute(attrib);
		} else {	
			return vjjthumb.getAttribute(attrib);
		}
	}	

function getDocElementById(id) {
	return (document.getElementbyId) ? document.getElementById(id): document.all[id];
}

	
	function initJJThumb(jjthumb) {
		jjzoom = $e(jjthumb.getAttribute("zoomid"));
		for(var i=0;i < jjthumb.childNodes.length; i= i + 1) {
			if (jjthumb.childNodes[i].className == "jjthumb_box") {
				jjthumb.box = jjthumb.childNodes[i];
			} 	
			if (jjthumb.childNodes[i].className == "jjthumb_img") {
				jjthumb.img = jjthumb.childNodes[i];
			} 	
		}
		jjthumb.initialized = true;
		if (!jjzoom.initialized) initJJZoom(jjzoom);
	}

	function activeJJThumb(ev) {
		ev = window.event || ev;
		jjthumb = ev.srcElement || ev.target;
		jjthumb = getParentClass(jjthumb,"jjthumb");
		if (!(jjthumb.initialized)) {
			initJJThumb(jjthumb);
		}
		oldmouseX = ev.pageX || ev.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
		oldmouseY = ev.pageY || ev.clientY + (document.body.scrollTop || document.documentElement.scrollTop); 
		newpos.left = oldmouseX - absLeft(jjthumb.img) - jjthumb.box.offsetWidth/2;
		newpos.top = oldmouseY - absTop(jjthumb.img) - jjthumb.box.offsetHeight/2;
		newpos = chkmaxmin(jjthumb, newpos); 
		jjthumb.box.style.left = newpos.left + "px";
		jjthumb.box.style.top = newpos.top + "px";
		refreshJJZoom(jjthumb,newpos);
		if (document.addEventListener) {
			//Firefox
			jjthumb.addEventListener("mousemove", moveJJThumb, true);
			jjthumb.addEventListener("mouseup", stopJJThumb, true);
			jjthumb.box.addEventListener("mouseout", stopJJThumb, true);
		}
		else if (document.attachEvent) {
			//IE
			document.attachEvent("onmousemove", moveJJThumb);
			document.attachEvent("onmouseup", stopJJThumb);
		}
		if (ev.preventDefault) { ev.preventDefault() }
		return
	}
	
	
	function moveJJThumb(ev) {
		if (ev_ms) { return; };
		ev_ms = true;
		ev = window.event || ev;
		mouseX = ev.pageX || ev.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
		mouseY = ev.pageY || ev.clientY + (document.body.scrollTop || document.documentElement.scrollTop); 
		//mouseX = ev.clientX+ document.body.scrollLeft;
		//mouseY = ev.clientY+ document.body.scrollTop;
		offsetX = mouseX - oldmouseX;
		offsetY = mouseY - oldmouseY;
		oldmouseX = mouseX;
		oldmouseY = mouseY;
		if (offsetX != 0 || offsetY != 0) {
			// check for min and max
			newpos.left = parseInt(jjthumb.box.style.left) + offsetX;
			newpos.top = parseInt(jjthumb.box.style.top) + offsetY;
			newpos = chkmaxmin(jjthumb, newpos);
			jjthumb.box.style.left = newpos.left + "px"
			jjthumb.box.style.top = newpos.top + "px"
			refreshJJZoom(jjthumb, newpos);
		}
		ev_ms = false;
		return false;
	}
	
	function stopJJThumb(e) {
		if (document.removeEventListener) { // Remove event listeners from 'document' (W3C).
			jjthumb.removeEventListener('mousemove', moveJJThumb, true)
			jjthumb.removeEventListener('mouseup', stopJJThumb, true)
			jjthumb.box.removeEventListener('mouseout', stopJJThumb, true)
		}
		else if (document.detachEvent) { // Remove event listeners from 'document' (IE).
			document.detachEvent('onmousemove', moveJJThumb);
			document.detachEvent('onmouseup', stopJJThumb);
			
		}
		action = jjthumb.getAttribute("action");
		if (action) {
			eval(action);
		}	
	}	

	function chkmaxmin (obj, pos) {
		if (pos.left < 0 ) {
			pos.left = 0;
		} else if (pos.left > obj.img.offsetWidth - obj.box.offsetWidth) { 
			pos.left = obj.img.offsetWidth - obj.box.offsetWidth;
		} 
		if (pos.top < 0 ) {
			pos.top = 0;
		} else if (pos.top > obj.img.offsetHeight - obj.box.offsetHeight) { 
			pos.top = obj.img.offsetHeight - obj.box.offsetHeight;
		} 
		return pos;
	}

	
	function refreshJJZoom(jjthumb, pos) {
		zoomimgleft = pos.left * jjzoom.zoomfactor;	
		zoomimgheight = pos.top * jjzoom.zoomfactor;		
		jjzoom.img.style.left = -zoomimgleft + "px"
		jjzoom.img.style.top = -zoomimgheight + "px"
		jjzoom.imgswap.style.left = -zoomimgleft + "px"
		jjzoom.imgswap.style.top = -zoomimgheight + "px"

	}	

	function initJJZoom(jjzoom) {
		for(var i=0;i < jjzoom.childNodes.length; i= i + 1) {
			if (jjzoom.childNodes[i].className == "jjzoom_img") {
				jjzoom.img = jjzoom.childNodes[i];
			} 	
			if (jjzoom.childNodes[i].className == "jjzoom_imgswap") {
				jjzoom.imgswap = jjzoom.childNodes[i];
			} 	
		}
		jjzoom.initialized = true;
		jjthumb = $e(jjzoom.getAttribute("thumbid"));
		if (!jjthumb.initialized) initJJThumb(jjthumb);
		jjzoom.zoomfactor = jjzoom.img.clientWidth/jjthumb.img.clientWidth;
   		id = "a" + jjzoom.id
		azoom = eval(id)
		azoom.imgfile = jjzoom.img.getAttribute("imgfile");
		azoom.imgpath = jjzoom.img.getAttribute("imgpath");
		jjzoom.preimg = new Image();
		jjzoom.preimg.fail = false;
		

	}

	function activeJJZoom(ev) {
		ev = window.event || ev;
		//fix doubleclick for FireFox
		var d = new Date();		
		ct1 = d.getTime();
		if (lastclick) {
			if (ct1- lastclick < 300) { 	
				slidedblclick();
				return;
			}
		}
		lastclick =  ct1
		//fix
		jjzoom = getParentClass(ev.srcElement || ev.target,"jjzoom");
		if (!(jjzoom.initialized)) {
			initJJZoom(jjzoom);
		}
		oldmouseX = ev.clientX + document.body.scrollLeft;
		oldmouseY = ev.clientY + document.body.scrollTop;
		if (document.addEventListener) {
			//Firefox
			document.addEventListener("mousemove", moveJJZoom, true);
			document.addEventListener("mouseup", stopJJZoom, true);
			//jjzoom.addEventListener("mouseout", stopJJZoom, true);
		}
		else if (document.attachEvent) {
			//IE
			jjzoom.attachEvent("onmousemove", moveJJZoom);
			jjzoom.attachEvent("onmouseup", stopJJZoom);
		}
		if (ev.preventDefault) { ev.preventDefault()};
		return
	}
	
	function moveJJZoom(ev) {
		if (ev_ms) { return; };
		ev_ms = true;
		ev = window.event || ev;
		mouseX = ev.clientX+ document.body.scrollLeft;
		mouseY = ev.clientY+ document.body.scrollTop;
		offsetX = mouseX - oldmouseX;
		offsetY = mouseY - oldmouseY;
		oldmouseX = mouseX;
		oldmouseY = mouseY;

		if (offsetX != 0 || offsetY != 0) {
			// check for min and max
			newpos.left = jjzoom.img.offsetLeft + offsetX;
			newpos.top = jjzoom.img.offsetTop + offsetY;
			newpos = chkmaxminJJZoom(jjzoom, newpos);
			jjzoom.img.style.left = newpos.left + "px"
			jjzoom.img.style.top = newpos.top + "px"
			jjzoom.imgswap.style.left = newpos.left + "px"
			jjzoom.imgswap.style.top = newpos.top + "px"

			refreshJJThumb(jjzoom, newpos)
		}
		ev_ms = false;
		return false;
	}
	
	function stopJJZoom(ev) {

		if (document.removeEventListener) { // Remove event listeners from 'document' (W3C).
			document.removeEventListener('mousemove', moveJJZoom, true)
			document.removeEventListener('mouseup', stopJJZoom, true)
			//jjzoom.removeEventListener('mouseout', stopJJZoom, true)
			
		}
		else if (document.detachEvent) { // Remove event listeners from 'document' (IE).
			jjzoom.detachEvent('onmousemove', moveJJZoom);
			jjzoom.detachEvent('onmouseup', stopJJZoom);
		}
		action = jjzoom.getAttribute("action");
		if (action) {
			eval(action);
		}
	}	
	
	function refreshJJThumb(jjzoom, pos) {
		var imgleft = pos.left / jjzoom.zoomfactor;	
		var imgheight = pos.top / jjzoom.zoomfactor;		
		jjthumb.box.style.left = - imgleft + "px"
		jjthumb.box.style.top = - imgheight + "px"
	}
	
	function chkmaxminJJZoom(obj, pos) {
		if (pos.left > 0 ) {
			pos.left = 0;
		} else if (pos.left < obj.offsetWidth - obj.img.offsetWidth) { 
			pos.left = obj.offsetWidth - obj.img.offsetWidth; 
		} 
		if (pos.top > 0 ) {
			pos.top = 0;
		} else if (pos.top < obj.offsetHeight - obj.imgswap.offsetHeight) { 
			pos.top = obj.offsetHeight - obj.imgswap.offsetHeight;
		} 
		return pos;
	}
	
	
	function JJZoom(id,zoomdir) {
		jjzoom = $e(id);
		if (!jjzoom.initialized) initJJZoom(jjzoom);
//		id = "a" + id
//		azoom = eval(id);
		oldzoom = azoom.zoom[azoom.zoomvalue];
		newzoomvalue = azoom.zoomvalue + zoomdir;
		newzoomvalue = (newzoomvalue < 0) ? 0 : newzoomvalue;
		newzoomvalue = (newzoomvalue > azoom.zoom.length-1) ? azoom.zoom.length-1 : newzoomvalue;
		newzoom = azoom.zoom[newzoomvalue];
		azoom.zoomvalue = newzoomvalue;
		oldzoom.left = jjzoom.img.offsetLeft;
		oldzoom.top = jjzoom.img.offsetTop;
		oldzoom.width = jjzoom.img.clientWidth;

		scaling = newzoom.imgwidth/oldzoom.imgwidth;
		newzoom.left = (oldzoom.left - jjzoom.clientWidth/2) * scaling + jjzoom.clientWidth/2;
		newzoom.top = (oldzoom.top - jjzoom.clientHeight/2 )* scaling + jjzoom.clientHeight/2 ;
		jjzoom.img.style.left = newzoom.left + "px";
		jjzoom.img.style.top = newzoom.top + "px";
		jjzoom.img.style.width = newzoom.imgwidth + "px";
		jjzoom.zoomfactor = jjzoom.img.clientWidth/jjthumb.img.clientWidth;
		
		refreshJJThumb(jjzoom,newzoom);
		jjthumb.box.style.width = jjthumb.box.clientWidth / scaling + "px";
		jjthumb.box.style.height = jjthumb.box.clientHeight / scaling + "px";

		jjzoom.imgswap.style.left = jjzoom.img.style.left;
		jjzoom.imgswap.style.top = jjzoom.img.style.top;
		jjzoom.imgswap.style.width = jjzoom.img.style.width;
		if (!jjzoom.preimg.fail) {
			jjzoom.imgswap.src= jjzoom.img.src
		}
		loadImage( azoom.imgpath + azoom.imgfile+newzoom.imgzext + "." + azoom.imgtype);
	}	

	function loadImage(imgsrc) {
		// onerror not fire for local file;
   		jjzoom.preimg = new Image();
		jjzoom.preimg.fail = false;
		jjzoom.preimg.src = imgsrc;
	    jjzoom.preimg.onerror = function() { jjzoom.preimg.fail = true;};
        jjzoom.preimg.onLoad = swapImage(imgsrc);
	} 
	
	function swapImage(imgsrc) {
		jjzoom.img.style.display = "none";
		jjzoom.img.src = imgsrc;
		changeOpac(0,"img1");
		setTimeout('$e("img1").style.display = "block"',1);
		opacity("img1",0,100,500);
	}	
	
	
	
	
	function valueof(v) {
		value = parseFloat(v);
		if (isNaN(v)) {
			v = v.replace("$","");
			return parseFloat(v);		
		}
		return value;
	}	
	
	function absLeft(e) {
		absleft = 0	
		do {
			absleft += e.offsetLeft;
		} while (e=e.offsetParent);

		return absleft;	
	}
	
	function absTop(e) {
		abstop = 0	
		do {
			abstop += e.offsetTop;
		} while (e=e.offsetParent);

		return abstop;	
	}
	
	function innerWidth(e) {
		
	}	
	
	function getParentClass(e, classname) {
		var cont = true;
		do {
			if (e.className == classname) {
				cont = false;
			} else {
				e = e.parentNode;	  
			}	
	    } while (cont); 
	    return e
	}	
	

	
	//Graphic effect
	
function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 100);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")"; 
}    
