//@utf-8

(function($) {

	$.csv2table={
		version    : '0.02-b-1.6',
		updateMemo : '0.02-b-1.6 (op.labelX=="useChart")?head.slice(1):op.labelX. Added $.csv2table.reset method . Change $.fn.csv2table.wrtTable to $.csv2table.wrtTable',
		ver      : '<span class="csv2tableVersion" style="color:#aaa"></span><script>jQuery(function($){ $(".csv2tableVersion").html("version:csv2table-"+$.csv2table.version) })</script>',

		charset  : 'utf-8',
		doc      : 'http://jsgt.org/mt/01/',
		demo     : 'http://jsgt.org/lib/jquery/plugin/csv2table/v001/test.htm',
		author   : 'Toshiro Takahashi',
		lisence  : 'Public Domain',
		loadImg  : (new Image()).src='./images/vbr.gif',
		sortDImg : (new Image()).src='../../images/icon-d.gif',
		sortAImg : (new Image()).src='../../images/icon-a.gif',
		setting  : [],
		data     : [],
		_rowsAry : [],
		err      : []
	}

	$.fn.csv2table= function (url,setting){

		if(!setting)var setting={};
		var contents=$.fn.csv2table.el=this,id=this[0].id,
		op = $.csv2table.setting[id] = $.extend({
			url                : url,
			nowloadingImg      : $.csv2table.loadImg,              //Image of now loading...
			nowloadingMsg      : 'now loading...',                 //Massege of  now loading...
			removeDoubleQuote  : false,                             // remove " of "hogehoge"
			col_midasi         : '0',                              //
			row_sep            : '\n',                             //Separator of rows. default '\n'
			col_sep            : ',',                              //Separator(,|\t|;) of cols. default ','
			sortable           : false,                             //col sort
			select             : '*',                              //select col lists. default '*' is all cols.
			orderBy            : null,                             //array of sort col. orderBy[[0,"A"]]
			col0color          : true,                             //col[0] color sync jQchart line_strokeStyle
			onload             : null,                             //collback function (id,op,data,ary) {}
			use                : null,                             // 'jqchart:line#canvasID'
			className_div      : 'csv2table-div',                  //className 
			className_table    : 'csv2table-table',                //className 
			className_table_th : 'csv2table-table-th',             //className 
			className_table_td : 'csv2table-table-td',             //className 
			className_sortMark : 'csv2table-sortMark'              //className
		},setting);

		if(op.row_sep=='\n')op.row_sep_reg='\r\n'
		if(op.use){
			op.use_api      = op.use.split(':')[0]
			op.use_api_type = op.use.split('#')[0]
			op.use_api_box  = op.use.split(':')[1].split('#')[1]
		}

		$(contents).before('<div class="csv2table-loading"><img src="'+$.csv2table.loadImg+'" border="0"> '+op.nowloadingMsg+'</div>' )

		$.get(url+"?"+(new Date()).getTime(),"",function(data,textStatus){
			$.csv2table.data[id]=data;
			$(".csv2table-loading").fadeOut();
			$(contents).css("display","none").html(  mkRowsAry(id,data));
			setCSS(id);
			$(contents).fadeIn();
			if(op.use_api=='jqchart'){
				if(op.use_api_type=='jqchart:line')op.type=$.csv2table.setting[id].type='line';
				else if(op.use_api_type=='jqchart:bar')op.type=$.csv2table.setting[id].type='bar';
				useChart(id,op,data,$.csv2table._rowsAry[id]);
			}
			if($.csv2table.setting[id].onload)$.csv2table.setting[id].onload(id,op,data,$.csv2table._rowsAry[id]);
		});

		$.csv2table.wrtTable=function(sortType,colIndex,id){
			$("#"+id).html(  mkRowsAry(id,$.csv2table._rowsAry[id],sortType,colIndex));
			setCSS(id);
			if(op.use_api=='jqchart'){
				if(op.use_api_type=='jqchart:line')op.type=$.csv2table.setting[id].type='line';
				else if(op.use_api_type=='jqchart:bar')op.type=$.csv2table.setting[id].type='bar';
				useChart(id,op,$.csv2table.data[id],$.csv2table._rowsAry[id]);
			}
			if($.csv2table.setting[id].onload)$.csv2table.setting[id].onload(id,op,$.csv2table.data[id],$.csv2table._rowsAry[id]);
		}

		$.csv2table.reset=function(){
			rowsAry=$.csv2table._rowsAry[id]=escapeStrComma(op.col_sep,op.row_sep,$.csv2table.data[id],op.removeDoubleQuote);
			$("#"+id).html( mkTable(rowsAry));
			setCSS(id);
			if(op.use_api=='jqchart'){
				if(op.use_api_type=='jqchart:line')op.type=$.csv2table.setting[id].type='line';
				else if(op.use_api_type=='jqchart:bar')op.type=$.csv2table.setting[id].type='bar';
				useChart(id,op,$.csv2table.data[id],$.csv2table._rowsAry[id]);
			}
		}

		function orderWk(ary,sortType,colIndex){
			ary.head=ary.slice(0,op.col_midasi+1) 
			var rowsAry=ary.slice(op.col_midasi+1,ary.length) 
			rowsAry=sortwk(rowsAry,sortType,colIndex);
			rowsAry=ary=ary.head.concat(rowsAry)
			return rowsAry
		}

		function mkRowsAry(id,data,sortType,colIndex){  

			var rowsAry=null,rewrite=true//zanntei
			
			if(sortType && rewrite){
				rowsAry=$.csv2table._rowsAry[id]=orderWk($.csv2table._rowsAry[id],sortType,colIndex);
			} else {
				if(op.col_sep==','){
					rowsAry=$.csv2table._rowsAry[id]=escapeStrComma(op.col_sep,op.row_sep,data,op.removeDoubleQuote);
					
				} else {
					if(op.select == '*'||op.select == ['*']||!op.select)
						rowsAry=$.csv2table._rowsAry[id]=mkArray(data,op.col_sep,op.row_sep);
					else
						rowsAry=$.csv2table._rowsAry[id]=mkSelectedArray(data,op.col_sep,op.row_sep,[0,2]);
				}
				
				if(op.orderBy){ 
					for(var i=op.orderBy.length-1 ;i>=0;i--){
					  rowsAry=$.csv2table._rowsAry[id]=orderWk(rowsAry,op.orderBy[i][1],op.orderBy[i][0])
					}
				} 
			}
			
			var tableHtm=mkTable(rowsAry);
			
			return tableHtm;
		}

		
		function  mkTable(rowsAry){


			if(!rowsAry)return 
			var rowlen=rowsAry.length
			
			var tdClass                             ; 
			var row = rowsAry.length                ; 
			var col = rowsAry[0].length             ;  
			
			htm="";

			//見出し行の処理
			var rosterMode = false;
			if (rowsAry[op.col_midasi][0] == "Number")
				rosterMode = true;
			htm+= "<tr>";
			for (k=0; k<col; k++) {
				htm+= "<th>"
				   + rowsAry[op.col_midasi][k];
				if(op.sortable && rosterMode){
					htm+="<br><a href='javascript:$.csv2table.wrtTable(\"D\","+k+",\""+id+"\")'>"
					   + "<img src='../../"+$.csv2table.sortDImg+"' border='0'>"
					   + "</a><a href='javascript:$.csv2table.wrtTable(\"A\","+k+",\""+id+"\")'>"
					   + "<img src='../../"+$.csv2table.sortAImg+"' border='0'></a>"
				}
				htm+= "</th>";
			}
			htm+= "</tr>";
			
			//data行の処理
			var lineOdd = 0;
			for (i=eval(op.col_midasi+1); i<row; i++) { 
				htm+= "<tr>";
	
				var practice="";
				var bclr="722; color:#fff";
				var newone="";
				if (!rosterMode && (rowsAry[i][col-1].substr(0,1) == 'n'))
				{
					rowsAry[i][col-1] = rowsAry[i][col-1].substr(1);
					newone="&nbsp;<img src='../../images/new.gif' style='height:15px;vertical-align:middle;' border='0'/>";
				}
				
				if (rosterMode)
				{
					if (lineOdd == 1)
						bclr="fff";
					else if (lineOdd == 2)
						bclr="def";
					else
						bclr="fdd";
					lineOdd++;
					if (lineOdd == 3)
						lineOdd = 0;
				}
				else if (rowsAry[i][col-1].substr(0,2) == '12')
				{
					practice = " Practice";
					bclr="fcc";
				}
				else if (rowsAry[i][col-1].substr(0,2) == '14')
				{
					practice = " Practice";
					bclr="cfc";
				}
				else if (rowsAry[i][col-1].substr(0,2) == '15')
				{
					practice = " Practice";
					bclr="cff";
				}
				else if (rowsAry[i][col-1].substr(0,2) == '16')
				{
					practice = " Practice";
					bclr="ccf";
				}
				else if (rowsAry[i][col-1].substr(0,2) == '18')
				{
					practice = " Practice";
					bclr="ffc";
				}
				if (rowsAry[i][col-1].indexOf('Qual') != -1 ||
						rowsAry[i][col-1].indexOf('Mand') != -1 ||
						rowsAry[i][col-1].indexOf('Scri') != -1)
				{
					practice = "";
				}
				
				
				var maxdepth = 99;
				for (j=0; j<col; j++) {
					if (rowsAry[i][j].length != 0)
					{
					var rowspan = 1;
					if (j < 3 && !rosterMode)
					{
					// reduce the lines
					for (k = i+1; k < row && rowspan < maxdepth; k++) {
						if (rowsAry[k][j] == rowsAry[i][j] || rowsAry[k][j].length == 0)
						{
							rowsAry[k][j] = "";
							rowspan++;
						}
						else
							break;
					}
					}
					if (maxdepth > rowspan)
					 maxdepth = rowspan;
					 
					htm += "<td ";
					
					if (j == 2 && col > 3 && rowsAry[i][j+1].length == 0)
					{
						htm+= "colspan='2' style='background-color:#f96;'";	
					}
					
					if (!rosterMode && (rowspan > 1 || j < 3))
					{
						htm += "align='center' ";
						if (rowsAry[i][j].substr(1,3) == 'our')
						{
							htm+= "rowspan='"+rowspan+"' style='background-color:#ff0;'";					 	
						}
						else
								htm+= "rowspan='"+rowspan+"'";
					}
					else
						htm+= "style='background-color:#"+bclr+";'";
						
					if (j == 3)
						htm += ">" + rowsAry[i][j] + practice + newone + "</td>";
					else
						htm += ">" + rowsAry[i][j]  + "</td>";
				}
				}
				htm+= "</tr>";
			}

			var tableHtm=document.getElementById(id)
				.innerHTML="<table width='100%'>"+htm+"</table>";

			if(op.sortable && !rosterMode)
			$("th",tableHtm)
						.css('font-size','9px')
						.css('font-family','Arial')
						.css('text-decoration','none')
						.css('color','#888')
						.addClass(op.className_sortMark)
						
			return tableHtm;

		}
		
		
		
		
		////
		// 並べ替え
		// @parame dataAry    並べ替え対象配列
		// @parame sortType   昇順A|降順D
		// @parame colIndex   ソート列
		//
		function sortwk(dataAry,sortType,colIndex){
			var i=colIndex;
			if(!dataAry)return ;
			if(isNaN(dataAry[0][i])){
				dataAry.sort(
					function(a,b){
	
						if(!a[i]) { 
							if(!b[i])return 0;
							else     return 1;
						} else if(!b[i]) {
							return -1;
						}
						
						if(""+a[i] === ""+b[i])return 0;
						return (sortType=="D")?
							((""+a[i] > ""+b[i])?-1:1):
							((""+a[i] > ""+b[i])?1:-1);
					}
				)

			} else {
				(sortType=="D")?
				dataAry.sort(function (a,b){ 
						return (b[i] - a[i]) ;//降順 
				}):
				dataAry.sort(function (a,b){ 
						return (a[i] - b[i]);// 昇順
				})
			}
			return dataAry;
		}
		
		function escapeStrComma(col_sep,row_sep,oj,removeDoubleQuote){
			var rdq=(removeDoubleQuote)?'':'"';

			//mk dmy for comma in "
			var dmy =['-###','###-'],cnt=0,r;
			cnt=(function mkdmy(cnt){
				if(!(
					oj.indexOf((dmy[0]+'comma'+cnt+dmy[1]))==-1 ||
					oj.indexOf((dmy[0]+'rn'+cnt+dmy[1]))==-1 ||
					oj.indexOf((dmy[0]+'wDquote'+cnt+dmy[1]))==-1 
				))mkdmy( ++cnt )
				else void(0)
				return cnt;
			})(cnt)

			var reg='(["](.|(\r\n))*?(["]$|["][,('+op.row_sep_reg+')]))',
				dmystr_comma=''+(dmy[0]+'comma'+cnt+dmy[1]) ,
				dmystr_rn=''+(dmy[0]+'rn'+cnt+dmy[1]) ,
				dmystr_wDquote=''+(dmy[0]+'wDquote'+cnt+dmy[1]) ;

			escape= oj.replace('""',dmystr_wDquote);
			escape= escape.replace(
				new RegExp(reg,"g"),
				function (after,before,index) {
					after= after
							.replace(/(\r\n)(?!$)/g,dmystr_rn)
							.replace(/,(?!$)/g,dmystr_comma)
					return after
					
				}
			)

			if(op.select == '*'||op.select == ['*'])
					r=$.csv2table._rowsAry[id]=mkArray(escape,op.col_sep,op.row_sep);
			else	r=$.csv2table._rowsAry[id]=mkSelectedArray(escape,op.col_sep,op.row_sep,op.select)

			var b=[],rowlen=r.length,collen=r[0].length;
			for(var i=0;i<rowlen;i++){
				if(r[i]=='')continue; 
				b[i]=r[i];
				for(var j=0;j<collen;j++){
					try{
						b[i][j]=$.trim(r[i][j])
							.replace(/^"|"$/g,rdq)
							.replace(new RegExp(dmystr_comma,"g"),",")
							.replace(new RegExp(dmystr_rn,"g"),"\r\n")
							.replace(new RegExp(dmystr_wDquote,'g'),'""');
					} catch(e){}
				}
			}
			
			return b
		}
		
		function mkSelectedArray(data,col_sep,row_sep,select){
				var rows=data.split(row_sep),rc=[],c=[]
				    rowlen=rows.length ;
				for(var i=0;i<rowlen;i++){
					if($.trim(rows[i])=='') continue; 
					try{
						rc[i]=rows[i].split(col_sep);
						c[i]=[];
						for(var j=0;j<select.length;j++){
							c[i].push(rc[i][select[j]])
						}
					} catch(e){ }
				}
				return c||rc
		}


		function mkArray(data,col_sep,row_sep){
				var rows=data.split(row_sep),rc=[]
				    rowlen=rows.length ;
				for(var i=0;i<rowlen;i++){
					if($.trim(rows[i])=='') continue; 
					try{
						rc[i]=rows[i].split(col_sep);
					} catch(e){ }
				}
				return rc
		}
		
		function setDefault(settingName,val){
			var prop = (setting[settingName]=='undefined'||
				 setting[settingName]==null)?val:setting[settingName]
			return prop
		}


		function setCSS(id){
			$('#'+id+'').css({
				/*backgroundColor  : '#eee',
				border           : '1px solid #555',*/
				padding          : '0px', 
				margin           : '1px'
			}).addClass(op.className_div)
			
			$('#'+id+' table').css({
				borderCollapse   : 'collapse',
				borderSpacing    : '0px',
				marginBottom     : '10px'
			}).addClass(op.className_table)
			
			$('#'+id+' table th').css({
				borderColor      : '#eee #999 #777 #bbb',
				borderStyle      : 'solid',
				borderWidth      : '1px',
				backgroundColor  : '#ccc', 
				fontSize         : '12px',
				padding          : '4px',
				textAlign        : 'center'
			}).addClass(op.className_table_th)
			
			$('#'+id+' table td').css({
				borderColor      : '#eee #aaa #999 #ccc',
				borderStyle      : 'solid',
				borderWidth      : '1px',
				padding          : '8px',
				fontSize         : '12px'
			}).addClass(op.className_table_td)
			
			
		}
		
		function useChart (id,op,data,ary){
			var head= ary[0],dataBody=ary.slice(1) ;
			$("#"+op.use_api_box).jQchart({
				config : $.extend(op,{ 
					width    : $('#'+id+' table').width()+10,
					paddingL : $('#'+id+' table th:nth-child(1)').width()+14,
					labelX   : (op.labelX=='useChart')?head.slice(1):op.labelX,
					onload   : null
				}),
				data : (function(){
					var d = [];
					for(var i=0,len=dataBody.length;i<len;i++){
						d.push(dataBody[i].slice(1))
					}
					return d;
				})()
			})

			var dl= dataBody.length,lc=$("#"+op.use_api_box).jQchart.op.line_strokeStyle;
			$('tr:even','#'+id).css('background','#eee');
			if(op.col0color)
			$.each(dataBody,function(i){
				$('tr:nth-child('+dl+'n'+(dl+i+2)%dl+') td:first','#'+id)
					.css('color',lc[i]) 
			})
		}

		return this
	}


})(jQuery);
