﻿var __lb={};
__lb.Union=function(){var args=__lb.ToArr(arguments),ret={};for(var i=0; i<args.length;i++)for(n in args[i])ret[n]=(!ret[n]&&typeof(ret[n])!='boolean')?args[i][n]:ret[n];return ret;};
__lb.ToArr=function(itr){if (!itr) return [];var rsls=[]; for(var i=0;i<itr.length;i++)rsls.push(itr[i]); return rsls;};
__lb.SetPpt=function(obj, ppt){var args=__lb.ToArr(arguments);var obj=args[0];var ppts=args.slice(1);for(var i=0; i<ppts.length; i++){var ppt = ppts[i];for(p in ppt){try{if(p=="style")__lb.SetPpt(obj.style, ppt[p]);else obj[p] = ppt[p];}catch(e){}}}};
__lb.AddEvt = function(obj, evType, fn){if(obj.addEventListener){obj.addEventListener(evType, fn, false);return true;}else if (obj.attachEvent){var r = obj.attachEvent("on"+evType, fn); return r;}else {return false;}};
__lb.RmvEvt = function(obj, evType, fn){if(obj.removeEvtListener){obj.removeEvtListener(evType, fn, false);return true;}else if (obj.detachEvent){var r = obj.detachEvent("on"+evType, fn); return r;}else {return false;}};
Function.prototype.lbBind=function(){var mtd=this; var args=__lb.ToArr(arguments); var object=args.shift();return function(){return mtd.apply(object, args.concat(__lb.ToArr(arguments)));}};

__lb.getPageScroll = function(){
	var yScroll, xScroll;
	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
		xScroll = self.pageXOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
		xScroll = document.documentElement.scrollLeft;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
		xScroll = document.body.scrollLeft;
	}
	return {'xScroll':xScroll, 'yScroll':yScroll};
}

__lb.getPageSize = function(){
	
	var xScroll, yScroll;
	yScroll=(window.innerHeight && window.scrollMaxY)?window.innerHeight + window.scrollMaxY:(document.body.scrollHeight > document.body.offsetHeight)?document.body.scrollHeight:document.body.offsetHeight;
	xScroll=(window.innerWidth  && window.scrollMaxX)?window.innerWidth  + window.scrollMaxX:(document.body.scrollWidth  > document.body.offsetWidth) ?document.body.scrollWidth :document.body.offsetWidth;
	
	yScroll+=(document.body.topMargin?new Number(document.body.topMargin)+15:0);
	xScroll+=(document.body.leftMargin?new Number(document.body.leftMargin):0);
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}

	return {'pageWidth':pageWidth, 'pageHeight':pageHeight, 'windowWidth':windowWidth, 'windowHeight':windowHeight}
}


__lb.pause = function (numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}


__lb.listenEscKey = function(e){
    var evt = (e?e:event);
	if(evt.keyCode == 27){ __lb.hideAll(); }
}

__lb.addListenEscKey = function(){__lb.AddEvt(document, "keypress", __lb.listenEscKey);}
__lb.removeListenEscKey = function(){__lb.RmvEvt(document, "keypress", __lb.listenEscKey);}


__lb.startLightbox = function(render, opts)
{    
   __lb.showOverlay(opts);
   __lb.showLoadingImage(opts);
   __lb.Div["lightbox"].innerHTML="";
   render(this, __lb.Div["lightbox"]);
}


__lb.showLightbox = function()
{
	var pageSize = __lb.getPageSize();
	var pageScroll = __lb.getPageScroll();
	var objLightbox = __lb.Div["lightbox"];

	__lb.SetPpt(objLightbox, {style:{display:'block'}});
	
	var lightboxTop = pageScroll.yScroll + ((pageSize.windowHeight - 35 - objLightbox.clientHeight) / 2);
	var lightboxLeft = parseInt((pageSize.pageWidth - 20 - objLightbox.clientWidth) / 2);	
	
	__lb.SetPpt(objLightbox, {style:{top:(lightboxTop < 0) ? "0px" : lightboxTop + "px", left:(lightboxLeft < 0) ? "0px" : lightboxLeft + "px"}});
}


__lb.showLoadingImage = function(opts)
{
	if (opts.showingLoadingImage) {
	  var pageSize = __lb.getPageSize();
	  var pageScroll = __lb.getPageScroll();
	  var objLoadingImage = __lb.Div["loadingImage"];
	  if(!objLoadingImage)return;
	   __lb.SetPpt(objLoadingImage, {src:opts.loadingImage, style:{display:'block'}});
	   __lb.SetPpt(objLoadingImage, {src:opts.loadingImage, style:{
	     top:(pageScroll.yScroll + ((pageSize.windowHeight - 35 - objLoadingImage.clientHeight) / 2) + 'px'), 
	     left:(pageScroll.xScroll +((pageSize.windowWidth - 20 - objLoadingImage.clientWidth) / 2) + 'px')}})
	}
}

__lb.showOverlay = function(opts)
{
	var pageSize = __lb.getPageSize();
	var objOverlay = __lb.Div["overlay"];
	if(!objOverlay)return;
	__lb.removeListenEscKey();
	if(opts.offByEscKey){
	  __lb.addListenEscKey();
	}
	__lb.SetPpt(objOverlay, {onclick:(opts.offByOverlay?function(){__lb.hideAll(); return false;}:null), style:{backgroundColor:opts.backgroundColor, filter:"alpha(opacity=" + opts.opacity + ")", opacity:opts.opacity/100, position:'absolute', top:'0px', left:'0px', zIndex:'190'}});
	__lb.SetPpt(objOverlay, {style:{height:(pageSize.pageHeight + 'px'), width:pageSize.pageWidth+'px', display:'block'}});
}

__lb.hideLightbox = function()
{
  if(__lb.Div["lightbox"])
	__lb.Div["lightbox"].style.display = 'none';
}

__lb.hideOverlay = function()
{
  if(__lb.Div["overlay"])
    __lb.Div["overlay"].style.display = 'none';
}

__lb.hideLoadingImage = function()
{
  if(__lb.Div["loadingImage"])
    __lb.Div["loadingImage"].style.display = 'none';
}

__lb.hideAll = function()
{
  __lb.hideLoadingImage();
  __lb.hideOverlay();  
  __lb.hideLightbox();
}

__lb.initLightbox = function()
{
    if(document.attachEvent && document.readyState != "complete")return;
    
	var objBody = document.getElementsByTagName("body").item(0);
	
	var objOverlay = document.createElement("iframe");
	__lb.SetPpt(objOverlay, {style:{display:'none', position:'absolute', top:'0px', left:'0px'}});
	objBody.insertBefore(objOverlay, objBody.firstChild);
	
	// preload and create loader image	
	var objLoadingImage = document.createElement("img");
	__lb.SetPpt(objLoadingImage, {style:{position:'absolute', zIndex:250, display:'none'}})
	//objOverlay.appendChild(objLoadingImage);
	objBody.insertBefore(objLoadingImage, objOverlay.nextSibling);
	
	// create lightbox div, same note about styles as above
	var objLightbox = document.createElement("div");
	__lb.SetPpt(objLightbox, {style:{ display:'none', position:'absolute', zIndex:260}});
	objBody.insertBefore(objLightbox, objOverlay.nextSibling);
			
	__lb.Div["overlay"] = objOverlay;
	__lb.Div["loadingImage"] = objLoadingImage;
	__lb.Div["lightbox"] = objLightbox;
	

}

__lb.Div={};
__lb.IsIE = (window.navigator.appName.toLowerCase().indexOf("microsoft")>=0);
__lb.AddEvt(__lb.IsIE?document:window, __lb.IsIE?"readystatechange":"load", __lb.initLightbox);

var LightBox = function(tar, render, option)
{
   this.Opts = __lb.Union(option, {loadingImage:'loading.gif', showingLoadingImage:true, backgroundColor:'gray', opacity:85, offByOverlay:true, offByEscKey:false});

   this.Hide = function()
   {
      __lb.hideAll();
   }
   
   this.Show = function()
   {
     __lb.hideLoadingImage();
     __lb.showLightbox();
   }
   
   if(this.Opts.loadingImage!=''){new Image().src=this.Opts.loadingImage;};
   
   __lb.AddEvt(tar, "click", __lb.startLightbox.lbBind(this, render, this.Opts));
}

var LoadingWait = function(option)
{
   this.Opts = __lb.Union(option, {loadingImage:'loading.gif', showingLoadingImage:true, backgroundColor:'gray', opacity:85, offByOverlay:false, offByEscKey:true});

   this.Hide = function(opts)
   {
      __lb.hideAll();
   }.lbBind(this, this.Opts);
   
   this.Show = function(opts)
   {
     __lb.hideLightbox();
     __lb.showOverlay(opts);
     __lb.showLoadingImage(opts);
   }.lbBind(this, this.Opts);
   
}

