//odvisen od gallery_data.js

Buffer = function(){

	// New queue object
	var buffer_new = new queue();
	// Counters for tracking current playlist and current player position
	var player_pos = 0;
	var playlist_pos = 1; // We don't want to show playing video in playlist
	// How many items on page ?
	var page_item_onpage = 5;
	var load_mutex = false;
	
	// Return items per page
	this.GetItemsOnPage = function() {
		return page_item_onpage;
	}
	
	// Returns reference to new queue object
	this.GetCurrentQueue = function() {
		return buffer_new;
	}
	// Function returns array of data to be shown in playlist
	// Merge z Fishovim filetom - START
	function Playlist_get_index_first(page) {
		if(page <= 0) return 0;
		return (page -1) * page_item_onpage;
	}
	this.Playlist_get_index_first = Playlist_get_index_first;
	function Playlist_get_index_last(page) {
		if(page <= 0) return 0;
		return page * page_item_onpage - 1;
	}
	this.Playlist_get_index_last = Playlist_get_index_last;
	function CheckDataLoaded(start,end,details) {
		for(var i=start;i<=end;i++) {
			if (buffer_new.data[i][3] == false) {
				var Data_new = new GetGalleryItemsData();
				    Data_new.data    = buffer_new.data;
				    Data_new.data_id = i;
				    Data_new.start = start;
				    Data_new.end   = end;
				    Data_new.details = details;
				    Data_new.start_time = new Date();
				Data_new.OnFailure = function(){
					alert("Error loading content for video " + Data_new.data[Data_new.id]);
				}
				Data_new.OnSuccess = function(){
					var x = Data_new.GetResponseText();
					var tmp_id = Data_new.data[Data_new.data_id][2];
					var tmp = x;
					Data_new.data[Data_new.data_id] = tmp.split('<variable>');
					Data_new.data[Data_new.data_id][1] = Data_new.data[Data_new.data_id][1].split('|');
					Data_new.data[Data_new.data_id][3] = true;
					Data_new.data[Data_new.data_id][2] = tmp_id;
					// We call this because we want to show elements as data is loading
					OnCheckDataLoaded(Data_new.start,Data_new.end,Data_new.details);
					CheckDataLoaded(Data_new.start,Data_new.end,Data_new.details);
					return;
				}
				Data_new.GetData(buffer_new.data[i][2]);
				return;
			}
	// Merge z Fishovim filetom - END
	// Merge z Fishovim filetom - REMOVE - START
	/*
	function Playlist_get_data(page,details) {
		if (buffer_new.queue_length == 0) return 0;
		var index_first = (page -1) * page_item_onpage;
		var index_last  = page * page_item_onpage - 1;
		if (index_first+1 > buffer_new.queue_length) {
			// If start index is out of our reach there is nothing to show
			return false;
		}
		if (index_last+1 >= buffer_new.queue_length) {
			// If end index is out of our reach we turncate it to queue length
			index_last = buffer_new.queue_length-1;
	*/
	// Merge z Fishovim filetom - REMOVE - END
		}
		OnCheckDataLoaded(start,end,details);
	}
	this.CheckDataLoaded = CheckDataLoaded;
	function OnCheckDataLoaded(start,end,details) {
		var return_data = new Array();
		var i,j;
		j = 0;
		for(i=start;i<=end;i++) {
			// Copy requested data to new arrey
			// This has plenty of overhead but whole system is designed to accept
			// just requested data
			if (details == true) {
				// Load all data - not just playlist
				return_data[j] = buffer_new.data[i][1];
			} else {
				if (typeof(buffer_new.data[i][0]) == "undefined") {
					// This only happens if data is not yet loaded
					break;
				}
				return_data[j] = buffer_new.data[i][0];
			}
			j++;
		}
		OBuffer.OnPlaylist_get_data(return_data);
	}				
	this.OnCheckDataLoaded = OnCheckDataLoaded;
	function Playlist_get_data(page,details) {
		var index_first = this.Playlist_get_index_first(page);
		var index_last  = this.Playlist_get_index_last(page);
		if (index_first+1 > buffer_new.queue_length) {
			// If start index is out of our reach there is nothing to show
			return false;
		}
		if (index_last+1 >= buffer_new.queue_length) {
			// If end index is out of our reach we turncate it to queue length
			index_last = buffer_new.queue_length-1;
		}
		CheckDataLoaded(index_first,index_last,details);
	}
	// Link function to this object
	this.Playlist_get_data = Playlist_get_data;
	
	// Function returns video that should be played next and advances to next one
	function Player_get_next_video() {
		if (buffer_new.queue_length == 0) {
			// Queue empty
			return false;
		}
		if (player_pos+1 > buffer_new.queue_length) {
			// We have reached the end of a playlist
			return -1;
		}
		return buffer_new.data[player_pos++][1];
	}
	// Link function to this object
	this.Player_get_next_video = Player_get_next_video;

	// Function deletes video that is currently played from the queue
	function Player_delete_current_video() {
		buffer_new.delete_at(player_pos);
	}
	this.Player_delete_current_video = Player_delete_current_video;
	
	// Function sets player position in queue
	function Player_set_position(pos) {
		player_pos = pos;
	}
	this.Player_set_position = Player_set_position;
	// Function gets player position in queue
	function Player_get_position() {
		return player_pos;
	}
	this.Player_get_position = Player_get_position;
	// Function returns video that should be played next and DOES NOT advance to next one
	function Player_get_next_video_peek() {
		if (buffer_new.queue_length == 0) {
			// Queue empty
			return false;
		}
		if (player_pos+1 > buffer_new.queue_length) {
			// We have reached the end of a playlist
			return -1;
		}
		return buffer_new.data[player_pos][1];
	}
	// Link function to this object
	this.Player_get_next_video_peek = Player_get_next_video_peek;

	// Function loads playlist data (for specific tab) and stores 
	// it in buffer_new object. This function is called when a
	// new tab is clicked or when page loads
	function Fill_new(fill_to) {
		switch (tab_id) {
			case 1:
				// User playlist
				var to_load = 50;
				break;
			case 2:
				// Random playlist
				var to_load = 50;
				break;
			default:
				// Similar playlist
				var to_load = 100;
				break;
		}
	// Merge z Fishovim filetom - START
		var Data_new = new GetGalleryItemsId();
	// Merge z Fishovim filetom - END
	
		// Assign function that will be called when data is loaded
// Merge z Fishovim filetom - START
		Data_new.OnFillDone = this.OnFillDone;
		Data_new.OnFailure = function(){
			//alert("qwe");
		}
		Data_new.OnSuccess = function(){
			var x = Data_new.GetResponseText();
			var stevec = 0;
			if(x.length <= 0) return -1;
			var video;
			//locimo posamezne videje
			video = x.split('|');		
			// Delete leftovers (if any) from previous queue
			buffer_new.data = new Array();
			// Loads (adds) video data into buffer_new object
			for(var j=buffer_new.loader_position; j < video.length; j++){
//					var tmp = video[j];
//					buffer_new.data[j] = tmp.split('<variable>');
//					buffer_new.data[j][1] = buffer_new.data[j][1].split('|');
					buffer_new.data[j] = new Array();
					buffer_new.data[j][2] = parseInt(video[j]); // Video ID
					buffer_new.data[j][3] = false; // Video data loaded

			}
			// TODO: This should be replaced with real queue length
			buffer_new.queue_length=j;
			// Set loader position
			// Reset player and playlist position as queue was reset
			player_pos = 0;
			playlist_pos = 1;
			this.OnFillDone();
		}
// Merge z Fishovim filetom - END

		// Call load routine
		
		var Finish = this;		

		var load = new Ajax("/ajax/GetGalleryItem.php", {	
			method: 'get',
			data: "tab_id=" + tab_id + "&start=" + 0 + "&show=" + to_load + "&objectid=" + objectid+ "&ownerid=" + ownerid + "&item=" + item + "&item_id=" + item_id  + "&sid="  + Math.random(),
			onSuccess: function(){
				var x = this.response.text;
				var stevec = 0;
				if(x.length <= 0) return -1;
				var video;
				//locimo posamezne videje
				video = x.split('<element>');		
				// Delete leftovers (if any) from previous queue
				buffer_new.data = new Array();
				buffer_new.queue_length=0;
				// Loads video data into buffer_new object
				if (x != 0) {
					for(var j=0; j < video.length; j++){
						var tmp = video[j];
						buffer_new.data[j] = tmp.split('<variable>');
						buffer_new.data[j][1] = buffer_new.data[j][1].split('|');
					}
					
					buffer_new.queue_length=j;
				}
				// Reset player and playlist position as queue was reset
				player_pos = 0;
				playlist_pos = 1;
				Finish.OnFillDone();

			},
			onFailure: function(){
				//alert("qwe");
			}
		});
		load.request();
	}
	// Link function to this object
	this.Fill_new = Fill_new;
	
}