/** TODO APP

	struktura 'listy' - metoda addList : 
		lista = {
			 name: ''
			,items: []
		}
	
	struktura elementu na liście - metoda addItem : 
		item = {
			 name: item
			,isComplete: false
			,important: false
		}
	
	@wymagania
	
		JSON.parse
		
	
 **/
var todo = {
	 init: function(){
		/**
			inicjucje moduł todo
			
			@param		-
			
			@return		-
			
			@description
			
				Funkcja inicjuje wszystkie potrzebne i używane przez siebie zmienne.
				
		*/
		//	sprawdzamy czy aplikacja w oóle będzie w stanie działać..
		// if ( typeof JSON == 'undefined' || typeof localStorage == 'undefined' ) {
			// alert('zanim tu wrócisz, zmień przeglądarkę!');
			// window.location = 'http://www.google.pl/';
			// return false;
		// };
		
		//	tablica, która przechowuje wszystkie listy i elementy
		this.data = [];			
		this.isBusy = false;
		this.selectedItem = false;			//	zmienna, w której przechowuje informacje o aktualnym elemencie na liście (np do sterowania klawiaturą)
		this.selectedList = false;			//	aktualnie aktywna lista

	}
	/**	zarządzanie listami */
	,addList: function(name) {
		/** 
			funckja dodaje nową listę zadań do wykonania
			
			@param		name			- nazwa listy do dodania, musi być unikalna.
			
			@return 	true/false	
			
		*/
		if ( !name ) {
			log('[todo] [addList] Nazwa nie może być pusta, "'+name+'"');
			return false;
		}
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == name) {
				//	taka lista już istnieje
				log('[todo] [addList] Lista o takiej nazwie już istnieje, "'+name+'"');
				return false;
			}
		}
		//	dodajemy listę.
		var lista = {
			 name: name
			,items: []
		};
		d.push(lista);
		return true;
	}
	,removeList: function(name) {
		/**
			funkcja usuwa podaną listę
			
			@param		name		- nazwa listy do usunięcia, nie może być pusta
			
			@return 	true/false
			
		*/
		if ( !name ) {
			log('[todo] [removeList] Nie podano nazwy listy do usunięcia, "'+name+'"');
			return false;
		}	
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == name) {
				//	usuwamy listę
				d.remove(i);
				return true;
			}
		}
		//	nie znaleźliśmy listy
		log('[todo] [removeList] Nie znaleziono listy o podanej nazwie, "'+name+'"');			
		return false;
	}
	,renameList: function(oldName, newName) {
		/**
			funkcja zmienia nazwę istniejącej listy
			
			@param		oldName		- nazwa listy, której chcemy zmienić nazwę
						newName		- nowa nazwa listy
			
			@return 	true/false
			
		*/
		if (!oldName || !newName) {
			log('[todo] [renameList] Nie podano nazwy listy obecnej lub nowe, "'+oldName+'", "'+newName+'"');
			return false;
		}	
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == oldName) {
				//	znalezliśmy, zmieniamy nazwe
				d[i].name = newName;
				return true;
			}
		}
		//	nieznaleźliśmy listy
		log('[todo] [renameList] Nie znaleziono listy o podanej nazwie, "'+oldName+'"');			
		return false;
	}
	/**	zarządzanie elementami na listach */
	,addItem: function(listName, item) {
		/**
			funkcja dodaje element do podanej listy
			
			@param		listName		- nazwa istniejącej(!) listy
						item			- nazwa elementu do dodania LUB 
										- obiekt, który należy dodać do podanej listy
										
			@return		true/false
			
		*/
		if ( !listName || !item ) {
			log('[todo] [addItem] Musisz podać nazwę listy i element do dodania, "'+listName+'", "'+item+'"');
			return false;
		}
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == listName) {
				//	znaleźlismy listę... 
				//	tworzymy element i dodajemy do listy
				if ( typeof item == 'string' ) {
					item = {
						 name: item
						,isComplete: false
						,important: false
					}
				}
				//	sprawdzamy czy taki element już nie istnieje na liście
				var items = d[i].items;
				for (var k=0, ilek=items.length; k<ilek; k++) {
					if ( items[k].name == item.name ) {
						log('[todo] [addItem] Element o takiej nazwie już istnieje, "'+listName+'", "'+item+'"');
						return false;
					}
				}
				d[i].items.push(item);
				return true;
			}
		}
		log('[todo] [addItem] Podana lista nie została znaleziona, "'+listName+'", "'+item+'"');
		return false;
	}
	,removeItem: function(listName, itemName) {
		/**
			funkcja usuwa element do podanej listy
			
			@param		listName		- nazwa istniejącej(!) listy
						itemName			- nazwa elementu do usunięcia 
						
			@return		true/false
		*/
		if ( !listName || !itemName ) {
			log('[todo] [removeItem] Musisz podać nazwę listy i element do usunięcia, "'+listName+'", "'+itemName+'"');
			return false;
		}
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == listName) {
				//	znaleźlismy listę... 
				//	szukamy elementu do usunięcia
				var items = d[i].items;
				for (var k=0, ilek=items.length; k<ilek; k++) {
					if ( items[k].name == itemName ) {
						items.remove(k);
						return true;
					}
				}
				log('[todo] [removeItem] Podany element nie został znaleziony, "'+listName+'", "'+itemName+'"');
				return false;
			}
		}
		log('[todo] [removeItem] Podana lista nie została znaleziona, "'+listName+'", "'+itemName+'"');
		return false;
	}
	,renameItem: function(listName, oldName, newName) {
		/**
			funkcja zmienia nazwę istniejącego elementu na podanej liście
			
			@param		listName	- nazwa listy, na której znajduje się element do zmiany
						oldName		- nazwa elementu, którego chcemy zmienić nazwę
						newName		- nowa nazwa elementu
						
			@return 	true/false
		*/
		if (!listName || !oldName || !newName) {
			log('[todo] [renameItem] Nie podano nazwy listy lub nazwy elementu (starej, nowej), "'+listName+'", "'+oldName+'", "'+newName+'"');
			return false;
		}	
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == listName) {
				//	znalezliśmy listę, szukamy elementu
				var items = d[i].items;
				for (var k=0, ilek=items.length; k<ilek; k++) {
					if ( items[k].name == oldName ) {
						items[k].name = newName;
						return true;
					}
				}
				log('[todo] [renameItem] Podany element nie został znaleziony, "'+listName+'", "'+oldName+'"');
				return false;
			}
		}
		//	nieznaleźliśmy listy
		log('[todo] [renameItem] Nie znaleziono listy o podanej nazwie, "'+listName+'"');			
		return false;
	}
	,completeItem: function(listName, item, bool) {
		/**
			funkcja oznacza dany element na liście jako zakończony.
			
			@param		listName		- nazwa istniejącej(!) listy
						item			- nazwa elementu do usunięcia 
						bool			- czy element jest zakończony (true) czy nie (false)
											domyślnie jest ustawiana wartość true.
						
			@return		true/false
		*/
		if ( !listName || !item ) {
			log('[todo] [completeItem] Musisz podać nazwę listy i element do usunięcia, "'+listName+'", "'+item+'"');
			return false;
		}
		if ( typeof bool == 'undefined' ) {
			bool = true;
		}
		var d = todo.data;
		for (var i=0, ile=d.length; i<ile; i++) {
			if (d[i].name == listName) {
				//	znaleźlismy listę... 
				//	szukamy elementu do usunięcia
				var items = d[i].items;
				for (var k=0, ilek=items.length; k<ilek; k++) {
					if ( items[k].name == item ) {
						items[k].isComplete = bool;
						log('[todo] [completeItem] done, return true.');
						log(items[k]);
						return true;
					}
				}
				log('[todo] [completeItem] Podany element nie został znaleziony, "'+listName+'", "'+item+'"');
				return false;
			}
		}
		log('[todo] [completeItem] Podana lista nie została znaleziona, "'+listName+'", "'+item+'"');
		return false;
	}
	
	,load: function(data){
		/**
			wczytaj dane nadpisując te, które już istnieją.
			
			@param 		data			dane wczytane np z localstorage lub ajaxem
			
			@return		true/false		czy dane udało sie poprawnie wczytac.
			
		*/
		if (!data) {
			log('[todo] [load] load -> nie przekazano żadnych danych');
			return false;
		}
		try {
			todo.data = $.extend( true, todo.data, JSON.parse(data) );
		} catch(e) { 
			return false;
		}		
		return true;
	}
	,save: function(){
		/**
			generuje stringa do zapisu do bazy danych
			
			@return		dbString/false		jeśli wszystko poszło poprawnie to zstanie zwrócony string z informacjami o wszystkich listach, gotowy do zapisu do bazy danych
			
		*/
		var dbStr;
		try {
			dbStr = JSON.stringify(todo.data);
		} catch(e) {
			return false;
		}
		return dbStr;
	}
	
	/** todo view **/

};

todo.init();

/** TODO EXAMPLES

todo.addList('rzeczy do zrobienia');
todo.addList('lista zakupów');
todo.addList('todo');
todo.removeList('todo');
todo.addItem('rzeczy do zrobienia', 'Item 1');
todo.addItem('rzeczy do zrobienia', 'Item 2');
todo.addItem('rzeczy do zrobienia', 'Item 3');
todo.addItem('rzeczy do zrobienia', 'Item 4');
todo.renameList('rzeczy do zrobienia', 'todoski');
todo.addItem('lista zakupów', 'Bułka');
todo.addItem('lista zakupów', 'Chleb');
todo.addItem('lista zakupów', 'Woda');
todo.addItem('lista zakupów', 'Mleko');
todo.addItem('lista zakupów', 'Jabłka');
todo.addItem('lista zakupów', 'Gruszki');
todo.removeItem('lista zakupów', 'Chleb');
todo.renameItem('lista zakupów', 'Woda', 'Coca-cola');
todo.removeItem('todoski', 'Item 2');
todo.renameItem('todoski', 'Item 3', 'element nr 3');
todo.completeItem('todoski', 'Item 4', true);

**/
