/*
 * file: modulex.actions.js
 * -
 * What: Modulex HTML actions main Object
 * When: -
 * Why: -
 */

/*
 * object: Modulex.Actions
 * -
 * What: 
 * When: 
 * Why: 
 */
 
Modulex.Actions = {

	/*
	 * function: Modulex.Actions.filterAllModels()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	filterAllModels: function() {
	
		/* Set runtime model array to original Array */
		gModulexModelArray_runtime = gModulexModelArray.slice();
		
		/* Re-order category 1 first*/
		for(var i=0;i<gModulexModelArray_runtime.length;i++) {
		
			/* if category 1 add to the front of the Array */
			if(gModulexModelArray_runtime[i].category.inArray("1")) {
				var cat1Element = gModulexModelArray_runtime[i];
				gModulexModelArray_runtime.splice(i, 1);
				gModulexModelArray_runtime.unshift(cat1Element);
			}
		}
		
		/* Unset Category and Sorting variables */
		gModulexCurrentCategory = undefined;
		gModulexCurrentSorting = undefined;
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		/* Unset searchBox */
		$("searchBox").value = $("searchBox").defaultValue;
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentPriceRange) {
			Modulex.Actions.filterModelsByPriceRange(gModulexCurrentPriceRange);
		}
		
		Modulex.Display.updateCategoryList();
		Modulex.Display.updatePriceRangeList();
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},

	/*
	 * function: Modulex.Actions.filterModelsByCategory()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	filterModelsByCategory: function(categoryId) {
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentCategory || gModulexCurrentPriceRange) {
			var originalArray = gModulexModelArray.slice();
		} else {
			var originalArray = gModulexModelArray_runtime;
		}
		
		var filteredArray = new Array();
		
		/* Parsing each element of the Array */
		for(var i=0;i<originalArray.length;i++) {
		
			/* if category 1 add to the front of the Array */
			if(originalArray[i].category.inArray("1") && originalArray[i].category.inArray(categoryId.toString())) {
				filteredArray.unshift(originalArray[i]);
				
			/* Else regular push */
			} else if(originalArray[i].category.inArray(categoryId.toString())) {
				filteredArray.push(originalArray[i]);
			}
		}
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentPriceRange) {
			
			originalArray = filteredArray.slice();
			filteredArray = new Array();
		
			/* Parsing each element of the Array */
			for(var i=0;i<originalArray.length;i++) {
				
				/* if category 1 add to the front of the Array */
				if(originalArray[i].category.inArray("1") && originalArray[i].priceRange == gModulexCurrentPriceRange.toString()) {
					filteredArray.unshift(originalArray[i]);
					
				/* Else regular push */
				} else if(originalArray[i].priceRange == gModulexCurrentPriceRange.toString()) {
					filteredArray.push(originalArray[i]);
				}
			}
		}
		
		gModulexModelArray_runtime = filteredArray.slice();
		
		/* Set current Category and Sorting variables */
		gModulexCurrentCategory = categoryId;
		gModulexCurrentSorting = undefined;
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		/* Unset searchBox */
		$("searchBox").value = $("searchBox").defaultValue;
		
		Modulex.Display.updateCategoryList();
		Modulex.Display.updatePriceRangeList();
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.filterAllPriceRange()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	filterAllPriceRange: function() {
	
		/* Set runtime model array to original Array */
		gModulexModelArray_runtime = gModulexModelArray.slice();
		
		/* Re-order category 1 first*/
		for(var i=0;i<gModulexModelArray_runtime.length;i++) {
		
			/* if category 1 add to the front of the Array */
			if(gModulexModelArray_runtime[i].category.inArray("1")) {
				var cat1Element = gModulexModelArray_runtime[i];
				gModulexModelArray_runtime.splice(i, 1);
				gModulexModelArray_runtime.unshift(cat1Element);
			}
		}
		
		/* Unset PriceRange and Sorting variables */
		gModulexCurrentPriceRange = undefined;
		gModulexCurrentSorting = undefined;
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		/* Unset searchBox */
		$("searchBox").value = $("searchBox").defaultValue;
		
		/* if category selected filter by category */
		if(gModulexCurrentCategory) {
			Modulex.Actions.filterModelsByCategory(gModulexCurrentCategory);
		}
		
		Modulex.Display.updateCategoryList();
		Modulex.Display.updatePriceRangeList();
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.filterModelsByPriceRange()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	filterModelsByPriceRange: function(priceRangeId) {
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentPriceRange || gModulexCurrentCategory) {
			var originalArray = gModulexModelArray.slice();
		} else {
			var originalArray = gModulexModelArray_runtime;
		}
		
		var filteredArray = new Array();
		
		/* Parsing each element of the Array */
		for(var i=0;i<originalArray.length;i++) {
		
			/* if category 1 add to the front of the Array */
			if(originalArray[i].category.inArray("1") && originalArray[i].priceRange == priceRangeId.toString()) {
				filteredArray.unshift(originalArray[i]);
				
			/* Else regular push */
			} else if(originalArray[i].priceRange == priceRangeId.toString()) {
				filteredArray.push(originalArray[i]);
			}
		}
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentCategory) {
			
			originalArray = filteredArray.slice();
			filteredArray = new Array();

			/* Parsing each element of the Array */
			for(var i=0;i<originalArray.length;i++) {
			
				/* if category 1 add to the front of the Array */
				if(originalArray[i].category.inArray("1") && originalArray[i].category.inArray(gModulexCurrentCategory.toString())) {
					filteredArray.unshift(originalArray[i]);
					
				/* Else regular push */
				} else if(originalArray[i].category.inArray(gModulexCurrentCategory.toString())) {
					filteredArray.push(originalArray[i]);
				}
			}
		}
		
		gModulexModelArray_runtime = filteredArray.slice();
		
		/* Set current PriceRange and Sorting variables */
		gModulexCurrentPriceRange = priceRangeId;
		gModulexCurrentSorting = undefined;
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		/* Unset searchBox */
		$("searchBox").value = $("searchBox").defaultValue;
		
		Modulex.Display.updateCategoryList();
		Modulex.Display.updatePriceRangeList();
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.filterModelsByName()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	filterModelsByName: function(searchString) {
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentPriceRange || gModulexCurrentCategory) {
			var originalArray = gModulexModelArray.slice();
		} else {
			var originalArray = gModulexModelArray_runtime;
		}
		
		var filteredArray = new Array();
		
		//var nameRegExp = /(searchString.toString())/i;
		var nameRegExp = new RegExp(searchString.toLowerCase());
		
		/* Parsing each element of the Array */
		for(var i=0;i<originalArray.length;i++) {
			
			if(originalArray[i].name.toLowerCase().match(nameRegExp)) {

				/* if category 1 add to the front of the Array */
				if(originalArray[i].category.inArray("1")) {
					filteredArray.unshift(originalArray[i]);
					
				/* Else regular push */
				} else {
					filteredArray.push(originalArray[i]);
				}
			
			}
		}
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentCategory) {
			
			originalArray = filteredArray.slice();
			filteredArray = new Array();

			/* Parsing each element of the Array */
			for(var i=0;i<originalArray.length;i++) {
			
				/* if category 1 add to the front of the Array */
				if(originalArray[i].category.inArray("1") && originalArray[i].category.inArray(gModulexCurrentCategory.toString())) {
					filteredArray.unshift(originalArray[i]);
					
				/* Else regular push */
				} else if(originalArray[i].category.inArray(gModulexCurrentCategory.toString())) {
					filteredArray.push(originalArray[i]);
				}
			}
		}
		
		/* if priceRange selected filter by priceRange */
		if(gModulexCurrentPriceRange) {
			
			originalArray = filteredArray.slice();
			filteredArray = new Array();
		
			/* Parsing each element of the Array */
			for(var i=0;i<originalArray.length;i++) {
				
				/* if category 1 add to the front of the Array */
				if(originalArray[i].category.inArray("1") && originalArray[i].priceRange == gModulexCurrentPriceRange.toString()) {
					filteredArray.unshift(originalArray[i]);
					
				/* Else regular push */
				} else if(originalArray[i].priceRange == gModulexCurrentPriceRange.toString()) {
					filteredArray.push(originalArray[i]);
				}
			}
		}
		
		gModulexModelArray_runtime = filteredArray.slice();
		
		/* Set current PriceRange and Sorting variables */
		//gModulexCurrentPriceRange = priceRangeId;
		//gModulexCurrentSorting = undefined;
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		Modulex.Display.updateCategoryList();
		Modulex.Display.updatePriceRangeList();
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},

	/*
	 * function: Modulex.Actions.sortModelsByName()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	sortModelsByName: function() {
	
		if(gModulexCurrentSorting == "ByName") {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.name.toLowerCase();
			    var y = b.name.toLowerCase();
			    return ((x > y) ? -1 : ((x < y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByNameDesc";
		} else {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.name.toLowerCase();
			    var y = b.name.toLowerCase();
			    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByName";
		}
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.sortModelsByRoomNumber()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	sortModelsByRoomNumber: function() {
	
		if(gModulexCurrentSorting == "ByRoomNumber") {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.roomNumber.toLowerCase();
			    var y = b.roomNumber.toLowerCase();
			    return ((x > y) ? -1 : ((x < y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByRoomNumberDesc";
		} else {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.roomNumber.toLowerCase();
			    var y = b.roomNumber.toLowerCase();
			    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByRoomNumber";
		}
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.sortModelsBySurface()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	sortModelsBySurface: function() {
	
		if(gModulexCurrentSorting == "BySurface") {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.surface.toLowerCase();
			    var y = b.surface.toLowerCase();
			    return ((x > y) ? -1 : ((x < y) ? 1 : 0));
			});
			gModulexCurrentSorting = "BySurfaceDesc";
		} else {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.surface.toLowerCase();
			    var y = b.surface.toLowerCase();
			    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
			});
			gModulexCurrentSorting = "BySurface";
		}
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	},
	
	/*
	 * function: Modulex.Actions.sortModelsByPriceRange()
	 * -
	 * What: 
	 * When: 
	 * Why: 
	 */
	 
	sortModelsByPriceRange: function() {
	
		if(gModulexCurrentSorting == "ByPriceRange") {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.priceRange.toLowerCase();
			    var y = b.priceRange.toLowerCase();
			    return ((x > y) ? -1 : ((x < y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByPriceRangeDesc";
		} else {
			gModulexModelArray_runtime.sort(function(a, b){
			    var x = a.priceRange.toLowerCase();
			    var y = b.priceRange.toLowerCase();
			    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
			});
			gModulexCurrentSorting = "ByPriceRange";
		}
		
		/* Reset to first page */
		gModulexModelDisplayCount_start = 0;
		gModulexModelDisplayCount_end = gModulexModelDisplayCount;
		
		Modulex.Display.updateModelTableHead();
		Modulex.Display.updateModelList();
		
		return true;
	}
}
