var exhibitionist_vi = function(){
	//the main class
	this.object;
	this.rawItems = Array();
	this.mainItems = Array();
	this.controllers = Array();
	this.thumbnailItems = Array();
	this.flashObjectArray = Array();
	this.threadsBusy = 0;
	this.lastItemChangedTo = -1;
	this.init = function(name,fullPath){
		this.fullPluginPath = fullPath;
		this.object = document.getElementById(name);
		this.object.name = name;
		this.object.rootElement = this;
	}
	this.thumbnailsAligner = new exhibitionist_vi_itemAligner;
	this.thumbnailsAligner.init(this,this.thumbnailItems);
	this.mainItemsAligner = new exhibitionist_vi_itemAligner;
	this.mainItemsAligner.init(this,this.mainItems);
	this.addItem = function(itemArray){
		switch(itemArray['mime_type']){
			case "image/jpeg":
				//create thumbnail image object
				var newThumbnailObject = new exhibitionist_vi_thumbnailObject;
				this.thumbnailItems[this.thumbnailItems.length] = newThumbnailObject;
				newThumbnailObject.init(this,this.thumbnailsAligner,itemArray);
				//create main image object
				var newImageObject = new exhibitionist_vi_imageObject;
				this.mainItems[this.mainItems.length] = newImageObject;
				newImageObject.init(this,this.mainItemsAligner,itemArray);
			break;
			case "video/mp4":
			case"video/quicktime":
			case"video/x-flv":
				//flash player required
				//create thumbnail video object
				var newThumbnailObject = new exhibitionist_vi_thumbnailObject;
				this.thumbnailItems[this.thumbnailItems.length] = newThumbnailObject;
				newThumbnailObject.init(this,this.thumbnailsAligner,itemArray);
				//create the main video object
				var newVideoObject = new exhibitionist_vi_flashVideoObject;
				var arrayPos = this.mainItems.length;
				this.mainItems[arrayPos] = newVideoObject;
				newVideoObject.init(this,this.mainItemsAligner,itemArray,arrayPos);
			break;
			case"video/ogv":
				//HTML5 player
				//create thumbnail video object
				var newThumbnailObject = new exhibitionist_vi_thumbnailObject;
				this.thumbnailItems[this.thumbnailItems.length] = newThumbnailObject;
				newThumbnailObject.init(this,this.thumbnailsAligner,itemArray);
				//create the main video object
				var newVideoObject = new exhibitionist_vi_videoObject;
				this.mainItems[this.mainItems.length] = newVideoObject;
				newVideoObject.init(this,this.mainItemsAligner,itemArray);
			break;
		}
	}
	this.setLayout = function(layoutArray){
		for (row in layoutArray){
			var rowDiv = document.createElement("div");
			rowDiv.style.position = "relative";
			rowDiv.style.verticalAlign = "text-top";
			//rowDiv.style.display = "inline-block";
			rowDiv.id = "R"+row;
			var columnArray = layoutArray[row];
			for (column in columnArray){
				var columnDiv = document.createElement("div");
				//columnDiv.style.position = "relative";
				columnDiv.style.display = "inline-block";
				columnDiv.style.verticalAlign = "top";
				columnDiv.id = "R"+row+"C"+column;
				var itemArray = columnArray[column];
				for (itemNum in itemArray){
					var itemDiv = document.createElement("div");
					itemDiv.style.position = "relative";
					itemDiv.style.display = "inline";
					itemDiv.style.verticalAlign = "text-top";
					itemDiv.id = "R"+row+"C"+column+"I"+itemNum;
					var itemName = itemArray[itemNum];
					var controllerSet = false;
					switch(itemName){
						case"nothing":
							controllerSet = false;
						break;
						case"inlineThumbnail":
							var controller = new exhibitionist_vi_inlineThumbnail;
							controllerSet = true;
						break;
						case"inlineThumbnailWithInfo":
							var controller = new exhibitionist_vi_inlineThumbnailWithInfo;
							controllerSet = true;
						break;
						case"mainImage_noEffect":
							var controller = new exhibitionist_vi_mainImage_noEffect;
							controllerSet = true;
						break;
						case"mainImage_crossfade":
							var controller = new exhibitionist_vi_mainImage_crosfade;
							controllerSet = true;
						break;
						case"slideshowController":
							var controller = new exhibitionist_vi_slideshowController;
							controllerSet = true;
						break;
					}
					if (controllerSet){
						controller.init(this,itemDiv,settingsArray[row][column][itemNum]);
						this.controllers[this.controllers.length] = controller;
					}
					columnDiv.appendChild(itemDiv);
				}
				rowDiv.appendChild(columnDiv);
			}
			this.object.appendChild(rowDiv);
		}
	}
	this.start = function(){
		//start the controllers
		for (controllerNum in this.controllers){
			var controller = this.controllers[controllerNum];
			controller.start();
		}
		this.changeToItem(0);
	}
	//call back procedures from controllers 
	this.changeToItem = function(item){
		if (this.lastItemChangedTo != item){
			for (controllerNum in this.controllers){
				var controller = this.controllers[controllerNum];
				controller.changeToItem(item);
			}
		}else{
			//same item changed to
		}
		this.lastItemChangedTo = item;
		
	}
}