﻿var DataManager = { };

DataManager.LOCAL = function() { }
DataManager.DATA = null;

DataManager.CONTAINER = null;
DataManager.CONTAINER_ID = null;

DataManager.ITEMS_PER_PAGE = null;
DataManager.DEBUG_DELAY = 0;

DataManager.CURRENT_SORTBY_TYPE = 'Text';
DataManager.CURRENT_SORTBY_COLUMN = null;
DataManager.CURRENT_SORTBY_DIRECTION = null;

DataManager.CURRENT_PAGE = 1;
DataManager.PREVIOUS_PAGE = DataManager.CURRENT_PAGE;
DataManager.TOTAL_PAGES = 0;

DataManager.PAGE_START_INDEX = 0;
DataManager.PAGE_END_INDEX = 0;

DataManager.RESET_AFTER_SORTING = true;
DataManager.CONTENT_ROWS = null;
DataManager.CONTENT_CELLS = null;

DataManager.FUN_AFTER_UPDATE = null;
DataManager.PAGINATION_BLOCKS = new Array();

DataManager.COLUMN_DATA_TYPES = new Array();

DataManager.COLUMN_DATE_FORMATS = new Array();
DataManager.DATE_FORMAT = "dd/MM/yyyy";

DataManager.Run = function(tableID) {
	DataManager.CONTAINER_ID = tableID;
	DataManager.CONTAINER = $(DataManager.CONTAINER_ID);
	
	if (DataManager.CONTAINER != null) {
		if (DataManager.CONTENT_CELLS == null) {
			DataManager.CONTENT_ROWS = DataManager.CONTAINER.getElements(".row");
			DataManager.CONTENT_CELLS = DataManager.CONTENT_ROWS.getElements(".cell");
		}
	
		if (DataManager.DataExists()) {
			if (DataManager.ITEMS_PER_PAGE != null) {
				DataManager.TOTAL_PAGES = Math.ceil(DataManager.DATA.CONTENT.length / DataManager.ITEMS_PER_PAGE);
			}
			
			var columnName = DataManager.CURRENT_SORTBY_COLUMN;
			
			if (columnName == null) {
				for (var item in DataManager.DATA.CONTENT[0]) {
					columnName = item;
					break;
				}
			}
			
			if (columnName != null) {
				DataManager.Sort(DataManager.CURRENT_SORTBY_TYPE, columnName, DataManager.CURRENT_SORTBY_DIRECTION);
			}
			
		} else {
			DataManager.UpdatePagination();
		}
	}
}

DataManager.Error = function(error) {
	alert("DataManager.js\n" + error);
}

DataManager.SetupData = function() {
	if (DataManager.DATA == null) {
		DataManager.DATA = function() { };
		
		DataManager.DATA.HEADERS = new Array();
		DataManager.DATA.CONTENT = new Array();
		DataManager.DATA.DETAILS = new Array();
	}
}

DataManager.AddRow = function(row) {
	DataManager.SetupData();
	DataManager.DATA.CONTENT.push(row);
}

DataManager.AddDetails = function(id, row) {
	DataManager.SetupData();
	DataManager.DATA.DETAILS[id] = row;
}

// User after adding data.
DataManager.AddPaginationBlock = function(id) {
	var block = { };
	
	// Build all of these at the start so that referencing them at run time doesn't take too long.
	block.Container = $(id);
	
	if (block.Container != null) {
		block.PageStart = block.Container.getElement('.pageStart');
		block.PageBack = block.Container.getElement('.pageBack');
		block.PageNext = block.Container.getElement('.pageNext');
		block.PageLast = block.Container.getElement('.pageLast');
		block.Pages = block.Container.getElement('.pages');
		
		block.PageStart.href = "Javascript:void(0);";
		block.PageStart.onclick = function() { DataManager.PageFirst(); }
		
		block.PageBack.href = "Javascript:void(0);";
		block.PageBack.onclick = function() { DataManager.PageBack(); }
		
		block.PageNext.href = "Javascript:void(0);";
		block.PageNext.onclick = function() { DataManager.PageNext(); }
		
		block.PageLast.href = "Javascript:void(0);";
		block.PageLast.onclick = function() { DataManager.PageLast(); }
		
		DataManager.PAGINATION_BLOCKS.push(block);
	}
}

DataManager.GetData = function(column, search) {
	if (DataManager.DATA != null && DataManager.DATA.CONTENT != null) {
		if (column == null && search == null) {
			return DataManager.DATA.CONTENT;
		} else {
			
			for (var i = 0; i < DataManager.DATA.CONTENT.length; i++) {
				if (DataManager.DATA.CONTENT[i][column] == search) {
					return DataManager.DATA.CONTENT[i];
				}
			}
		}
	}
}

DataManager.GetDetails = function(id) {
	if (DataManager.DataExists()) {
		return DataManager.DATA.DETAILS[id];
	}
}

DataManager.DataExists = function() {
	if (DataManager.DATA != null && DataManager.DATA.CONTENT != null && DataManager.DATA.CONTENT.length > 0) {
		return true;
	}
	
	return false;
}

DataManager.Sort = function(type, columnName, direction) {
	if (DataManager.DataExists()) {
		if (direction == null) {
			direction = DataManager.GetSortDirection(columnName);
		}
		
		DataManager.DATA.CONTENT.sort(function(a, b) {
			var aData = a[columnName];
			var bData = b[columnName];
			
			if (type == "Text") {
				aData = aData.trim().toLowerCase();
				bData = bData.trim().toLowerCase();
				
			} else if (type == "Numeric") {
				if (aData.length == 0) { aData = 9007199254740992; } else { aData = parseFloat(aData.trim()); }
				if (bData.length == 0) { bData = 9007199254740992; } else { bData = parseFloat(bData.trim()); }
			
			} else if (type == "DateTime") {
				
			}
			
			if (direction == "DESC") {
				if (aData < bData) {
					return 1;
				} else if (aData > bData) {
					return -1;
				} else {
					return 0;
				}
				
			} else if (direction == "ASC") {
				if (aData > bData) {
					return 1;
				} else if (aData < bData) {
					return -1;
				} else {
					return 0;
				}
			}
		});
		
		DataManager.CURRENT_SORTBY_TYPE = type;
		DataManager.CURRENT_SORTBY_COLUMN = columnName;
		DataManager.CURRENT_SORTBY_DIRECTION = direction;
		
		if (DataManager.RESET_AFTER_SORTING && DataManager.TOTAL_PAGES > 0) {
			DataManager.Paginate();
		} else {
			DataManager.Update();
		}
		
	} else {
		setTimeout("DataManager.Sort('" + type + "', '" + columnName + "', '" + direction + "');", 50);
	}
}


DataManager.Paginate = function(pageNumber) {
	if (pageNumber == null) { pageNumber = 1; }
	
	if (DataManager.DataExists()) {
		DataManager.PREVIOUS_PAGE = DataManager.CURRENT_PAGE;
		DataManager.CURRENT_PAGE = pageNumber;

		DataManager.PAGE_START_INDEX = 0;
		DataManager.PAGE_END_INDEX = 0;
		
		if (pageNumber > 1) {
			DataManager.PAGE_START_INDEX = (pageNumber - 1) * DataManager.ITEMS_PER_PAGE;
		}
		
		DataManager.PAGE_END_INDEX = DataManager.PAGE_START_INDEX + (DataManager.ITEMS_PER_PAGE - 1);
		
		if (DataManager.PAGE_END_INDEX > (DataManager.DATA.CONTENT.length - 1)) {
			DataManager.PAGE_END_INDEX = DataManager.DATA.CONTENT.length - 1;
		}
		
		DataManager.UpdatePagination();
		DataManager.Update();
		
	} else {
		setTimeout("DataManager.Paginate('" + pageNumber + "');", 50);
	}
}


DataManager.GetSortDirection = function(columnName) {
	if (DataManager.CURRENT_SORTBY_COLUMN == columnName && DataManager.CURRENT_SORTBY_DIRECTION == "ASC") {
		return "DESC";
	} else {
		return "ASC";
	}
}


DataManager.Update = function() {
	if (DataManager.DataExists() && DataManager.CONTENT_CELLS != null) {
		for (var r = 0; r < DataManager.ITEMS_PER_PAGE; r++) {
			var row = DataManager.CONTENT_CELLS[r];
			var data = DataManager.DATA.CONTENT[r + DataManager.PAGE_START_INDEX];
			
			var c = 0;
			var parent = DataManager.CONTENT_ROWS[r];
			
			if (parent != null) {
				if (parent.previousDisplay == null) { parent.previousDisplay = parent.getStyle("display"); }
				parent.data = data;
			}
			
			if (data == null) {	
				if (parent != null) { parent.setStyle("display", "none"); }
			
			} else {
				if (parent != null) { parent.setStyle("display", parent.previousDisplay); }
				
				for (var item in data) {
					if (item.indexOf("_") != 0) {
						var value = data[item];
						var type = null;
						
						if (DataManager.COLUMN_DATA_TYPES[item] != null) {
							type = DataManager.COLUMN_DATA_TYPES[item];
						
						} else if (value.$family != null) {
							type = value.$family.name;
						
						} else if (Boolean(value) + '' == value) {
							type = "Boolean";
						}
						
						if (type == "date" || type == "DateTime") {
							var format = DataManager.DATE_FORMAT;
							if (DataManager.COLUMN_DATE_FORMATS[item] != null) {
								format = DataManager.COLUMN_DATE_FORMATS[item];
							}
							
							value = value.add({ months: -1 });
							value = value.toString(format);
							
							if (format.indexOf("mm") > -1) {
								value += " GMT";
							}
							
						} else if (type == "Boolean") {
							value = value ? "Yes" : "No";
						}
						
						row[c].innerHTML = value;
						c++;
					}
				}
				
			}
		}
		
		if (DataManager.FUN_AFTER_UPDATE != null) {
			DataManager.FUN_AFTER_UPDATE();
		}
	}
}

DataManager.PageBack = function() {
	var page = DataManager.CURRENT_PAGE;
	
	if (page != 1) {
		page -= 1;
	}
	
	DataManager.Paginate(page);
}

DataManager.PageNext = function() {
	var page = DataManager.CURRENT_PAGE;
	
	if (page != DataManager.TOTAL_PAGES) {
		page += 1;
	}
	
	DataManager.Paginate(page);
}

DataManager.PageFirst = function() {
	DataManager.Paginate(1);
}

DataManager.PageLast = function() {
	DataManager.Paginate(DataManager.TOTAL_PAGES);
}

DataManager.UpdatePagination = function() {
	DataManager.PAGINATION_BLOCKS.each(function(block) {
		DataManager.UpdatePaginationBlock(block);
	});
}


DataManager.UpdatePaginationBlock = function(block) {
	if (block.Container != null) {
		if (DataManager.TOTAL_PAGES <= 1) {
			block.Container.setStyle("display", "none");
			
		} else {	
			if (DataManager.CURRENT_PAGE == 1) {
				// block.PageStart.setStyle("display", "none");
			} else {
				// block.PageStart.setStyle("display", "block");
			}
			
			if (DataManager.CURRENT_PAGE == 1) {
				// block.PageBack.setStyle("display", "none");
			} else {
				// block.PageBack.setStyle("display", "block");
			}
			
			if (DataManager.CURRENT_PAGE == DataManager.TOTAL_PAGES) {
				// block.PageNext.setStyle("display", "none");
			} else {
				// block.PageNext.setStyle("display", "block");
			}
			
			if (DataManager.CURRENT_PAGE == DataManager.TOTAL_PAGES) {
				// block.PageLast.setStyle("display", "none");
			} else {
				// block.PageLast.setStyle("display", "block");
			}
			
			if (block.Pages != null) {
				var pages = "";
				
				for (var i = 1; i <= DataManager.TOTAL_PAGES; i++) {
					if (i == DataManager.CURRENT_PAGE) {
						pages += "<span class=\"currentPage\">" + i + "</span>";
					} else {
						pages += "<a class=\"pageLink\" href=\"Javascript:void();\" onclick=\"DataManager.Paginate(" + i + ");\">" + i + "</a>";
					}
				}
				
				block.Pages.innerHTML = pages;
			}
		}
	}
}
