/**
 * Lightbox 0.2
 * (c) 2009 Cyber Fox s.r.o.
 * 
 * Uses Dojo Toolkit to show images in lightbox style.
 *  
 */  
function LightBoxClass() {
	var self = this;
	
	this.elem = {};
	this.images = [];
	this.aImage = null;
	this.mediaLink = '';
	this.mediaLang = '';
	this.labelPhoto = '';

	this.show = function(e) {
		// no images loaded
		self.images = [];
		self.aImage = null;
		// finds images in the same group
		// not possible to use just 'a[rel="'+e.rel'+"]' because of IE6 and Opera
		// cannot parse ie rel="lightbox[grp]"
		var key = 0;
		dojo.query('a[rel^="lightbox"]').forEach(function(item) {
			if (item.rel === e.rel) {
				// saves images in array
				self.images.push({src:item.href,title:item.title});
				// gets actual image
				if (item === e) {
					self.aImage = key;
				}
				key++;
			}
		});
		// shows actual image
		self.updateImage();
	};

	this.prev = function() {
		if (self.aImage > 0) {
			self.aImage = self.aImage - 1;
			self.updateImage();
		}
		return;
	};

	this.next = function() {
		if (self.aImage < self.images.length-1) {
			self.aImage = self.aImage + 1;
			self.updateImage();
		}
		return;
	};

	this.close = function() {
		// hides overlay & lighbox
		dojo.addClass(self.elem.overlay,'hide');
		dojo.addClass(self.elem.lightbox,'hide');
	};

/*
	this.getPageSize = function() {
		var obj = dojo.coords(self.elem.overlay);
		return [obj.w,obj.h];
	}
*/

	this.updateImage = function() {
		this.preload = function(img) {
			// shows preloader
			dojo.addClass(self.elem.img,'preloading');
			// preloads image
			var image = new Image();
			// shows image when ready
			image.onload = function() {
				// updates image
				self.elem.img.src = image.src;
				// updates title
				self.elem.caption.innerHTML = self.images[self.aImage].title;
				// updates number of images
				self.elem.number.innerHTML = self.labelPhoto+' '+(self.aImage+1)+'/'+self.images.length;
				// shows link to previous image
				if (self.aImage === 0) {
					dojo.addClass(self.elem.prev,'hide');
				} else {
					dojo.removeClass(self.elem.prev,'hide');
				}
				// shows link to next image
				if (self.aImage === self.images.length-1) {
					dojo.addClass(self.elem.next,'hide');
				} else {
					dojo.removeClass(self.elem.next,'hide');
				}
				// hides preloader
				dojo.removeClass(self.elem.img,'preloading');
				// shows overlay & lighbox
				dojo.removeClass(self.elem.overlay,'hide');
				dojo.removeClass(self.elem.lightbox,'hide');
				// center lightbox on the screen
				self.centerLightbox();
			};
			image.src = img;
		};
		this.preload(self.images[self.aImage].src);
	};

	// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
	this.getPageSize = function() {
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
	    //Non-IE
	    myWidth = window.innerWidth;
	    myHeight = window.innerHeight;
	  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
	    //IE 6+ in 'standards compliant mode'
	    myWidth = document.documentElement.clientWidth;
	    myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
	    //IE 4 compatible
	    myWidth = document.body.clientWidth;
	    myHeight = document.body.clientHeight;
	  }
		return [myWidth,myHeight];
	}

	// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
	this.getPageScroll = function() {
	  var scrOfX = 0, scrOfY = 0;
	  if( typeof( window.pageYOffset ) == 'number' ) {
	    //Netscape compliant
	    scrOfY = window.pageYOffset;
	    scrOfX = window.pageXOffset;
	  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
	    //DOM compliant
	    scrOfY = document.body.scrollTop;
	    scrOfX = document.body.scrollLeft;
	  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
	    //IE6 standards compliant mode
	    scrOfY = document.documentElement.scrollTop;
	    scrOfX = document.documentElement.scrollLeft;
	  }
	  return [ scrOfX, scrOfY ];
	}

	// lightbox size
	this.getLBSize = function() {
		var coords = dojo.coords(self.elem.img);
		return [coords.w,coords.h];
	}

	// centers lightbox on the screen
	this.centerLightbox = function() {
		var pageScroll = self.getPageScroll();
		var pageSize = self.getPageSize();
		var LBsize = self.getLBSize();
		if (LBsize[0]<pageSize[0]) {
			var left = pageScroll[0] + pageSize[0]/2 - LBsize[0]/2;
		} else {
			var left = pageScroll[0];
		}
		if (LBsize[1]<pageSize[1]) {
			var top = pageScroll[1] + pageSize[1]/2 - LBsize[1]/2;
		} else {
			var top = pageScroll[1];
		}
		// set width and height because of IE6
		dojo.style(self.elem.lightbox,{width:LBsize[0]+'px',left:left+'px',top:top+'px'});
		dojo.style(self.elem.imagebox,{height:LBsize[1]+'px'});
	}

	// init
	this.init = function(initParamsObject) {
	  // set params
    for (var x in initParamsObject) {
      self[x] = initParamsObject[x];
    }
		// creates lighbox HTML
		dojo.place('<div id="lightbox-overlay" class="hide"></div><div id="lightbox" class="hide"><div class="infobox"><a href="#" class="close"></a><span class="caption"></span><span class="number"></span></div><div class="imagebox"><img class="img" /><a href="#" class="prev"></a><a href="#" class="next"></a></div></div>',dojo.body(),'first');
		// gets elements
		self.elem = {
			overlay: dojo.byId('lightbox-overlay'),
			lightbox: dojo.byId('lightbox'),
			imagebox: dojo.query('#lightbox .imagebox')[0],
			close: dojo.query('#lightbox a.close')[0],
			prev: dojo.query('#lightbox a.prev')[0],
			next: dojo.query('#lightbox a.next')[0],
			caption: dojo.query('#lightbox .caption')[0],
			number: dojo.query('#lightbox .number')[0],
			img: dojo.query('#lightbox .img')[0]
		};
    // adding css styles
    var headElem = document.getElementsByTagName('head')[0];
    dojo.create('link', {type:'text/css', rel:'stylesheet', href:(self.mediaLink+'lightbox.css')}, headElem, 'last');
		if (self.mediaLang!='') {
      var styleDef = '';
      styleDef+= '#lightbox .infobox a.close {background-image:url('+self.mediaLink+'close_label_'+self.mediaLang+'.gif) !important;} ';
      styleDef+= '#lightbox .imagebox a.prev:hover {background-image:url('+self.mediaLink+'prev_label_'+self.mediaLang+'.gif) !important;} ';
      styleDef+= '#lightbox .imagebox a.next:hover {background-image:url('+self.mediaLink+'next_label_'+self.mediaLang+'.gif) !important;} ';
      dojo.create('div', {innerHTML:'<input type="hidden" /><style type="text/css">'+styleDef+'</style>'}, self.elem.lightbox, 'first');
    }
		// handles lighbox events
		dojo.query('#lightbox-overlay,#lightbox').connect('onclick',function(evt) {
			switch(evt.target) {
				case self.elem.overlay:
				case self.elem.close:
				case self.elem.img:
					self.close();
					break;
				case self.elem.prev:
					self.prev();
					break;
				case self.elem.next:
					self.next();
					break;
			}
			dojo.stopEvent(evt);
		});
		// handles keyboard events
		dojo.connect(dojo.doc,'onkeyup',function(evt) {
			switch(evt.keyCode) {
				case dojo.keys.LEFT_ARROW:
					self.prev();
					break;
				case dojo.keys.RIGHT_ARROW:
					self.next();
					break;
				case dojo.keys.ESCAPE:
					self.close();
					break;
			}
			dojo.stopEvent(evt);
		});
		// on page resize
		dojo.connect(window,'onresize',function() {
			if (!dojo.hasClass(self.elem.lightbox,'hide')) {
				self.centerLightbox();
			}
		});
		// on page scroll
		dojo.connect(window,'onscroll',function() {
			if (!dojo.hasClass(self.elem.lightbox,'hide')) {
				self.centerLightbox();
			}
		});
		// handles onclick
		dojo.query('a[rel^="lightbox"]').connect('onclick',function(evt) {
			self.show(this);
			dojo.stopEvent(evt);
		});
	};

	// constructor
	return function() {
		// initialize lighbox
		//self.init({});
	}();
}


