/**
 * GalleryPress
 * Handles XML Based Gallery
 * 
 * Version 1.0
 * Created 08/03/2010
 *
 * Author: henworx-ASA 
 * URL: http://www.henworx.de/
 *
 */
 
var henworx={};
henworx.GalleryWorx=function(config){
	
	//private vars
	var defaults={path:'galleryWorx/',
			  pathJSON:'json/',
			  pathImages:'photo/',
			  pathThumb:'tmb/',
			  pathBigImage:'big/',
			  pathOrgImage:'org/',
			  pathLightboxImage:'lightbox/',
			  pathTemplate:'template/',
			  indexFile:'gallery-index.json',
			  pageIndex:true,
			  pageSize:9,
			  imageInSet:10,
			  galleryIndexContainer:'#GWgalleryIndexContainer',
			  galleryThumbsContainer:'#GWgalleryThumbsContainer',
			  galleryBigImageContainer:'#GWgalleryBigImageContainer',
			  galleryMainContainer:'#GWgalleryMainContainer',
			  loadGallery:0
			  
	}
	
	 jQuery.extend(defaults,config)
	 var _loadingGalleryId
	 var _this=this
	 //read index template
	 var _templateIndex=new TemplateReader();
	  	_templateIndex.read(defaults.path+defaults.pathTemplate+"gallery-index.html",defaults.galleryIndexContainer)
	 
	  var _templateThumbs=new TemplateReader();
	  	_templateThumbs.read(defaults.path+defaults.pathTemplate+"gallery-thumbs.html",defaults.galleryThumbsContainer)
		
	 var _templateLightbox=new TemplateReader();
	_templateLightbox.read(defaults.path+defaults.pathTemplate+"lightboxGallery.html",'#galleryLightboxContainer')
	

	 //public vars readonly
	 this.galleryIndex=new Array();
	 this.loadedGalleries=new Array();
	 this.currentGallery;
	 this.currentGalleryIndex;
	 this.currentIndexPage;
	 this.currentBigImageIndex=0;
	 this.indexHasNext=true;
	 this.indexHasPrev=true;
	 
	 this.galleryHasNext=true;
	 this.galleryHasPrev=true;
	  
	 this.thumbsHasNext=true;
	 this.thumbsHasPrev=true;
	 this.lightboxSet=new Array();
	 //creates a jSON of Galleryindex from json Document
	 this.createGalleryIndex=function(data){
		for(i in data.gallery){
				o=data.gallery[i];
			 	this.galleryIndex.push(o)
		}
		
	}
	//creates a jSON of Gallery from json Document
	this.createGallery=function(data){
		_images=new Array();
		this.lightboxSet=new Array();
		for(i in data.images){
				o=data.images[i].img;
				_o={'img':defaults.path+defaults.pathImages+_loadingGalleryId+"/"+defaults.pathThumb+o,imgOrg:defaults.path+defaults.pathImages+_loadingGalleryId+"/"+defaults.pathLightboxImage+o};
 			    _images.push(_o)
				this.lightboxSet.push("") ;//we only need the size of the array.. we set value to it later;
			}
		 this.currentGallery=_images;	
	    resetLightBox()   
	}

	 //callback function after json is read
	 this.afterJSONRead=function(data,readFor){ 
		switch (readFor){
			case 'galleryIndex':
				this.createGalleryIndex(data)
				
			break;
			case 'gallery':
			   this.createGallery(data)
			break;
			
			
		}
	 }
	 
	 //Reads Gallery index from gallery-index.json and passes it into galleryIndexJSON
	 jsonReader=new JSONReader(); 
	 jsonReader.read(defaults.path+defaults.pathJSON+defaults.indexFile,this,'galleryIndex');

	
	//Write a GalleryIndex into a div
	this.loadGalleryIndex=function(startIndex,count){
		if(typeof(startIndex)=='undefined'){startIndex=0;}
		if(typeof(count)=='undefined'){count=this.galleryIndex.length;}
		
		_obj=this.galleryIndex.slice(startIndex,startIndex+count);
		//jQuery Chain spcific parameters to add href
		chainParams={'.galleryLink': { href: '{id}'},'.img':{src:defaults.path+defaults.pathImages+'{id}/cover.jpg'},container:'#GWgalleryIndex'};
		_templateIndex.update(_obj,defaults.galleryIndexContainer,chainParams)
		
		if(startIndex==0){this.indexHasPrev=false;};
		if((startIndex+count)==this.galleryIndex.length){this.indexHasNext=false;};
	}
	
	//sets the content of the page into index
	this.loadGalleryIndexPage=function(page){
		this.currentIndexPage=page; 
		startIndex=(page-1)*defaults.pageSize;
		this.loadGalleryIndex(startIndex,defaults.pageSize);
		
		//check if prev/next page exists

		if(page==1){this.indexHasPrev=false; jQuery(defaults.galleryIndexContainer+' .prevIndex').addClass('disabled'); }else{this.indexHasPrev=true; jQuery(defaults.galleryIndexContainer+' .prevIndex').removeClass('disabled') }
		if(startIndex+defaults.pageSize>=this.galleryIndex.length){this.indexHasNext=false; jQuery(defaults.galleryIndexContainer+' .nextIndex').addClass('disabled');}else{this.indexHasNext=true; jQuery(defaults.galleryIndexContainer+' .nextIndex').removeClass('disabled')};
		
		
		
	}
	
	//loads next page of the galleryIndex
	this.loadGalleryIndexNextPage=function(){
		if(this.indexHasNext){
			this.currentIndexPage++;
			this.loadGalleryIndexPage(this.currentIndexPage);
			
		}
		
	}
	
	//loads prev page of the galleryIndex
	this.loadGalleryIndexPrevPage=function(){
		if(this.indexHasPrev){
			this.currentIndexPage--;
			this.loadGalleryIndexPage(this.currentIndexPage);
		}
	}
	
	
	
	this.updateLightBox=function(obj,clearSet){
		
		chainParams={'.galleryLightboxLink':{href:'{imgOrg}'},container:'#galleryLightbox'};
		_templateLightbox.removeOldItems=clearSet;
		
		_templateLightbox.update(obj,'#galleryLightboxContainer',chainParams)
		// lightbox effect 
		jQuery('#galleryLightbox a').lightbox();
	
	}
	
	//thumbnails
	this.loadGalleryThumbsNextPage=function(){
		if(this.thumbsHasNext){
			this.currentThumbPage++;
			this.loadGalleryThumbPage(this.currentThumbPage);
			
		}
		
	}
	
	this.loadGalleryThumbsPrevPage=function(){
		if(this.thumbsHasPrev){
			this.currentThumbPage--;
			this.loadGalleryThumbPage(this.currentThumbPage);
		}
	}
	
	this.loadGalleryThumbPage=function(page,clearSet){
		
		if(typeof(clearSet)=='undefined'){
			clearSet=false;
		}
		


		this.currentThumbPage=page;
		startIndex=(page-1)*defaults.imageInSet;

		if(page==1){this.thumbsHasPrev=false; jQuery(defaults.galleryThumbsContainer+' .prevThumbs').addClass('disabled'); }else{this.thumbsHasPrev=true; jQuery(defaults.galleryThumbsContainer+' .prevThumbs').removeClass('disabled');}
		if(startIndex+defaults.imageInSet>=this.currentGallery.length){this.thumbsHasNext=false; jQuery(defaults.galleryThumbsContainer+' .nextThumbs').addClass('disabled');}else{this.thumbsHasNext=true; jQuery(defaults.galleryThumbsContainer+' .nextThumbs').removeClass('disabled');};
		
		chainParams={container:'#GWgalleryThumbs'};
		
		_set=this.currentGallery.slice(startIndex,startIndex+defaults.imageInSet)
		_templateThumbs.update(_set,defaults.galleryThumbsContainer,chainParams)
		
		//populate lightbox
		
	
		_a=new Array()
		end=startIndex+defaults.imageInSet
		if(page==1){
			//end=startIndex+1;
		}
		for(i=startIndex;i<end;i++){
			if(this.lightboxSet[i]==""){
				this.lightboxSet[i]=this.currentGallery[i];
				_a.push(this.lightboxSet[i]);
				
			}
		}
		
		this.updateLightBox(_a,clearSet);
	}
	
	
	this.loadGallery=function(id){
		//empty the lightbox set if loading new Gallery
		this.currentBigImageIndex=0;
		_loadingGalleryId=id;

		jsonReader.read(defaults.path+defaults.pathJSON+id+'.json',this,'gallery');
		

		for(i=0;i<this.galleryIndex.length;i++){
			if(this.galleryIndex[i].id==id){
				this.currentGalleryIndex=i;
				break;
			}
		}
		
		
		//update gallery title
		jQuery('#titleForGallery').html(this.galleryIndex[i].title+'<span>'+this.galleryIndex[i].date+'</span>');
		
	
		//update thumbnails
		this.loadGalleryThumbPage(1,clearSet=true)	
		if(this.galleryIndex[0].id==id){this.galleryHasPrev=false; jQuery("#GWgalleryMainContainer .previous-gallery").addClass('disabled'); }else{this.galleryHasPrev=true;jQuery("#GWgalleryMainContainer .previous-gallery").removeClass('disabled');};
		if(this.galleryIndex[this.galleryIndex.length-1].id==id){this.galleryHasNext=false; jQuery("#GWgalleryMainContainer .next-gallery").addClass('disabled');}else{this.galleryHasNext=true;jQuery("#GWgalleryMainContainer .next-gallery").removeClass('disabled');};
		
		//PutBigImage
		this.putBigImage(this.currentGallery[0].img)
		this.loadedGalleries.push={id:this.currentGallery};
		
	}
	
	//load next gallery
	this.loadNext=function(){
		if(this.galleryHasNext){
			this.currentGalleryIndex++;
			this.loadGallery(this.galleryIndex[this.currentGalleryIndex].id);
		}
	}
	
	//lodd prev gallery
	this.loadPrev=function(){
		if(this.galleryHasPrev){
			this.currentGalleryIndex--;
			this.loadGallery(this.galleryIndex[this.currentGalleryIndex].id);
		}
	}
	
	//
	this.putBigImage=function(thumb){
		url=thumb.replace('/'+defaults.pathThumb,'/'+defaults.pathLightboxImage);
		jQuery(defaults.galleryBigImageContainer).html('<a href="'+thumb.replace('/'+defaults.pathThumb,'/'+defaults.pathLightboxImage)+'" onclick="return false"><img src ="'+thumb.replace('/'+defaults.pathThumb,'/'+defaults.pathBigImage)+'" class="big-image"/></a>')
	}
	

	
	//the function that does everything initally to have the gallery shown
	this.show=function(){
		//if paging for index is set true
		if(defaults.pageIndex){
			//load first page
			this.currentIndexPage=1
			this.loadGalleryIndexPage(this.currentIndexPage);
		}else{
			this.loadGalleryIndex();
		}
		
		//load first gallery
		if(defaults.loadGallery==0){
			this.loadGallery(this.galleryIndex[0].id);
		}else{
			this.loadGallery(defaults.loadGallery);
		}
		
		//add events
		jQuery(defaults.galleryThumbsContainer+' img').live('click', function() {
  			jQuery(defaults.galleryThumbsContainer+' img').removeClass('selected')
			jQuery(defaults.galleryThumbsContainer+' img').parent().removeClass('selected')
			_this.putBigImage(this.src)
			_src=this.src
			jQuery(this).addClass('selected')
			jQuery(this).parent().addClass('selected')
			_cnt=(_this.currentThumbPage-1)*defaults.imageInSet;
			jQuery(defaults.galleryThumbsContainer+' img').each(function(){
				if(this.src==_src){
				  _this.currentBigImageIndex=_cnt;
				   }
				   _cnt++;
				
				})
			 
		});
		
		jQuery(defaults.galleryIndexContainer+' .item .galleryLink').live('click', function(event) {
			jQuery(defaults.galleryIndexContainer+' .item .galleryLink').removeClass('selected')
			jQuery(defaults.galleryIndexContainer+' .item .galleryLink').parent().removeClass('selected')
  			_this.loadGallery(jQuery(this).attr('href'))
			jQuery(this).addClass('selected')
			jQuery(this).parent().addClass('selected')
			jQuery("ul.tabs li").removeClass("active");
			jQuery("ul.tabs li:first").addClass("active").show(); //Activate first tab
			jQuery(".henworx-gallery:first").show();
			jQuery('#tab2').hide()
		});
		
		jQuery(defaults.galleryIndexContainer+' .prevIndex').live('click', function(event) {
  			_this.loadGalleryIndexPrevPage();
		});
		
		jQuery(defaults.galleryIndexContainer+' .nextIndex').live('click', function(event) {
																					
  			_this.loadGalleryIndexNextPage();
		});
		
		jQuery(defaults.galleryThumbsContainer+' .prevThumbs').live('click', function(event) {
																				
  			_this.loadGalleryThumbsPrevPage();
		});
		
		jQuery(defaults.galleryThumbsContainer+' .nextThumbs').live('click', function(event) {
																					
  			_this.loadGalleryThumbsNextPage();
		});
		
		jQuery("#GWgalleryMainContainer .next-gallery").click(function(){
			_this.loadNext();
		});
		
		jQuery("#GWgalleryMainContainer .previous-gallery").click(function(){ 
			_this.loadPrev();
		 });
		
		jQuery(defaults.galleryBigImageContainer +" a").live('click',function(){_n=_this.currentBigImageIndex+1
			jQuery("#galleryLightbox li:nth-child("+_n+") a").click();
		})
		
		/*totalNumberOfPage=Math.ceil(this.galleryIndex.length/defaults.pageSize);
		for(var i=1;i<=totalNumberOfPage;i++){
			jQuery('#GWgalleryPaginationUp ').append(i+" ")
			jQuery('#GWgalleryPaginationDown ').append(i+" ")
	}
	*/
		
	}
}
	 
	 