/*

*/

function mimiGallery() {
    var self = this;

    var hSysEventPointer = null;
    var hBody = document.getElementsByTagName("body")[0];
    var hBackgroundLayer = null;
    var hFullscreenParent = null;
    var hFullscreenImageObject = null;
    var hFullscreenImageControls = null;

    var imagesFilesRefs = new Array();
    var imagesCollection = new Array();

    var resCurrentGalleryHolder = null;
    var resImgdb_base = "/imgdb/resdb_";
    var resDocumentHeight = null;     
    var resLastFileRef = null;
    var resLastImage = null;
    var resLastActiveImage = null;

    var galleryRoot = null;
    var galleryParent = null;
    var imageCounter = -1;

    var hNaviLeft = null;
    var hNaviRight = null;
    // Properties
    
    // Methods
    this.setBackgroundLayer = function(objectRef) {
	hBackgroundLayer = objectRef;
    }
    
    this.lastImage = function() {
	return resLastImage;
    }
    
    this.setBase = function(basestring) {
	resImgdb_base = basestring;
    }
    
    this.addImage = function(imageLink) {
	imagesFilesRefs.push(imageLink);
	resLastFileRef = imageLink;
	var active = addActiveImageObject(imageLink);
	resLastActiveImage = active;
	resLastImage = addImageObject(imageLink, active);
	imagesCollection.push(resLastImage);
	
	addImageToRoot(resLastImage);
    }

    this.cacheAll = function() {
	var i = 0;
	for (i = 0; i<=imagesFilesRefs.length; i++) {
	    cacheImage(imagesFilesRefs[i]);
	}
	
    }

    this.attach = function(objectRef) {
//	objectRef.appendChild(hNaviLeft);
	objectRef.appendChild(galleryRoot);
	resCurrentGalleryHolder = objectRef;
	setBackgroundLayerHeight();
    }

    this.deattach = function() {
	resCurrentGalleryHolder.removeChild(galleryRoot);
    }

    this.destroy = function() {
	var i = 0;
	for (i=0; i<=imagesCollection.length-1; i++) {
	    var currentImage = imagesCollection[i];
	    hBody.removeChild(currentImage.myActiveRef);
	}
    }

    
    // Private methods
    var viewFullscreen = function(activeImagePtr) {
	showBackgroundLayer();
	cleanupFullscreenObjects();
	hBody.appendChild(setupFullscreenObjects(activeImagePtr));
	hFullscreenParent.appendChild(createFullscreenImageControls(hFullscreenImageObject));
    }

    var finishFullscreen = function() {
	cleanupFullscreenObjects();
	hideBackgroundLayer();
    }

    var setupFullscreenObjects = function(activeImagePtr) {
	hFullscreenParent = createFullscreenRoot();
	hFullscreenImageObject = createFullscreenImage(activeImagePtr);

	hFullscreenParent.appendChild(hFullscreenImageObject);
	return hFullscreenParent;
    }    

    var loadFullscreenImage = function(imageObjectRef) {
	if (hFullscreenImageObject) {
	    hFullscreenImageObject.src = imageObjectRef;
	}
    }
        
    var cleanupFullscreenObjects = function() {
	if (hFullscreenParent) {
	    hBody.removeChild(hFullscreenParent);
	    if (hFullscreenImageObject) {
		hFullscreenParent.removeChild(hFullscreenImageObject);
		hFullscreenImageObject = null;
	    }
	    hFullscreenParent = null;
	}
    }

    var findPosition = function(objectRef) {
	return findPos(objectRef);
    }

    var getDocumentHeight = function() {
	return getHeight()+"px";
    }    

    var setBackgroundLayerHeight = function() {
	if (hBackgroundLayer) {
	    hBackgroundLayer.style.height = getDocumentHeight();
	}
    }
    
    var showBackgroundLayer = function() {
	if (hBackgroundLayer) {
	    hBackgroundLayer.style.visibility = "visible";
	}
    }

    var hideBackgroundLayer = function() {
	if (hBackgroundLayer) {
	    hBackgroundLayer.style.visibility = "hidden";
	}
    }
    
    var createGalleryRoot = function() {
	var parent = document.createElement("div");
	parent.className = "mimiGallery_parent";
	return parent;
    }

    var createFullscreenRoot = function() {
	var parent = document.createElement("div");
	parent.className = "mimiGallery_imageFullscreen";
	parent.style.top = (25 + getScrollY()) + "px";
	return parent;
    }

    var createFullscreenImage = function(imageObjectRef) {
	var img = document.createElement("img");
	img.src = imageObjectRef.fullscreenImageFilename;
	return img;
    }

    var selectPrev = function() {
	if (resLastActiveImage.prevptr) {
	    resLastActiveImage = resLastActiveImage.prevptr;
	    loadFullscreenImage(resLastActiveImage.fullscreenImageFilename);
	}
    }
    
    var selectNext = function() {
	if (resLastActiveImage.nextptr) {
	    resLastActiveImage = resLastActiveImage.nextptr;
	    loadFullscreenImage(resLastActiveImage.fullscreenImageFilename);
	}
    }
    
    var createFullscreenImageControls = function(holder) {
	var controls = document.createElement("div");
	controls.className = "mimiGallery_imageControls";
	controls.style.left = (findPosition(holder)[0]+35)+"px";

	var controlPrev = document.createElement("div");
	var img = document.createElement("img");
	img.src = "/images/ctrlLeftArr.gif";
	controlPrev.appendChild(img);

	var controlNext = document.createElement("div");
	var img = document.createElement("img");
	img.src = "/images/ctrlRightArr.gif";
	controlNext.appendChild(img);

	var controlClose = document.createElement("div");
	var img = document.createElement("img");
	img.src = "/images/ctrlClose.gif";
	controlClose.appendChild(img);

	controlPrev.onclick = function() {
	    selectPrev();
	}

	controlNext.onclick = function() {
	    selectNext();
	}
	
	controlClose.onclick = function() {
	    finishFullscreen();
	}

	
	controls.appendChild(controlPrev);
	controls.appendChild(controlNext);
	controls.appendChild(controlClose);

	hFullscreenImageControls = controls;
	return controls;
    }

    var addImageToRoot = function(imageObjectRef) {
	galleryParent.style.width = imageCounter * 240 + "px";
	galleryParent.appendChild(imageObjectRef);
    }
        
    var addImageObject = function(imageLink, activeImageObject) {
	imageCounter++;
	var img = document.createElement("img");
	img.src = resImgdb_base + imageLink + "_smallest.jpg";
	img.className = "mimiGallery_imageThumb";
	img.myActiveRef = activeImageObject;

	img.onmouseover = function() {
	    var shift = galleryRoot.scrollLeft;
	    this.myActiveRef.style.left = (findPosition(this)[0]-35-shift)+"px";
	    this.myActiveRef.style.top = (findPosition(this)[1]-20)+"px";
	    this.myActiveRef.style.visibility = "visible";
	    
	}
	
	img.onmouseout = function() {
	    this.myActiveRef.style.visibility = "hidden";
	}

	return img;
    }
    
    var addActiveImageObject = function(imageLink) {
	var img = document.createElement("img");
	img.src = resImgdb_base + imageLink + "_small.jpg";
	img.fullscreenImageFilename = resImgdb_base + imageLink + "_big.jpg";
	img.className = "mimiGallery_imageThumb_active";
	img.onmouseover = function() {
	    this.style.visibility = "visible";
	}
	img.onmouseout = function() {
	    this.style.visibility = "hidden";
	}
	img.onclick = function() {
	    this.style.visibility = "hidden";
	    resLastActiveImage = this;
	    viewFullscreen(this);
	}
	hBody.appendChild(img);
	if (resLastActiveImage) {
	    img.prevptr = resLastActiveImage;
	    resLastActiveImage.nextptr = img;
	}
	resLastActiveImage = img;
	return img;
    }
    
    var cacheImage = function(filename) {
	var cacheObject = document.createElement("img");
	cacheObject.src = resImgdb_base + filename + "_small.jpg";
	cacheObject.src = resImgdb_base + filename + "_normal.jpg";
	cacheObject = null;
    }

    this._init = function() {
	galleryRoot = createGalleryRoot();
	galleryParent = document.createElement("div");
	hNaviLeft = document.createElement("div");
	hNaviLeft.className = "mimiGallery_navi";
	hNaviLeft.innerHTML = "&larr;";
	hNaviRight = document.createElement("div");
	hNaviRight.className = "mimiGallery_navi";
	hNaviRight.innerHTML = "&rarr;";

	galleryRoot.appendChild(galleryParent);
    }

    // Constructor call    
    this._init();

    // End of class
}