// tableSort comes from The Art & Science of JavaScript by Sitepoint
var Cookie = {
	setCookie: function(){
		var bodyId = document.body.id;
		var office = Form.selectBox("officeSelect");
		var theCookie = bodyId + "=" + office;
		document.cookie = theCookie;		
	},
	readCookie: function(target){
		var cookies = document.cookie.split("; ");
		for (var i = 0; i < cookies.length; i++){
			var cookieCrumbs = cookies[i].split("=");
			var cookieName = cookieCrumbs[0];
			var cookieValue = cookieCrumbs[1];
			if (cookieName == target){
				return cookieValue;
			}
		}
		return false;
	}
};

var Form = {
	init: function(){
		// get cookie or pick random office
		var bodyId = document.body.id;
		var cookieStaff = Cookie.readCookie(bodyId);
		if (cookieStaff){
			document.forms["form1"]["officeSelect"].selectedIndex = cookieStaff;
		}else {
			var rand = Math.floor(Math.random() * 9);
			document.forms["form1"]["officeSelect"].selectedIndex = rand;
		}
		Form.makeEmailCol();
		Form.hideColumns();
		Form.showLines();
		var office = document.getElementById("officeSelect");
		Core.addEventListener(office, "change", Form.showLines);
		Core.addEventListener(office, "change", Cookie.setCookie);
	},
	matchExp: function(target, theTest){
		var pattern = new RegExp("(^| )" + theTest + "( |$)");
		if (pattern.test(target)){
			return true;
		}
		return false;
	},
	showLines: function(){
		var office = Form.selectBox("officeSelect");
		var officeText = Form.selectBoxText("officeSelect");
		var events = document.getElementById("staffTable");
		var bodyRows = events.tBodies[0].rows;
		for (var i = 0, n = bodyRows.length; i < n; i++){
			var cell = bodyRows[i].cells[5];
			var row = bodyRows[i];
			var cellText = cell.textContent ? cell.textContent : cell.innerText;
			var matchedString = Form.matchExp(cellText, officeText);
			if (matchedString){
				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(officeText);
		target.appendChild(newHeader);
	},
	makeEmailCol: function(){
		var table = document.getElementById("staffTable");
		var bodyRows = table.tBodies[0].rows;
		for (var i = 0, n = bodyRows.length; i < n; i++){
			var cell = bodyRows[i].cells[2];
			var cellId = cell.textContent ? cell.textContent : cell.innerText;
			var text = document.createTextNode("Email");
			var emailLink = document.createElement("a");
			emailLink.appendChild(text);
			emailLink.setAttribute("href", "mailto:" + cellId + "@firstam.com");
			Core.removeAllChildren(cell);
			bodyRows[i].cells[2].appendChild(emailLink);
		}
	},
	hideColumns: function(){
		var table = document.getElementById("staffTable")
		var rows = table.rows;
		for (var i = 0, n = rows.length; i < n; i++){
			var cell = rows[i].cells[5];
			Core.addClass(cell, "neverShow");
		}
	},
	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("staffTable");
		Form.init();
	}
};
Core.start(Table);