﻿var searchResults;

jQuery(
    function(){
    	function mkSearchResults(results, pagerLabel, sorterCells){
	    var _itemsPerPage	= 10;
	    var _availSorts	= [ 'photo', 'year', 'make', 'model', 'price', 'km', 'certified' ];

	    var _currentPage	= 1;
	    var _sortCriteria	= 'none'; // possible values in _availSorts
	    var _isSortUp	= true;

	    var _public; // exported functions, defined at the bottom

	    var _list		= mkList(results, _itemsPerPage);

	    var totalPages	= Math.ceil(_list.getLength() / _itemsPerPage);
	    var _pager		= mkPager(totalPages, pagerLabel);

	    var _sorterRow	= mkSorterRow(sorterCells, _availSorts);

	    /******************************************************************/

	    function mkSorterRow(cells, availSorts){
	    	// classes
	    	var selected	= 'selected';
	    	var ascending	= 'asc';
	    	var descending	= 'des';

	    	// addEvents
	    	cells.each(
		    function(i){
			jQuery(this).click( function(){ _public.sortBy(_availSorts[i]); } );
		    }
		);

		return {
		    'updateDisplay'	: function(sortCriteria, isSortUp){
		    	cells.each(
			    function(i){
			    	if(availSorts[i] == sortCriteria){
			    	    jQuery(this).addClass(selected).children().removeClass().addClass( isSortUp ? ascending : descending );
				} else {
				    jQuery(this).removeClass(selected).children().removeClass();
				}
			    }
			);
		    }
		};
	    }

	    /******************************************************************/

	    function mkList(results, itemsPerPage){
		var _lang		= jQuery('html').attr('lang').substr(0,2).toLowerCase() == 'fr' ? 'fr' : 'en';
	    	var _items		= mkItems(results);
	    	var _itemsPerPage	= itemsPerPage;

	    	function mkItems(results){
		    var node;
		    var next;
		    var items = [];
		    for(var i = 0, j = 0; i < results.length; i += 2, ++j){
		    	node	= jQuery(results[i]);
		    	next	= node.next();
			items[j]= mkItem(node, next);
		    }
		    return items;
		}

		function mkItem(specs, description){
		    var item		= {};
		    item.specs		= specs;
		    item.description	= description;
		    item.hasPhoto	= specs.find('th:eq(0) > a > img').attr('src') != '';
		    item.year		= parseInt(specs.find('th:eq(1)').text(), 10);
		    item.make		= specs.find('th:eq(2)').text();
		    item.model		= specs.find('th:eq(3)').text();
		    item.price		= parseFloat(remSep(specs.find('th:eq(4)').text()), 10);
		    item.km		= parseFloat(remSep(specs.find('th:eq(5)').text()), 10);
		    item.isCertified	= specs.find('th:eq(6)').text().length > 0;
		    return item;
		}

		function remSep(str){
		    if(_lang == 'fr') str = str.replace(',', '.');
		    var num = str.replace(/[^0-9.]/g, '');
		    if(num == '') num = 0;
		    return num;
		}

		var _sorters	= {
		  'photo'	: function(a, b){ return (a.hasPhoto ? 1 : 0) - (b.hasPhoto ? 1 : 0); },
		  'year'	: function(a, b){ return a.year - b.year;},
		  'make'	: function(a, b){ return a.make.toLowerCase() < b.make.toLowerCase() ? -1 : 1;},
		  'model'	: function(a, b){ return a.model.toLowerCase() < b.model.toLowerCase() ? -1 : 1;},
		  'price'	: function(a, b){ return a.price - b.price; },
		  'km'	        : function(a, b){ return a.km - b.km; },
		  'certified'	: function(a, b){ return (a.isCertified ? 1 : 0) - (b.isCertified ? 1 : 0); }
		};

		function sortItems(sortCriteria, isSortUp){
		    var sorterFun	= _sorters[sortCriteria];

		    if(sorterFun == null) return _items;

		    var sortFun;
		    if(isSortUp) sortFun	= function(a, b){ return sorterFun(a, b); };
		    else sortFun		= function(a, b){ return sorterFun(b, a); };
		    return _items.sort( sortFun );
		}

		return {
	    	    'getLength'		: function(){ return _items.length; },
	    	    'getDisplay'	: function(pageNum, sortCriteria, isSortUp){
	    	    	var items	= sortItems(sortCriteria, isSortUp);
			var container	= jQuery('<tbody></tbody>');
			var start	= (pageNum - 1) * _itemsPerPage;
			var end		= start + _itemsPerPage;
			if(end > items.length) end = items.length;
			for(var i = start; i < end; ++i){
			    container.append(items[i].specs).append(items[i].description);
			}
			return container;
	    	    }
	    	};
	    }

	    /******************************************************************/

	    function mkPager(totalPages, label){
		var _totalPages		= totalPages;
		var _container		= '<div class="pager"><span>'+label+'</span></div>';
		var _selectedPage	= '<a class="selected"></a>';
		var _regularPage	= '<a></a>';

		// jQuery live-event used to work arround ie6/7
		jQuery('.pager a:not(.selected)').live(
		    'click',
		    function(){
			searchResults.viewPage(jQuery(this).attr('data-index'));
		    }
		);

		return {
		    'getDisplay'	: function(pageNum){
			var container	= jQuery(_container);
			var page;
			for(var i = 1; i <= _totalPages; ++i){
			    if(i == pageNum) page = jQuery(_selectedPage);
			    else page = jQuery(_regularPage);
			    page.append(i);
			    page.attr('data-index', i);
			    container.append(page);
			}
			return container;
		    }
		};
	    }

	    /******************************************************************/

	    function display(pageNum, sortCriteria, isSortUp){
		var pager	= _pager.getDisplay(pageNum);
		jQuery('#preownedList > .pager').replaceWith(pager);

		var tbody	= _list.getDisplay(pageNum, sortCriteria, isSortUp);
		jQuery('#preownedList > table:first > tbody').replaceWith(tbody);

		_sorterRow.updateDisplay(sortCriteria, isSortUp);
	    }

	    /******************************************************************/

	    _public = {
		'viewPage'	: function(pageNum){
		    _currentPage	= pageNum;
		    display(_currentPage, _sortCriteria, _isSortUp);
		},

		'sortBy'	: function(sortCriteria){
		    _sortCriteria	= sortCriteria;
		    _isSortUp		= !_isSortUp;
		    display(_currentPage, _sortCriteria, _isSortUp);
		}
	    };
	    return _public;
	}
	var results	= jQuery('#preownedList > table:first > tbody > tr');
	var pagerLabel	= jQuery('#preownedList > .pager:first > span:first').text();
	var sorterCells	= jQuery('#preownedList > table:first').addClass('dyn').find('thead > tr > th');
	searchResults	= mkSearchResults(results, pagerLabel, sorterCells);

    	searchResults.viewPage(1);
    }
);
