//@utf-8

(function($) {

	$.csv2table={
		version    : '0.03-b-1.0',
		updateMemo : '0.03-b-1.0 enable to embed csv data in csv2table.setting.data by Array',
		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='./img/icon-loadinfo.gif',
		sortDImg : (new Image()).src='./img/icon-d.gif',
		sortAImg : (new Image()).src='./img/icon-a.gif',
		setting  : [],
		data     : [],
		_rowsAry : [],
		err      : []
	}

	$.fn.csv2table=function (arg0,arg1){

		var url=null,setting=null;
		if(typeof arguments[0]=='string'){
			url=arguments[0],setting=arguments[1];
		} else if(typeof arguments[0]=='object'){
			url=null,setting=arguments[0];
		} else return;

		if(!setting)var setting={};
		var contents=$.fn.csv2table.el=this,id=this[0].id,
		op = $.csv2table.setting[id] = $.extend({
			url                : url,
			data               : null,                 //use by Array without using url(csv file).
			nowloadingImg      : $.csv2table.loadImg,  //Image of now loading...
			nowloadingMsg      : 'now loading...',     //Massege of  now loading...
			removeDoubleQuote  : true,                 // remove " of "hogehoge"
			col_midasi         : '0',                  //
			row_sep            : '\n',                 //Separator of rows. default '\n'
			col_sep            : ',',                  //Separator(,|\t|;) of cols. default ','
			sortable           : true,                 //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="'+op.nowloadingImg+'"> '+op.nowloadingMsg+' </div>' )

		if(url){
			$.get(url+"?"+(new Date()).getTime(),"",function(data,textStatus){
				getData(data);
			});
		} else {
			if(op.data)getData(op.data);
			else return;
		}

		$.fn.csv2table.wrtTable=function(sortType,colIndex,id){
			$("#"+id).html(  mkTable(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])
		}

		function getData(data){

			$.csv2table.data[id]=data;
			$(".csv2table-loading").fadeOut();
			$(contents).html( mkTable(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]);

		}

		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 mkTable(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])
					}
				} 
			}

			if(!rowsAry)return 
			var rowlen=rowsAry.length
			
			var tdClass                             ; 
			var row = rowsAry.length                ; 
			var col = rowsAry[0].length             ;  
			
			htm="";
			str="";
			style="";
			str+= '<span class="ticker_spacer"></span>';

				
			//Making the scroller content
			for (i=eval(op.col_midasi); i<row; i++) {
				
				//Checks for alternate colors, for odd it is white and even it is #c15717;
				if(i%2==0){
					str+= "<a href='"+rowsAry[i][1]+"'"+" class='ticker_news1' style='color:#FFFF33;' target='_blank'>" +rowsAry[i][0]+ "</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
				} else {
					str+= "<a href='"+rowsAry[i][1]+"'"+" class='ticker_news1' style='color:#00d4d8;' target='_blank'>" +rowsAry[i][0]+ "</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
				}
				
				//commented since it is not in use.
				/*for (j=0; j<col; j++) {
					if(i%2==0){
						str+= rowsAry[i][j]+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
					} else {
						str+= "<a href='"+rowsAry[i][j]+"'"+" class='ticker_news1' style='color:#c15717;' target='_blank'>" +rowsAry[i][j]+ "</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
					}
				}	*/
			}
			
			str+= '<span class="ticker_spacer"></span>';
			
			var tableHtm=document.getElementById(id)
				.innerHTML=str;
			//return str;
		}
		
		////
		// 並べ替え
		// @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,
					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]) 
			})
		}
	}


})(jQuery);

