//@utf-8

(function($j) {

	$j.csv2table={
		name     : 'csv2table',
		version  : '0.02-b-1.7',
		updateMemo : 'csv2table-0.02-b-1.7 : Added $j.csv2table.name',
		ver      : '<span class="csv2tableVersion" style="color:#aaa"></span><script>jQuery(function($j){ $j(".csv2tableVersion").html("version:csv2table-"+$j.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='./img/icon-loadinfo.gif',
		sortDImg : (new Image()).src='/product/wind/shared/images/icon_sort-down.gif',
		sortAImg : (new Image()).src='/product/wind/shared/images/icon_sort-up.gif',
		setting  : [],
		data     : [],
		_rowsAry : [],
		_specAry : [],
		err      : []
	}

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

		if(!setting)var setting={};
		var contents=$j.fn.csv2table.el=this,id=this[0].id,
		op = $j.csv2table.setting[id] = $j.extend({
			url                : url,
//			nowloadingImg      : $j.csv2table.loadImg,              //Image of now loading...
			nowloadingMsg      : 'now loading...',                 //Massege of  now loading...
			removeDoubleQuote  : true,                             // remove " of "hogehoge"
			col_midasi         : '0',                              //
			col_dispno         : '3',                              //
			col_td             : '4',                              //
			col_data           : '5',                              //
			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]
		}

		$j(contents).before('<div class="csv2table-loading"> '+op.nowloadingMsg+' </div>' )

		$j.get(url+"&"+(new Date()).getTime(),"",function(data,textStatus){
			$j.csv2table.data[id]=data;
			$j(".csv2table-loading").fadeOut();
			$j(contents).css("display","none").html(  mkRowsAry(id,data));
			$j(contents).fadeIn();
			if($j.csv2table.setting[id].onload)$j.csv2table.setting[id].onload(id,op,data,$j.csv2table._rowsAry[id]);
		});

		$j.csv2table.wrtTable=function(sortType,colIndex,id){
			$j("#"+id).html(  mkRowsAry(id,$j.csv2table._rowsAry[id],sortType,colIndex));
			if($j.csv2table.setting[id].onload)$j.csv2table.setting[id].onload(id,op,$j.csv2table.data[id],$j.csv2table._rowsAry[id]);
		}

		$j.csv2table.dispTable=function(id){
			$j("#"+id).html(  mkRowsAry(id,$j.csv2table.data[id]));
			if($j.csv2table.setting[id].onload)$j.csv2table.setting[id].onload(id,op,$j.csv2table.data[id],$j.csv2table._rowsAry[id]);
		}

		$j.csv2table.reset=function(){
			rowsAry=$j.csv2table._rowsAry[id]=escapeStrComma(op.col_sep,op.row_sep,$j.csv2table.data[id],op.removeDoubleQuote);
			$j("#"+id).html( mkTable(rowsAry, id));
		}

		function orderWk(ary,sortType,colIndex){
			ary.head=ary.slice(0,op.col_data)
			var rowsAry=ary.slice(op.col_data,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=$j.csv2table._rowsAry[id]=orderWk($j.csv2table._rowsAry[id],sortType,colIndex);
			} else {
				if(op.col_sep==','){
					rowsAry=$j.csv2table._rowsAry[id]=escapeStrComma(op.col_sep,op.row_sep,data,op.removeDoubleQuote);

				} else {
					if(op.select == '*'||op.select == ['*']||!op.select)
						rowsAry=$j.csv2table._rowsAry[id]=mkArray(data,op.col_sep,op.row_sep);
					else
						rowsAry=$j.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=$j.csv2table._rowsAry[id]=orderWk(rowsAry,op.orderBy[i][1],op.orderBy[i][0])
					}
				}
			}

			var tableHtm=mkTable(rowsAry, id);

			return tableHtm;
		}


		function  mkTable(rowsAry, id){
			if(!rowsAry)return
			var rowlen=rowsAry.length

			var tdClass                             ;
			var row = rowsAry.length                ;
			var col = rowsAry[op.col_midasi].length ;
            var pNo = "";
            var prodNo = "";
			var newSpecList = "";

			var chkSpec = "";
			var dispSpec = new Array();

			htm="";

			var dispCol = 0;
			odrcol  = eval(op.col_midasi+1);
			linkcol = eval(op.col_midasi+2);

			//見出し行の処理
			for (k=0; k<col; k++) {
    		    if (rowsAry[op.col_midasi][k] != "") {

					if (rowsAry[op.col_dispno][k] == "99999999") {
						dispSpec[k] = true;
					} else {
						chkSpec = document.getElementById("spec[" + rowsAry[op.col_dispno][k] + "]");
						if (chkSpec != null) {
							dispSpec[k] = chkSpec.checked;
						}
						else
							if (rowsAry[op.col_dispno][k] == "99999999") {
								dispSpec[k] = true;
							}
					}
					if (dispSpec[k]) {
	    		    	dispCol++;
						htm += "<th>";

						if(op.sortable){
							if (rowsAry[odrcol][k] != "" && rowsAry[odrcol][k] != "pLink") {
								htm+="<ul class=\"sort\">"
								   + "<li><a href='javascript:$j.csv2table.wrtTable(\"D\","+rowsAry[odrcol][k]+",\""+id+"\")'>"
								   + "<img src=\""+$j.csv2table.sortDImg+"\" alt=\"\" width=\"5\" height=\"10\" />"
								   + "</a></li>"
								   + "<li><a href='javascript:$j.csv2table.wrtTable(\"A\","+rowsAry[odrcol][k]+",\""+id+"\")'>"
								   + "<img src=\""+$j.csv2table.sortAImg+"\" alt=\"\" width=\"5\" height=\"10\" /></a></li></ul>";
							} else if (rowsAry[odrcol][k] == "pLink") {
								pNo = k;
							}
						}
						htm+= rowsAry[op.col_midasi][k];
						htm+= "</th>\n";
					}
				} else if (rowsAry[odrcol][k] == "pLink") {
          			pNo = k;
				}
			}
			htm+= "</thead>\n<tbody>\n";
            // リンク先の場所
            if (pNo !== "") {
            	prodNo = rowsAry[linkcol][0];
            }

			chkdata = eval(op.col_data);
			if (rowsAry[chkdata][0] == "NoData" || rowsAry[chkdata][0] == "現在登録されているデータはありません") {
				if (id=="view0" || id=="view1") {
					htm+= "<tr><td corspan=\""+dispCol+"\">現在登録されているデータはありません</td></tr>";
				} else if (id=="viewevt1") {
					return;
				} else if (id=="viewevt2") {
					htm+= "<tr><td corspan=\""+dispCol+"\">現在最新イベントはありません</td></tr>";
				}
			} else {
				//data行の処理
				for (i=eval(op.col_data); i<row; i++) {
					htm+= "<tr>\n";
					//列の処理
					for (j=0; j<col; j++) {
						if (rowsAry[op.col_midasi][j] != "" && dispSpec[j]) {
							htm+= "<td "+rowsAry[op.col_td][j]+">";
							if (prodNo != "" && prodNo == j) {
								dispVal = fnSetLinkUrl(rowsAry[i][pNo], rowsAry[i][j]);
							} else {
   					        	dispVal = rowsAry[i][j].replace(/、/g, ",");
   					        }
							htm+= dispVal + "&nbsp;</td>\n";
							if (rowsAry[op.col_dispno][j] != "99999999") {
								newSpecList += rowsAry[op.col_dispno][j]+",";
							}
						}
					}
					htm+= "</tr>\n";
				}
			}

			var tableHtm="";
			if (id=="viewevt1") {
				tableHtm=document.getElementById(id)
					.innerHTML="<h2 class=\"hdType01\"><img src=\"/product/wind/events/images/idx_hd_closeup.gif\" alt=\"クローズアップイベント\" width=\"246\" height=\"21\" /></h2>"
						+"<table class=\"tableType01\" cellspacing=\"0\"><thead>"+htm+"</tbody></table>";
			} else if (id=="viewevt2") {
				tableHtm=document.getElementById(id)
					.innerHTML="<table class=\"tableType01\" cellspacing=\"0\"><thead>"+htm+"</tbody></table>";
			} else {
				tableHtm=document.getElementById(id)
					.innerHTML="<table class=\"tableType01\" cellspacing=\"0\" border=\"1\"><thead>"+htm+"</tbody></table>";
			}

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

			return tableHtm;

		}

		// リンク用
		function fnSetLinkUrl(linkUrl, prodNm) {
			var url = "";
			if (linkUrl != "" && prodNm != "") {
				url = '<a href="'+linkUrl+'" target="_blank">'+prodNm+'</a>';
			} else {
				url = prodNm;
			}
			return url;
		}


		////
		// 並べ替え
		// @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))*?(["]$j|["][,('+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_wind= oj.replace('""',dmystr_wDquote);
			escape_wind= escape_wind.replace(
				new RegExp(reg,"g"),
				function (after,before,index) {
					after= after
							.replace(/(\r\n)(?!$j)/g,dmystr_rn)
							.replace(/,(?!$j)/g,dmystr_comma)
					return after

				}
			)

			if(op.select == '*'||op.select == ['*'])
					r=$j.csv2table._rowsAry[id]=mkArray(escape_wind,op.col_sep,op.row_sep);
			else	r=$j.csv2table._rowsAry[id]=mkSelectedArray(escape_wind,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]=$j.trim(r[i][j])
							.replace(/^"|"$j/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($j.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($j.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
		}

		return this
	}


})(jQuery);
