// tableSort comes from The Art & Science of JavaScript by Sitepoint
var Form = {
	init: function(){
		var searchButtons = Core.getElementsByClass("search");
		for (var i = 0; i < searchButtons.length; i++){
			Core.addEventListener(searchButtons[i], "click", Form.showLines);
		}
		var today = new Date();
		// Set the Month Selections to current
		var thisMonth = today.getMonth();
		document.forms["form1"]["monthBox"].selectedIndex = thisMonth;
		// Set the Year Selections
		var thisYear = today.getFullYear();
        var yearChooser = document.forms["form1"]["yearBox"];
		while (yearChooser.options.length != 0){
			yearChooser.options[0] = null;
		}
        for (var i = thisYear - 1, n = thisYear + 1; i <= n; i++) {
        	yearChooser.options[yearChooser.options.length] = new Option(i, i);
        }
		document.forms["form1"]["yearBox"].selectedIndex = 1;
		Form.makeDaysCol();
		Form.hideDateCol();
		Form.showLines();
//		Form.advancedToggle();
//		Core.addEventListener(document.getElementById("graphSelect"), "change", Form.advancedToggle);
//		Stats.init();		
	},
	showLines: function(){
		var month = Form.selectBox("monthBox");
		var monthText = Form.selectBoxText("monthBox");
		var year = Form.selectBox("yearBox");
		var events = document.getElementById("eventsTable");
		var bodyRows = events.tBodies[0].rows;
		for (var i = 0, n = bodyRows.length; i < n; i++){
			var cell = bodyRows[i].cells[1];
			var row = bodyRows[i];
			var cellDate = cell.textContent ? cell.textContent : cell.innerText;
			var eDate = new Date(cellDate);
			var eMonth = eDate.getMonth();
			var eYear = eDate.getFullYear();
			if ((month == eMonth) && (year == eYear)){
				if (Core.hasClass (row, "hidden")){
					Core.removeClass (row, "hidden");
				}
			} else {
				if (!(Core.hasClass (row, "hidden"))){
					Core.addClass (row, "hidden");
				}
			}
		}
		// change header
		var target = document.getElementById("tableHeader");
		Core.removeAllChildren(target);
		var newHeader = document.createTextNode(monthText + " " + year + " Events");
		target.appendChild(newHeader);
	},
	makeDaysCol: function(){
		var events = document.getElementById("eventsTable");
		var bodyRows = events.tBodies[0].rows;
		for (var i = 0, n = bodyRows.length; i < n; i++){
			var cell = bodyRows[i].cells[1];
			var cellDate = cell.textContent ? cell.textContent : cell.innerText;
			var thisDate = new Date(cellDate);
			var thisDay = thisDate.getDate();
			var textA = document.createTextNode(thisDay);
			bodyRows[i].cells[0].appendChild(textA);
		}
	},
	hideDateCol: function(){
		var eventsTable = document.getElementById("eventsTable")
		var rows = eventsTable.rows;
//		alert (rows.length);
		for (var i = 0, n = rows.length; i < n; i++){
			var cell = rows[i].cells[1];
			Core.addClass(cell, "neverShow");
		}
	},
	advancedToggle: function(){
		var advancedOptions = Core.getElementsByClass("graphDates");
		var graph = Form.selectBox("graphSelect");
		for (var j = 0; j < advancedOptions.length; j++){	
			if (Core.hasClass(advancedOptions[j], graph)){
				Core.removeClass(advancedOptions[j], "hidden");
			}else{Core.addClass(advancedOptions[j], "hidden");}
		}
	},
	selectBox: function(name){return document.forms["form1"][name].value;},
	selectBoxText: function(name){
		var index = document.forms["form1"][name].selectedIndex;
		return document.forms["form1"][name][index].text;
	}
};

function TableSort(id) {
    this.tbl = document.getElementById(id);
    this.lastSortedTh = null;
    if (this.tbl && this.tbl.nodeName == "TABLE") {
        var headings = this.tbl.tHead.rows[0].cells;
        for (var i=0; headings[i]; i++) {
            if (headings[i].className.match(/asc|dsc/)) {
                this.lastSortedTh = headings[i];
            }
        }
        this.makeSortable();
    }
}

TableSort.prototype.makeSortable = function () {
    var headings = this.tbl.tHead.rows[0].cells;
    for (var i=0; headings[i]; i++) {
	    headings[i].cIdx = i;
        var a = document.createElement("a");
            a.href = "#";
            a.innerHTML = headings[i].innerHTML;
            a.onclick = function (that) {
                return function () {
                    that.sortCol(this);
                    return false;
                }
            }(this);
        headings[i].innerHTML = "";
        headings[i].appendChild(a);
    }
}

TableSort.prototype.sortCol = function (el) {
    /*
     * Get cell data for column that is to be sorted from HTML table
     */
    var rows = this.tbl.rows;
    var alpha = [], numeric = [];
    var aIdx = 0, nIdx = 0;
    var th = el.parentNode;
    var cellIndex = th.cIdx;
    for (var i=1; rows[i]; i++) {
        var cell = rows[i].cells[cellIndex];
        var content = cell.textContent ? cell.textContent : cell.innerText;
        /*
         * Split data into two separate arrays, one for numeric content and 
         * one for everything else (alphabetic). Store both the actual data
         * that will be used for comparison by the sort algorithm (thus the need
         * to parseFloat() the numeric data) as well as a reference to the 
         * element's parent row. The row reference will be used after the new
         * order of content is determined in order to actually reorder the HTML
         * table's rows.
         */
        var num = content.replace(/(\$|\,|\s)/g, "");
          if (parseFloat(num) == num) { 
            numeric[nIdx++] = {
                value: Number(num),
                row: rows[i]
            }
        } else {
            alpha[aIdx++] = {
                value: content,
                row: rows[i]
            }
        }
    }
    
    /*
     * Sort according to direction (ascending or descending)
     */
    var col = [], top, bottom;
    if (th.className.match("asc")) {
        top = bubbleSort(alpha, -1);
        bottom = bubbleSort(numeric, -1);
        th.className = th.className.replace(/asc/, "dsc");
    } else {
        top = bubbleSort(numeric, 1);
        bottom = bubbleSort(alpha, 1);
        if (th.className.match("dsc")) {
            th.className = th.className.replace(/dsc/, "asc");
        } else {
            th.className += "asc";
        }
    }
    
    /*
     * Clear asc/dsc class names from the last sorted column's th if it isnt the
     * same as the one that was just clicked
     */
    if (this.lastSortedTh && th != this.lastSortedTh) {
        this.lastSortedTh.className = this.lastSortedTh.className.replace(/dsc|asc/g, "");
    }
    this.lastSortedTh = th;
    
    /*
     *  Reorder HTML table based on new order of data found in the col array
     */
    col = top.concat(bottom);
    var tBody = this.tbl.tBodies[0];
    for (var i=0; col[i]; i++) {
        tBody.appendChild(col[i].row);
    }
}

function bubbleSort(arr, dir) {
    // Pre-calculate directional information
    var start, end;
    if (dir === 1) {
        start = 0;
        end = arr.length;
    } else if (dir === -1) {
        start = arr.length-1;
        end = -1;
    }
    
    // Bubble sort: http://en.wikipedia.org/wiki/Bubble_sort
    var unsorted = true;
    while (unsorted) {
        unsorted = false;
        for (var i=start; i!=end; i=i+dir) {
            if (arr[i+dir] && arr[i].value > arr[i+dir].value) {
                var a = arr[i];
                var b = arr[i+dir];
                var c = a;
                arr[i] = b;
                arr[i+dir] = c;
                unsorted = true;
            }
        }
    }
    return arr;
}
var Table = {
	init: function(){
		var sales = new TableSort("eventsTable");
		Form.init();
	}
};
Core.start(Table);