/*
TableSorting(香川証券)

	[変更箇所]
		2011/09/26 全項目にソート順追加

 */
 
var TableSorting = {

	that: false,
	isOdd: false,

	sortColumnIndex : -1,
	lastAssignedId : 0,
	newRows: -1,
	lastSortedTable: -1,

	/*----------------------------------------
	 Init 
	 ----------------------------------------*/
	init : function() {
		// ブラウザ許可確認
		if (!document.getElementsByTagName) {
			return;
		}
		this.that = this;
		this.run();
	},

	/*----------------------------------------
	 run
 	 Document内に「SorTable」クラスのテーブルがあれば実行	 
	 ----------------------------------------*/	
	run : function() {
		var tables = document.getElementsByTagName("table");
		for (var i=0; i<tables.length; i++) {
			var thisTable = tables[i];
			if (css.elementHasClass(thisTable, 'sortable')) {
				this.makeSortable(thisTable);
			}
		}
		this.headingClickedInit();
	},

	/*----------------------------------------
	 makeLinkAsc
 	 ASC方向のリンクを作成
	 ----------------------------------------*/	
	makeLinkAsc : function (colinx) {
		var linkEl = createElement('a');
		linkEl.href = '#';
		linkEl.onclick = this.headingClicked;
		linkEl.setAttribute('columnId',colinx);
		linkEl.setAttribute('direction','ASC');
		linkEl.className = 'ASC'+colinx;
		linkEl.title = 'Click to sort';
		linkEl.appendChild(document.createTextNode('▲'));
		return linkEl;
	},

	/*----------------------------------------
	 makeLinkDesc
 	 DESC方向のリンクを作成
	 ----------------------------------------*/	
	makeLinkDesc : function (colinx) {
		var linkEl = createElement('a');
		linkEl.href = '#';
		linkEl.onclick = this.headingClicked;
		linkEl.setAttribute('columnId',colinx);
		linkEl.setAttribute('direction','DESC');
		linkEl.className = 'DESC'+colinx;
		linkEl.title = 'Click to sort';
		linkEl.appendChild(document.createTextNode('▼'));
		return linkEl;
	},
	
	/*----------------------------------------
	 MakeSortable	 
	 ----------------------------------------*/	
	makeSortable : function(table) {

		// テーブルIDチェック、なければ付与
		if (!table.id) {
			//table.id = 'sortableTable'+this.lastAssignedId++;
		}

		// thead存在チェック
		if (!table.tHead || !table.tHead.rows || 0 == table.tHead.rows.length) {
			return;
		}

		//theadの並び替え列作成
		var row = table.tHead.rows[0];
		for (var i=0; i<row.cells.length; i++) {

			//改行
			var brEl = createElement('br');
			row.cells[i].appendChild(brEl);

			//▲作成
			var linkAscEl = this.makeLinkAsc(i);
			row.cells[i].appendChild(linkAscEl);

			//リンク間スペース作成
			var spaceEl = document.createTextNode(' ');
			row.cells[i].appendChild(spaceEl);

			//▼作成
			var linkDescEl = this.makeLinkDesc(i);
			row.cells[i].appendChild(linkDescEl);
		}
	},
	
	
	initSort : function() {
	
	    var that = TableSorting.that;
	    
		var objJSsn = document.getElementById('JSsn');
		var td     = objJSsn.parentNode;
		var tr     = td.parentNode;
		var thead  = tr.parentNode;
		var table  = thead.parentNode;

		//現在表示行ゼロ
		if (!table.tBodies || table.tBodies[0].rows.length <= 1) {
			return false;
		}
       
		//ソート種類(純資産額降順)		
		that.sortColumnIndex = 6;
		var sortfn = this.sortNumeric_Desc;						
		var newRows = new Array();		
		for (var j=0; j<table.tBodies[0].rows.length; j++) {
			newRows[j] = table.tBodies[0].rows[j];				
		}
		newRows.sort(sortfn);
		that.moveRows(table, newRows);
		that.newRows = newRows;
		that.lastSortedTable = table.id;
	},
	
	/*----------------------------------------
	 headingClickedInit
	 ソート処理（初期表示用）
	 ----------------------------------------*/	
	headingClickedInit: function() {

		var that = TableSorting.that;
		
		//クリック
		var table  = document.getElementById('sortableTable');		

		//現在表示行ゼロ
		if (!table.tBodies || table.tBodies[0].rows.length <= 1) {
			return false;
		}

		//クリック列によるソート種類決定
		var sortfn = this.sortNumeric_Desc;
		that.sortColumnIndex = 5;
		
		var newRows = new Array();
		
		//降順		
		for (var j=0; j<table.tBodies[0].rows.length; j++) {
			newRows[j] = table.tBodies[0].rows[j];
		}
		
		newRows.sort(sortfn);
		that.moveRows(table, newRows);
		that.newRows = newRows;
		that.lastSortedTable = table.id;

		return false;
	},

	/*----------------------------------------
	 headingClicked
	 ソート処理
	 ----------------------------------------*/	
	headingClicked: function(e) {

		var that = TableSorting.that;
		
		//クリック列
		var linkEl = getEventTarget(e);
		var td     = linkEl.parentNode;
		var tr     = td.parentNode;
		var thead  = tr.parentNode;
		var table  = thead.parentNode;

		//現在表示行ゼロ
		if (!table.tBodies || table.tBodies[0].rows.length <= 1) {
			return false;
		}

		//クリック列インデックス＆ソート方向
		var columnId = linkEl.getAttribute('columnId') || td.cellIndex;
		var direction = linkEl.getAttribute('direction');

		//クリック列によるソート種類決定
		var sortfn = that.determineSortFunction(columnId,direction);

		that.sortColumnIndex = columnId;
		var newRows = new Array();

		//昇順
		if (direction == 'ASC') {
			for (var j=0; j<table.tBodies[0].rows.length; j++) {
				newRows[j] = table.tBodies[0].rows[j];
			}
		//降順
		} else {
			for (var j=0; j<table.tBodies[0].rows.length; j++) {
				newRows[j] = table.tBodies[0].rows[j];
			}
		}

		newRows.sort(sortfn);
		that.moveRows(table, newRows);
		that.newRows = newRows;
		that.lastSortedTable = table.id;

		//直前ソート項目見出し表示をリンクへ戻す
		var itms = css.getElementsByClass(thead,'sact','span');
		for (var j=0; j<itms.length; j++) {
			var itmParent = itms[j].parentNode; //<th>
			var itmColumnId = itmParent.cellIndex;
			var itmDirection = itms[j].getAttribute('direction');
			if (itmDirection == 'ASC') {
				var linkElAsc = that.makeLinkAsc(itmColumnId);
				itmParent.replaceChild(linkElAsc,itms[j]);
			} else {
				var linkElDesc = that.makeLinkDesc(itmColumnId);
				itmParent.replaceChild(linkElDesc,itms[j]);
			}
		}

		//現在ソート項目見出し表示を赤文字へ
		var spanEl = createElement('span');
		spanEl.className = 'sact';
		if (direction == 'ASC') {
			var itms = css.getElementsByClass(td,'ASC'+columnId,'a');
			spanEl.setAttribute('direction','ASC');
			spanEl.appendChild(document.createTextNode('▲'));
			td.replaceChild(spanEl,itms[0]);
		} else {
			var itms = css.getElementsByClass(td,'DESC'+columnId,'a');
			spanEl.setAttribute('direction','DESC');
			spanEl.appendChild(document.createTextNode('▼'));
			td.replaceChild(spanEl,itms[0]);
		}
		return false;
	},

	/*----------------------------------------
	 getInnerText	 
	 ----------------------------------------*/	
	getInnerText : function(el) {

		if ('string' == typeof el || 'undefined' == typeof el) {
			return el;
		}
		if (el.innerText) {
			return el.innerText;
		}
		var str = el.getAttribute('TableSortingInnerText');
		if (null != str && '' != str) {
			return str;
		}
		str = '';
		var cs = el.childNodes;
		var l = cs.length;
		for (var i=0; i<l; i++) {

			if (1 == cs[i].nodeType) { 
				// ELEMENT NODE
				str += this.getInnerText(cs[i]);
				break;
			} else if (3 == cs[i].nodeType) { 
				//TEXT_NODE
				str += cs[i].nodeValue;
				break;
			}
		}
		el.setAttribute('TableSortingInnerText', str);
		return str;
	},

	/*----------------------------------------
	 determineSortFunction
	 列によるソート機能
	 ----------------------------------------*/	
	determineSortFunction : function(inx,direction) {
		
		var sortfn;
		
		//昇順
		if (direction == 'ASC'){
			if (inx <= 1) { 
				//文字列（ファンド名、運用会社）
				sortfn = this.sortCaseInsensitive;
			} else { 
				//数値（基準価額、前日、分配頻度、純資産額）
				sortfn = this.sortNumeric;
			} 
		} else {
		//降順
			if (inx <= 1) {
				//文字列（ファンド名、運用会社）
				sortfn = this.sortCaseInsensitive_Desc;
			} else { 
				//数値（基準価額、前日、分配頻度、純資産額）
				sortfn = this.sortNumeric_Desc;
			} 
		}
		return sortfn;
	},

	/*----------------------------------------
	 sortCaseInsensitive
	 文字列項目昇順	 
	 ----------------------------------------*/	
	sortCaseInsensitive : function(a, b) {

		var that = TableSorting.that;
		var colinx = that.sortColumnIndex;
//		//運用会社は非表示列内容でソート
//		if (colinx == 2){
//			colinx = 9;
//		}
		var aa = that.getInnerText(a.cells[colinx]).toLowerCase();
		var bb = that.getInnerText(b.cells[colinx]).toLowerCase();
		if (aa==bb) {
			return 0;
		} else if (aa<bb) {
			return -1;
		} else {
			return 1;
		}
	},

	/*----------------------------------------
	 sortCaseInsensitive_Desc
	 文字列項目降順 
	 ----------------------------------------*/	
	sortCaseInsensitive_Desc : function(a, b) {

		var that = TableSorting.that;
		var colinx = that.sortColumnIndex;
//		//運用会社は非表示列内容でソート
//		if (colinx == 2){
//			colinx = 9;
//		}
		var aa = that.getInnerText(a.cells[colinx]).toLowerCase();
		var bb = that.getInnerText(b.cells[colinx]).toLowerCase();
		
		if (aa==bb) {
			return 0;
		} else if (aa>bb) {
			return -1;
		} else {
			return 1;
		}
	},
	
	/*----------------------------------------
	 sortNumeric
	 数値項目昇順
	 ----------------------------------------*/		
	sortNumeric : function(a,b) {

		var that = TableSorting.that;		
		var colinx = that.sortColumnIndex;
		//分配頻度は非表示列内容でソート
		if (colinx == 4){
			colinx = 6;
		}
		
		//桁区切りカンマを無視
		//2010/07/28 カンマ2つ存在する場合に対応
		//var aa = parseFloat(that.getInnerText(a.cells[colinx]).replace(',',''));
		var aa = parseFloat(that.getInnerText(a.cells[colinx]).replace(',','').replace(',',''));
		if (isNaN(aa)) { 
			aa = 0;
		}
		//2010/07/28 カンマ2つ存在する場合に対応
		//var bb = parseFloat(that.getInnerText(b.cells[colinx]).replace(',','')); 
		var bb = parseFloat(that.getInnerText(b.cells[colinx]).replace(',','').replace(',','')); 
		if (isNaN(bb)) { 
			bb = 0;
		}
		return aa-bb;
	},

	/*----------------------------------------
	 sortNumeric_Desc
	 数値項目降順
	 ----------------------------------------*/	
	sortNumeric_Desc : function(a,b) { 
		var that = TableSorting.that;
		var colinx = that.sortColumnIndex;
		//分配頻度は非表示列内容でソート
		if (colinx == 4){
			colinx = 6;
		}
		
		//桁区切りカンマを無視
		//2010/07/28 カンマ2つ存在する場合に対応
		//var aa = parseFloat(that.getInnerText(a.cells[colinx]).replace(',',''));
		var aa = parseFloat(that.getInnerText(a.cells[colinx]).replace(',','').replace(',',''));
		if (isNaN(aa)) { 
			aa = 0;
		}
		//2010/07/28 カンマ2つ存在する場合に対応
		//var bb = parseFloat(that.getInnerText(b.cells[colinx]).replace(',','')); 
		var bb = parseFloat(that.getInnerText(b.cells[colinx]).replace(',','').replace(',','')); 
		if (isNaN(bb)) { 
			bb = 0;
		}
		return bb-aa;
	},	

	/*----------------------------------------
	 moveRows
	 ソート済み行をtbodyに追加
	 ----------------------------------------*/		
	moveRows : function(table, newRows) {
	
		this.isOdd = false;
		var that = TableSorting.that;
		
		//tbodyに追加
		for (var i=0;i<newRows.length;i++) { 
//			//リスクメジャー
//			var cell = that.getInnerText(newRows[i].cells[3]);
//			if (cell == '0' || cell == '9999') {
//				newRows[i].cells[3].innerText = 'なし';
//			}
//			//レーティング
//			var cell = that.getInnerText(newRows[i].cells[4]);
//			if (cell == 'A' || cell == '！！！') {
//				newRows[i].cells[4].innerText = 'なし';
//			}
//			//基準価額]
//			var cell = that.getInnerText(newRows[i].cells[5]);
//			if (cell == '9999.9' || cell == '-9999.9') {
//				newRows[i].cells[5].innerText = '--';
//			}
//			//SEQNo
//			newRows[i].cells[0].innerHTML = i+1;

//			//レーティング
//			var cell = that.getInnerText(newRows[i].cells[5]);
//			if (cell == 'A' || cell == '！！！') {
//				newRows[i].cells[5].innerText = 'スターレーティングなし';
//			}	

			var rowItem = newRows[i];
			this.doStripe(rowItem);
			table.tBodies[0].appendChild(rowItem); 
		}
	},

	/*----------------------------------------
	 doStripe
	 ----------------------------------------*/	
	doStripe : function(rowItem) {
		if (this.isOdd) {
			css.addClassToElement(rowItem, 'inf-gray');
		} else {
			css.removeClassFromElement(rowItem, 'inf-gray')
			css.addClassToElement(rowItem, 'inf-white');
		}
		this.isOdd = !this.isOdd;
	}
}

/*----------------------------------------
 TableSortingInit
 ----------------------------------------*/	
function TableSortingInit() {
	TableSorting.init();
	TableSorting.initSort();
}

/*----------------------------------------
 css
 ----------------------------------------*/	
var css = {
	getElementsByClass : function(node, searchClass, tag) {
		var classElements = new Array();
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		
		for (var i = 0, j = 0; i < elsLen; i++) {
			if (this.elementHasClass(els[i], searchClass) ) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	},
	
	privateGetClassArray: function(el) {
		return el.className.split(' '); 
	},

	privateCreateClassString: function(classArray) {
		return classArray.join(' ');
	},

	elementHasClass: function(el, classString) {
		if (!el) {
			return false;
		}
		var regex = new RegExp('\\b'+classString+'\\b');
		if (el.className.match(regex)) {
			return true;
		}
		return false;
	},

	addClassToId: function(idString, classString) {
		this.addClassToElement(document.getElementById(idString), classString);
	},
	
	addClassToElement: function(el, classString) {
		var classArray = this.privateGetClassArray(el);

		if (this.elementHasClass(el, classString)) {
			return;
		}

		classArray.push(classString);

		el.className = this.privateCreateClassString(classArray);
	},

	removeClassFromId: function(idString, classString) {
		this.removeClassFromElement(document.getElementById(idString), classString);
	},

	removeClassFromElement: function(el, classString) {
		var classArray = this.privateGetClassArray(el);

		for (x in classArray) {
			if (classString == classArray[x]) {
				classArray[x] = '';
				break;
			}
		}

		el.className = this.privateCreateClassString(classArray);
	}
}

/*----------------------------------------
 createElement
 ----------------------------------------*/	
function createElement(element) {
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}

/**
 * "targ" is the element which caused this function to be called
 * from http://www.quirksmode.org/js/events_properties.html
 **/
function getEventTarget(e) {
	var targ;
	if (!e) {
		e = window.event;
	}
	if (e.target) {
		targ = e.target;
	} else if (e.srcElement) {
		targ = e.srcElement;
	}
	if (targ.nodeType == 3) { // defeat Safari bug
		targ = targ.parentNode;
	}

	return targ;
}



