

/**************************************************************

	Script		: Sortable Table
	Version		: 1.4
	Authors		: Samuel Birch
	Desc			: Sorts and filters table elements
	Licence		: Open Source MIT Licence

**************************************************************/
var columnDistinctValues = new Object;
var filters = new Object;

var sortableTable = new Class({
	getOptions: function(){
		return {
			overCls: false,
			onClick: false,
			sortOn: 0,
			sortBy: 'ASC',
			filterHide: true,
			filterHideCls: 'FilterHidden',
			paginationHideCls: 'PaginationHidden',
			filterSelectedCls: 'FilterVisible',
			borderColumns: 1,
			pagination: false,
			pageSize: 10
		};
	},

	initialize: function(table, options) {
	    this.setOptions(this.getOptions(), options);
	    this.currentPage = 1;
		this.table = $(table);
		this.tHead = this.table.getElement('tr[class="thead"]');
		//this.tBody = $$('tbody')[0];
		this.tFoot = this.table.getElement('tr[class="tfoot"]');
		this.elements = $$('tr[class="DataRow"]');
		this.filtered = false;
		this.filters = new Object();
		this.elements.each(function(el,i){
		    el.addClass('FilterVisible');
		    var len = this.elements.length;
			if(this.options.overCls){
				el.addEvent('mouseover', function(){
					el.addClass(options.overCls);
				}, this);
				el.addEvent('mouseout', function(){
					el.removeClass(options.overCls);
				});
			}
			if(this.options.onClick){
				el.addEvent('click', options.onClick);
			}
		}, this);
		
		//setup header
		this.tHead.getElements('th').each(function(el,i){
		    if(el.axis){
				el.addEvent('click', this.sort.bind(this,i));
				el.addEvent('mouseover', function(){
					el.addClass('tableHeaderOver');
				});
				el.addEvent('mouseout', function(){
					el.removeClass('tableHeaderOver');
				});
				el.getdate = function(str){
					// inner util function to convert 2-digit years to 4
					function fixYear(yr) {
						yr = +yr;
						if (yr<50) { yr += 2000; }
						else if (yr<100) { yr += 1900; }
						return yr;
					};
					var ret;
					//
					if (str.length>12){
						strtime = str.substring(str.lastIndexOf(' ')+1);
						strtime = strtime.substring(0,2)+strtime.substr(-2)
					}else{
						strtime = '0000';
					}
					//
					// YYYY-MM-DD
					if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
						return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]) + strtime;
					}
					// DD/MM/YY[YY] or DD-MM-YY[YY]
					if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
						return (fixYear(ret[3])*10000) + (ret[2]*100) + (+ret[1]) + strtime;
					}
					return 999999990000; // So non-parsed dates will be last, not first
				};
				//
				el.findData = function(elem)
				{
					var child = elem.getFirst();
					if(child){
						return el.findData(child);
					}else{
						return elem.innerHTML.trim();
					}
				};
                //				
				el.compare = function(a,b){
					var realIndex = i + options.borderColumns;
					var1 = el.findData(a.getChildren()[realIndex]);
					var2 = el.findData(b.getChildren()[realIndex]);
					//var1 = a.getChildren()[i].firstChild.data;
					//var2 = b.getChildren()[i].firstChild.data;
					
					if(el.axis == 'number'){
						var1 = parseFloat(var1);
						var2 = parseFloat(var2);
						
						if(el.sortBy == 'ASC'){
							return var1-var2;
						}else{
							return var2-var1;
						}
						
					}else if(el.axis == 'string'){
						var1 = var1.toUpperCase();
						var2 = var2.toUpperCase();
						
						if(var1==var2){return 0};
						if(el.sortBy == 'ASC'){
							if(var1<var2){return -1};
						}else{
							if(var1>var2){return -1};
						}
						return 1;
						
					}else if(el.axis == 'date'){
						var1 = parseFloat(el.getdate(var1));
						var2 = parseFloat(el.getdate(var2));
						
						if(el.sortBy == 'ASC'){
							return var1-var2;
						}else{
							return var2-var1;
						}
						
					}else if(el.axis == 'currency'){
						var1 = extractNumber(var1);
						var2 = extractNumber(var2);
						
						if(el.sortBy == 'ASC'){
							return var1-var2;
						}else{
							return var2-var1;
						}
						
					} else if(el.axis == 'image'){
                        var1 = parseFloat(el.getChildById($(a.getChildren()[realIndex]), "imgPriority").value);
                        var2 = parseFloat(el.getChildById($(b.getChildren()[realIndex]), "imgPriority").value);

						if(el.sortBy == 'ASC'){
							return var1-var2;
						}else{
							return var2-var1;
						}
						
				} else if(el.axis == 'logo'){
						var1 = getChildByClass($(a.getChildren()[realIndex]), "LogoText").innerHTML.trim().toUpperCase();
						var2 = getChildByClass($(b.getChildren()[realIndex]), "LogoText").innerHTML.trim().toUpperCase();
						
						if(var1==var2){return 0};
						if(el.sortBy == 'ASC'){
							if(var1<var2){return -1};
						}else{
							if(var1>var2){return -1};
						}
						return 1;
					} else if(el.axis == 'prize'){
						var1 =  extractNumber(getChildByClass($(a.getChildren()[realIndex]), "LogoText").innerHTML.trim().toUpperCase());
						var2 = extractNumber(getChildByClass($(b.getChildren()[realIndex]), "LogoText").innerHTML.trim().toUpperCase());
						if (isNaN(var1)) {
			              var1 = -1;
			            }
			            if (isNaN(var2)) {
			              var2 = -1;
			            }
						if(el.sortBy == 'ASC'){
							return var1-var2;
						}else{
							return var2-var1;
						}
						
    				}
				
				}
				
				if(i == this.options.sortOn){
					el.fireEvent('click');
				}
			}
		}, this);
		if(this.options.pagination){
			this.paginate(this.currentPage);
		}
	},
	
	sort: function(index){
		if(this.options.onStart){
			this.fireEvent('onStart');
		}
        
       // index = index+this.options.borderColumns-1;		
		this.options.sortOn = index;
		var header = this.tHead.getElements('th');
		var el = header[index];
		
		var sortingArrow;
		
		header.each(function(e,i)
		{
			// Hide the sorting arrow
			sortingArrow = e.getPrevious();
	        sortingArrow.set('html', '');
			
			if(i != index)
			{
				e.removeClass('sortedASC');
				e.removeClass('sortedDESC');
			}
		});
		
		// Show the sorting arrow
		sortingArrow = el.getPrevious();
		sortingArrow.style.visibility = 'visible';
		var descSortImage = '&uarr;';
		var ascSortImage = '&darr;';
		
		if(el.hasClass('sortedASC'))
		{
			el.removeClass('sortedASC');
			el.addClass('sortedDESC');
			el.sortBy = 'DESC';
		    
		    // Set the down arrow for DESC sorting
		    sortingArrow.set('html', descSortImage);
		}
		else if(el.hasClass('sortedDESC'))
		{
			el.removeClass('sortedDESC');
			el.addClass('sortedASC');
			el.sortBy = 'ASC';
			
		    // Set the up arrow for ASC sorting
		    sortingArrow.set('html', ascSortImage);
		}
		else
		{
			if(this.options.sortBy == 'ASC')
			{
				el.addClass('sortedASC');
				el.sortBy = 'ASC';
				
	            // Set the up arrow for ASC sorting
	            sortingArrow.set('html', ascSortImage);
			}
			else if(this.options.sortBy == 'DESC'){
				el.addClass('sortedDESC');
				el.sortBy = 'DESC';
				
	            // Set the up arrow for DESC sorting
	            sortingArrow.set('html', descSortImage);
			}
		}
		//
		this.elements.sort(el.compare);
		//this.elements.injectInside(this.tBody);
		this.elements.injectAfter(this.tHead);
		//
		if(this.filtered){
			this.filteredAltRow();
		}else{
			this.altRow();
		}
		if(this.options.pagination){
			this.paginate(this.currentPage);
		}
		//
		if(this.options.onComplete){
			this.fireEvent('onComplete');
		}
	},
	
	altRow: function(){
		this.elements.each(function(el,i){
			if(i % 2){
				el.removeClass('altRow');
			}else{
				el.addClass('altRow');
			}
		});
	},
	
	filteredAltRow: function(){
		this.table.getElements('.'+this.options.filterSelectedCls).each(function(el,i){
			if(i % 2){
				el.removeClass('altRow');
			}else{
				el.addClass('altRow');
			}
		});
	},
	
	
	
	filter: function(){
		var column = parseInt($('FilterColumnID').value);
		var col = column + this.options.borderColumns - 1;
		var key = extractNumber($('FilterContent').value);
		var filterType = $('FilterType');
		var filter = new Object;
		filterType = filterType.options[filterType.selectedIndex].text;
		
		filter['FilterContent'] = key;
		filter['filterType'] = filterType;
		filters[column]=filter;
		
//				el.addEvent('click',this.clearFilter.bind(this));
		if(key){
		this.setFilterMessage();
		var filterId = 'FilterID'+col;
		var image = this.table.getElement('img[class="'+filterId+'"]');
		image.setProperty('src','/FeedTemplates/Images/Funnel_Double.jpg');
		this.elements.each(function(el,i){

			// Determines if the element should be filtered according to the specified filterContent and filterType
			el.ShouldBeVisible = function()	{
			    var dataToFilter = getChildByClass(el.getChildren()[col], "FilterKey").innerHTML.toLowerCase().trim();
			    var number = extractNumber(dataToFilter);
			    if (isNaN(number)) {
			        number = -1;
			    }
			    if (!isNaN(number) && !isNaN(key))   {
			        switch(filterType)
			        {
			            // **** Equal to ****
			            case '=':
        			        return number == key;
    			        
			                break;
			            // **** Not equal to ****
			            case '\u2260':
        			        return number != key;
    			        
			                break;
			            // **** Less than ****
			            case '<':
        			        return number < key;
    			        
			                break;
			            // **** Less than or equal to ****
			            case '\u2264':
        			        return number <= key;
    			        
			                break;
			            // **** Bigger than ****
			            case '>':
        			        return number > key;
    			        
			                break;
			            // **** Bigger than or equal to****
			            case '\u2265':
        			        return number >= key;
    			        
			                break;
			        }
			    }
			    else // isNumeric == false
			    {
			        return true;
			    }
			    
			}
			
			if(this.options.filterHide){
				el.removeClass('altRow');
			}
			
			this.setFilterState(el, el.ShouldBeVisible() , column);
			
    	}, this);
    	
		if(this.options.filterHide){
			this.filteredAltRow();
			this.filtered = true;
		}
		}
		if(this.options.pagination){
			this.paginate(this.currentPage);
		}
	},
	
	
	setFilterState:function(el, shouldBeVisible, column) {
	    var filterClass = this.options.filterHideCls + column;
	    var filterCount = parseInt(el.getProperty('filterCount'));
	    if (isNaN(filterCount)) {
	        filterCount = 0;
	    }
	    if (shouldBeVisible) {
	        // Remove previous Filter
	        if (el.hasClass(filterClass)) {
	            el.removeClass(filterClass);
                filterCount--;
                el.set('filterCount',filterCount);
                if (filterCount==0) {
                    el.addClass(this.options.filterSelectedCls);
	            }
	        } 
	    } 
	    else  { // el.ShouldBeVisible() == false 
	        el.removeClass(this.options.filterSelectedCls);
		    if (!el.hasClass(filterClass)) {
                filterCount++;  
                el.addClass(filterClass);  
                el.set('filterCount',filterCount);
            }
	    }
	},
    

	listFilter: function(){
	    var inputChecks = $$('input[id=ListFilterCheckId]');
	    var checkedItems = new Object();
	    inputChecks.each(function(el,i){
	        if (el.getProperty("checked")) {
	            checkedItems[el.getProperty("value")]=el.getProperty("value");
	        }
	    });
	    this.setFilterMessage();
		var column = parseInt($('ListFilterColumnID').value);
		var col = column + this.options.borderColumns - 1;
		
		var filter = new Object;
		filter['Type']='ListFilter';
		filter['SelectedValues'] = checkedItems;
		filters[column]=filter;
		
		var filterId = 'FilterID' + col;
		var image = this.table.getElement('img[class="'+filterId+'"]');
		image.setProperty('src','/FeedTemplates/Images/Funnel_Double.jpg');
		
		this.elements.each(function(el,i) {
			// Determines if the element should be filtered according to the specified filterContent and filterType
			el.ShouldBeVisible = function()	{
			    var dataToFilter = getChildByClass(el.getChildren()[col], "FilterKey").innerHTML.toLowerCase().trim();
			    return checkedItems[dataToFilter]==dataToFilter;
			    //return true;
			}
			
			if(this.options.filterHide){
				el.removeClass('altRow');
			}
			this.setFilterState(el, el.ShouldBeVisible(), column);
	    
		}, this);
		if(this.options.filterHide){
			this.filteredAltRow();
			this.filtered = true;
		}
		if(this.options.pagination){
			this.paginate(this.currentPage);
		}
	},
	
	clearFilters: function(){
   	    this.clearFilterMessage();
	    for( col in filters) {
	        this.baseClearFilter(col);
	        delete filters[col];
	    }
	},
	
	setFilterMessage: function(){
	    var filterMessage = $('FilterMessageID');
	    if (filterMessage != null) {
	        filterMessage.setProperty('class','FilterText');
	    }
	},
	
	clearFilterMessage: function(){
	    var filterMessage = $('FilterMessageID');
	    if (filterMessage != null) {
	        filterMessage.setProperty('class','Invisible');
	    }    
	},

	clearFilter: function(type){
	    var col;
	    if (type=='ListFilter') {
	        col = $('ListFilterColumnID').value;
	    } else {
	        col = $('FilterColumnID').value;
	    }    
	    delete filters[col];
	    var filtersLen=0;
	    for (i in filters){
	        filtersLen++;
	    }
	    if(filtersLen==0){
	        this.clearFilterMessage();
	    }
	    this.baseClearFilter(col);
	},
	
	baseClearFilter: function(column){
	    var col = parseInt(column) + this.options.borderColumns - 1;
	    var filterId = 'FilterID'+col;
		var image = this.table.getElement('img[class="'+filterId+'"]');
		image.setProperty('src','/FeedTemplates/Images/Funnel.jpg');
	
		this.elements.each(function(el,i){
			this.setFilterState(el, true, column);
		}, this);
		
		if(this.options.filterHide){
			this.altRow();
			this.filtered = false;
		}
		if(this.options.pagination){
			this.paginate(this.currentPage);
		}
	},
	

    paginate: function(page) {
        if (!isNaN(page)) {
            this.currentPage = page ;
        }
        var visibleElements = $$('tr.FilterVisible');
        var visibleElementsCount = visibleElements.length;
        var pagesCount = Math.ceil(visibleElementsCount / this.options.pageSize)
        
        if ( pagesCount < page ) {
            this.currentPage = pagesCount;
        }
        if  (  this.currentPage == 0 ) {
             this.currentPage = 1 ;
        }
     
        var col = $('ListFilterColumnID').value;
	    var visibleRangeBottom = this.options.pageSize * (this.currentPage -1);
	    var visibleRangeTop = this.options.pageSize * this.currentPage;
	    visibleElements.each(function(el,i){
	         if (i >= visibleRangeBottom && i < visibleRangeTop) {
	            el.removeClass('PaginationHidden');
	         } else {
	            el.addClass('PaginationHidden');
	         }
	    });
	    this.createPager(pagesCount);
	},
	
	createPager: function(pagesCount) {
	    var pageNumbers = $$('a[class="PageNumber"]');
	    pageNumbers.each(function(oldPageNumber,i) {
	        oldPageNumber.dispose();
	    });
	    var pager=$('bottomID');
	    if (pagesCount>1) {
	        for ( var i=1;i<=pagesCount;i++) {
	          var page = new Element('a',{"href":"javascript:feedTable.paginate("+i+");","html":i+"&nbsp;","class":"PageNumber", "style":(i==this.currentPage)?"color:rgb(255,233,2);;":""});
	           page.injectInside(pager);
	        }//end for
	    }
	},

	createCheckFilterValues:function (columnNumber){ 
	    col = columnNumber + this.options.borderColumns - 1;
	    //var elements = $$('tr[class="DataRow"]');
	    columnDistinctValues = new Object;
	    this.elements.each(function(el,i){
	        var dataToFilter = getChildByClass(el.getChildren()[col],"FilterKey").innerHTML.toLowerCase().trim();
	        columnDistinctValues[dataToFilter]=dataToFilter;
	    });
	    var containerTd = $('ListFilterContainer');
	    // Clear Previous Checks
	    var inputChecks = $$('[id=ListFilterCheckId]');
	    inputChecks.each(function(el,i){
	         el.dispose();
	    });
	    for (var i in columnDistinctValues)  {
	        var checked = "";
	        var filter = filters[columnNumber];
	        var selectedValues; 
	        if (filter != null) {
	            selectedValues = filter['SelectedValues'];
	            if (selectedValues != null) {
                   if ( selectedValues[i] != null) {
                         checked = "checked";
                   }
	            } 
	        }          
	        var check = new Element ( "input" , { "id":"ListFilterCheckId" , "type" : "checkbox", "name" : "listfiltername","value" : columnDistinctValues[i],"checked":checked}) ;
	        check.addEvent('click', function() { uncheckCheckAll('Form2');  
         });  
	        check.injectInside(containerTd);
	        var span = new Element ( "span", {"id":"ListFilterCheckId"});
	        span.innerHTML	=  columnDistinctValues[i];
	        span.injectAfter(check);
	        var br = new Element ('br',{"id":"ListFilterCheckId"});
	        br.injectAfter(span);
        }
    }   


});
sortableTable.implement(new Events);
sortableTable.implement(new Options);

/*************************************************************/

