/**
 * @author sunjiaxiang
 * @param sort_elem : sort table element.
 * @param sort_column : sort table column element index.
 * @param sort_type : sort type 'date' and 'string' and 'number' and 'array', default 'string'.
 * @param isAsc : is asc sort.
 * @param sort_array : sort_type is 'array' sort content.
 */

Sort = function(sort_elem, sort_column, sort_byId, sort_type, isAsc, sort_array) {
	if(sort_elem == null) {
		 alert("Error:\n\tsort_elem is not null.");
		 return;
	}
	this.elem = sort_elem;
	this.elem_childNodes = sort_elem.getElementsByTagName("tr");
	this.elem_child_array = new Array();
	for(var i = 0;i < this.elem_childNodes.length;i ++)
		this.elem_child_array[i] = this.elem_childNodes[i];
	this.column = sort_column || 0;
	this.byId = sort_byId || null;
	this.type = sort_type || "string";
	this.isAsc = isAsc || false;
	this.sort_array = sort_array || null;
}
Sort.prototype = {
	doSort : function() {
		if(this.type == "string") {
			this.stringSort();
		}
		if(this.type =="number") {
			this.numberSort();
		}
		if(this.type == "date") {
			this.dateSort();
		}
		if(this.type == "array") {
			this.arraySort();
		}
		
		this.elem.removeChild(this.elem.getElementsByTagName("tbody")[0]);
		var elemBody = document.createElement("tbody");
		for(var i = 0;i < this.elem_child_array.length;i ++) {
			elemBody.appendChild(this.elem_child_array[i]);
		}
		this.elem.appendChild(elemBody);
	},
	ascSort : function() {
		this.isAsc = true;
		this.doSort();
	},
	descSort : function() {
		this.isAsc = false;
		this.doSort();
	},
	dateSort : function() {
		if(this.type != "date") {
			alert("Error:\n\tSort type not date!");
			return;
		}
		// sunjx
	},
	numberSort : function() {
		if(this.type != "number") {
			alert("Error:\n\tSort type not number!");
			return;
		}
		for(var i = 0;i < this.elem_child_array.length;i ++) {
			for(var j = this.elem_child_array.length - 1;j > i;j --) {
				var td_1 = this.elem_child_array[j - 1].getElementsByTagName("td")[this.column];
				var td_2 = this.elem_child_array[j].getElementsByTagName("td")[this.column];
				if(this.byId == null) {
					if(parseFloat(td_1.innerHTML.replaceAll("\$","").replaceAll(",",""), 10) > parseFloat(td_2.innerHTML.replaceAll("\$","").replaceAll(",",""), 10)) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
				else {
					if(parseFloat(td_1.getElementById(this.byId).innerHTML.replaceAll("\$","").replaceAll(",",""), 10) > parseFloat(td_2.getElementById(this.byId).innerHTML.replaceAll("\$","").replaceAll(",",""), 10)) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
			}
		}
	},
	stringSort : function() {
		if(this.type != "string") {
			alert("Error:\n\tSort type not string!");
			return;
		}
		for(var i = 0;i < this.elem_child_array.length;i ++) {
			for(var j = this.elem_child_array.length - 1;j > i;j --) {
				var td_1 = this.elem_child_array[j - 1].getElementsByTagName("td")[this.column];
				var td_2 = this.elem_child_array[j].getElementsByTagName("td")[this.column];
				if(this.byId == null) {
					if(td_1.innerHTML > td_2.innerHTML) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
				else {
					if(td_1.getElementById(this.byId).innerHTML > td_2.getElementById(this.byId).innerHTML) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
			}
		}
	},
	arraySort : function() {
		if(this.sort_array == null) {
			alert("Error:\n\tPlease set sort array!");
			return;
		}
		for(var i = 0;i < this.elem_child_array.length;i ++) {
			for(var j = this.elem_child_array.length - 1;j > i;j --) {
				if(this.byId == null) {
					var td_1 = this.sort_array.indexOf(this.elem_child_array[j - 1].getElementsByTagName("td")[this.column].innerHTML);
					var td_2 = this.sort_array.indexOf(this.elem_child_array[j].getElementsByTagName("td")[this.column].innerHTML);
					if(td_1 > td_2) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
				else {
					var td_1 = this.sort_array.indexOf(this.elem_child_array[j - 1].getElementsByTagName("td")[this.column].getElementById(this.byId).innerHTML);
					var td_2 = this.sort_array.indexOf(this.elem_child_array[j].getElementsByTagName("td")[this.column].getElementById(this.byId).innerHTML);
					if(td_1 > td_2) {
						if(this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
					else {
						if(!this.isAsc) {
							var tempTr = this.elem_child_array[j - 1];
							this.elem_child_array[j - 1] = this.elem_child_array[j];
							this.elem_child_array[j] = tempTr;
						}
					}
				}
			}
		}
	}
}

Array.prototype.indexOf = function(substr){
	for(var i = 0;i < this.length;i ++) if(this[i] == substr) return i;
}

String.prototype.replaceAll = function(oStr, nStr) {
	return this.replace(RegExp(oStr, 'g'), nStr);;
}

var myTextExtraction = function(node)  
{// Sort by 'a', 'b', 'c'...  Not sort by array index because of appear errors use this jquery version.
	var sort = new Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k')
	var clarity = new Array('SI2', 'SI1', 'VS2', 'VS1', 'VVS2', 'VVS1', 'IF', 'FL');
	var cut = new Array('Fair', 'Good', 'Very Good', 'Ideal', 'Super Ideal');
	var report = new Array('CDL', 'EGL', 'IGI', 'Gemscan', 'GIA', 'AGS');
	var color = new Array('J', 'I', 'H', 'G', 'F', 'E', 'D')

	// extract data from markup and return it
	for (x in clarity){
		if (node.innerHTML == clarity[x]){
			return sort[x];
		}
	}
	for (x in cut){
		if (node.innerHTML == cut[x]){
			return sort[x];
		}
	}
	for (x in report){
		if (node.innerHTML == report[x]){
			return sort[x];
		}
	}
	for (x in color){
		if (node.innerHTML == color[x]){
			return sort[x];
		}
	}
	return node.innerHTML;
}
