main = function() {
	return {
		
		/***  Variables  ***/
		type	: 'featured',
		page	: 1,
		city	: null,
		perPage	: 12,
		data	: null,
		sort	: 'created-desc',
		cat		: 'All',
		search	: '',
		links	: {},
  
		
		/***  Methods ***/
		init: function() {
			//Init Tone Tabs
			$('#toneTabs li a').click(function(e) {
				e.preventDefault();
				
				//Clear Sort and Cat
				main.sort = "created-desc";
				$('#sortDropdown').val("created-desc").change();
				main.cat = "All";
				$('#catDropdown').val("All").change();
				
				$('#toneTabs li').removeClass('selected');
				if (main.type !== e.target.parentNode.className) {
					main.type = e.target.parentNode.className;
					main.getData();
				}
				
				$(e.target.parentNode).addClass('selected');
			});
			
			//Select current tab
			$('#toneTabs li.' + main.type).addClass('selected');
			
			//Get initial data
			main.getData();
			
			//Initialize Pagination
			$('#toneList div.pagination').click(function(e) {
				if (e.target.tagName !== 'A') {
		          return;
		        }

		        e.preventDefault();
		        var page = $(e.target).text();
				
				switch(page) {
					case 'Previous':
						main.page--;
						break;
					case 'Next':
						main.page++;
						break;
					default:
						main.page = page * 1;
						break;
				}
				
				main.getData();
			});
			
			//Initialize Sort Dropdown
			$('#sortDropdown').change(function() {
				if (main.sort !== $(this).val()) {
					main.sort = $(this).val();
					main.getData();
				}
			});
			
			$('#catDropdown').change(function() {
				if (main.cat !== $(this).val()) {
					main.cat = $(this).val();
					main.getData();
				}
			});
			
			$('#searchButton').click(function(e) {
				e.preventDefault();
				
				if (main.search !== $("#searchTerm").val()) {
					main.search = $("#searchTerm").val();
				}
				
				main.getData();
				
				$("#clearSearch").css("display", "inline");
			});
			
			$("#clearSearch").click(function(e) {
				e.preventDefault();
				
				$("#searchTerm").val('');
				main.search = '';
				
				main.getData();
				
				$("#clearSearch").css("display", "none");
			});
		},

		
		getData: function() {
			/*
				TODO: Loading Div
			*/
			
			$('#toneList div.pagination, #toneList div.results').css('display', 'none');
			
			var params = {
				'type' : main.type,
				'limit' : main.perPage,
				'page' : main.page,
				'sort' : main.sort,
				'cat' : main.cat
			};
			
			if (main.search && main.search != '') {
				params.search = main.search;
			}
			
			var url = main.links.listLink;
			
			$.getJSON(url, params, function(data) {
				if (data.error) {
					return;
				}
				main.data = data;
				
				main.doPagination();
				main.doUpdateList();
			});
		},
		
		doPagination: function() {
			if (main.data.totalCount === 0) {
				/*
					TODO Show Nothing Found
				*/
				return;
			}
			
			var start = (main.page - 1) * main.perPage + 1;
			var end = Math.min(start + main.perPage - 1, main.data.totalCount);
			
			//Pages
			var parts = [];
			var totalPages = Math.ceil(main.data.totalCount / main.perPage);
			
			if (main.page === 1) {
				parts[parts.length] = '<span class="disabled">Previous</span>';
			} else {
				parts[parts.length] = '<a href="#" class="previous">Previous</a>';
			}
			
			var i, pages = [];
			if (totalPages <= 6) { // Ex: 1, 2, 3, 4, 5
				for (i=1; i<=totalPages; i++) {
					pages[pages.length] = i;
				}
			} else if (totalPages > 6 && (main.page <= 2 || main.page >= (totalPages - 3))) { // Ex: 1, 2, 3, ... 70, 71, 72
				pages[pages.length] = 1;
				pages[pages.length] = 2;
				pages[pages.length] = 3;
				pages[pages.length] = "sep";
				pages[pages.length] = totalPages - 2;
				pages[pages.length] = totalPages - 1;
				pages[pages.length] = totalPages;
			} else { // Ex: 1, ... 13, 14, 15, ... 72
				pages[pages.length] = 1;
				pages[pages.length] = "sep";
				pages[pages.length] = main.page;
				pages[pages.length] = main.page + 1;
				pages[pages.length] = main.page + 2;
				pages[pages.length] = "sep";
				pages[pages.length] = totalPages;
			}

			for (i=0; i<pages.length; i++) {
				if (pages[i] == "sep") {
					parts[parts.length] = '<span>...</span>';
				} else {
					if (pages[i] == main.page) {
						parts[parts.length] = '<span class="disabled">' + pages[i] + '</span>';
					} else {
						parts[parts.length] = '<a href="#">' + pages[i] + '</a>';
					}
				}
			}

			if (main.page == totalPages) {
				parts[parts.length] = '<span class="disabled">Next</span>';
			} else {
				parts[parts.length] = '<a href="#" class="next">Next</a>';
			}

			
			$('#toneList div.pagination').html("<span style='color: #444444'>"+main.data.totalCount+" ringtones " + (main.search != '' ? "matching \"" + main.search + "\"" : "") + "</span> "+(parts.length > 3 ? parts.join('') : ''));
			$('#toneList div.pagination').css('display', 'block');
		},
		
		doUpdateList: function() {
			//Clear list
			$('#toneList div.results').empty();
			
			for (var i=0; i<main.data.results.length; i++) {
				var tone = main.data.results[i];
				
				if (!tone.thumbnail) {
					tone.thumbnail = '/images/placeholder.png';
				}
				
				var div = $('<div/>').addClass('tone').addClass(i%3 ? '' : 'first');
				
				var aimg = $('<a/>').attr('href', main.links.showLink + "/" + tone.id);
				var img = $('<img/>').attr('src', tone.thumbnail);
				aimg.append(img);
				
				var albl = $('<a/>').attr('href', main.links.showLink + "/" + tone.id);
				var lbl = $('<label/>').html(tone.title);
				albl.append(lbl);
				
				var downs = $('<span/>').html(tone.downloads + " Download" + (tone.downloads == 1 ? "" : "s"));
				
				div.append(aimg);
				div.append(albl);
				//div.append('<br/>');
				div.append(downs);
				$('#toneList div.results').append(div);
			}
			
			$('#toneList div.results').css('display', 'block');
		}
		
	};
}();