//@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='/shared/img/sort_descending.gif',
		sortAImg : (new Image()).src='/shared/img/sort_ascending.gif',
		setting  : [],
		data     : [],
		_rowsAry : [],
		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_data           : '6',                              //
			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);

        var sType = "";
        var cIdx  = "";

		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,nowIndex,id){
			sType = sortType;
			cIdx  = nowIndex;
			$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.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, sType, cIdx));
		}

		function orderWk(ary,sortType,colIndex){
			sType = sortType;
			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, sType, cIdx);
			
			return tableHtm;
		}

		
		function  mkTable(rowsAry, id, sorttype, colindex){
			if(!rowsAry)return 
			var rowlen=rowsAry.length
			
			var tdClass                             ; 
			var row = rowsAry.length                ; 
			var col = rowsAry[0].length             ;  
            profList = new Array();
            var pCol = 0;
            var profNo = "";
            var picNo  = "";
            var picPlayerNo = "";
            var surveyUrl = "";
            var surveyName= "";
			
			htm="";

			var dispCol = 0;
			profcol = eval(op.col_midasi+1);
			imgcol = eval(op.col_midasi+2);
			odrcol = eval(op.col_midasi+3);
			tdcol  = eval(op.col_midasi+4);
			surcol = eval(op.col_midasi+5);
			//見出し行の処理
//			htm+= "<tr>";
			for (k=0; k<col; k++) {
                wkSort = "";
                wkImg  = "";
    		    if (rowsAry[op.col_midasi][k] != "") {
    		    	dispCol++;
        		    htm+= "<th>";

    				if(op.sortable){
						if (rowsAry[odrcol][k] != "" && rowsAry[odrcol][k] != "picNo") {
                            if (colindex == k && sorttype == "D") {
                              	wkSort = "A";
                               	wkImg  = $j.csv2table.sortDImg;
                            } else if (colindex == k && sorttype == "A") {
                               	wkSort = "D";
                               	wkImg  = $j.csv2table.sortAImg;
                            } else {
                               	wkSort = "A";
                               	wkImg  = "";
                            }
					        htm+="<a href='javascript:$j.csv2table.wrtTable(\""+wkSort+"\","+rowsAry[odrcol][k]+","+k+",\""+id+"\")'>";
       	        			htm+= rowsAry[op.col_midasi][k];
					        htm+="</a>";
                            if (colindex == k && wkImg != "") {
   							    htm+="<img src=\""+wkImg+"\" alt=\"\" width=\"16\" height=\"16\" borber=\"0\" />"
                            }
						} else if (rowsAry[odrcol][k] == "picNo") {
                			picNo = k;
    	        			htm+= rowsAry[op.col_midasi][k];
						} else {
    	        			htm+= rowsAry[op.col_midasi][k];
						}
					} else {
    	    			htm+= rowsAry[op.col_midasi][k];
					}
    				htm+= "</th>\r\n";
				} else if (rowsAry[odrcol][k] == "profNo") {
        			profNo = k;
				}
                // プロフィール
                if (rowsAry[profcol][k] != "") {
                    profList[pCol] = rowsAry[profcol][k];
                    pCol++;
                }
			}
			htm+= "</thead>\n<tbody>\n";

            // 画像使用時名前の場所
            if (picNo != "") {
            	picPlayerNo = rowsAry[imgcol][0];
            }

            // Survey
            if (rowsAry[surcol][0] != "") {
                surveyUrl = rowsAry[surcol][0];
                surveyName= rowsAry[surcol][1];
            }

			chkdata = eval(op.col_data);
			if (rowsAry[chkdata][0] == "NoData" || rowsAry[chkdata][0] == "現在登録されているデータはありません") {
				if (id=="view0" || id=="view1") {
					htm+= "<tr><td colspan=\""+dispCol+"\">現在登録されているデータはありません</td></tr>";
				}

			} else {
				//data行の処理
				var profCd = "";
				var wkval  = "";
				for (i=eval(op.col_data); i<row; i++) {
					profCd = "";
					pCol = 0;
					htm+= "<tr>";
					//列の処理
					for (j=0; j<col; j++) {
						if (rowsAry[op.col_midasi][j] != "") {
    				        htm+= "<"+rowsAry[tdcol][j]+">";
    				        if (profList[pCol] == j) {
    				        	if (picNo != "" && j == picNo) {
    				        		wkval  = fnGetAmateurData(rowsAry[i][picPlayerNo], "1");
    				        		wkdisp = fnSetImageFile(rowsAry[i][j], wkval);
    				        	} else {
    				        		wkdisp = fnGetAmateurData(rowsAry[i][j], "");
    				        	}
    				        	dispVal = fnSetProfile(profCd, wkdisp);
    				        	pCol++;
                            } else if (picNo != "" && j == picNo) {
   				        		wkval   = fnGetAmateurData(rowsAry[i][picPlayerNo], "1");
  				        		dispVal = fnSetImageFile(rowsAry[i][j], wkval);
                            } else if (rowsAry[i][j] == "Survey" && surveyUrl != "" && surveyName != "") {
   				        		wkval   = fnGetAmateurData(rowsAry[i][picPlayerNo], "1");
  				        		dispVal = fnSetSurveyButton(surveyUrl, surveyName, wkval);
    				        } else {
       					        dispVal = rowsAry[i][j].replace(/、/g, ",");
    					    }
   					        htm+= dispVal + "</td>";
						} else if (profNo == j) {
							profCd = rowsAry[i][j];
						}
					}
					htm+= "</tr>\r\n";
				}
			}

			var tableHtm="";

            if (id=="view0") {
    		    tableHtm=document.getElementById(id)
			    .innerHTML="<table summary=\"「ヤマハレディースオープン葛城」出場選手一覧\"><thead>"+htm+"</tbody></table>";
			} else if (id=="view1") {
    		    tableHtm=document.getElementById(id)
			    .innerHTML="<table summary=\"「ヤマハレディースオープン葛城」「ヤマハレディースオープン葛城」スコア一覧（大会最終日）\"><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 fnGetAmateurData(val, delFlg) {
        	if (delFlg != "") {
                val = val.replace(/:amateur/g, "");
            } else {
                val = val.replace(/:amateur/g, "（アマチュア）");
            }
            return val;
        }

        // プロフィール用
        function fnSetProfile(profCd, val) {
        	var wkVal = "";
        	if (profCd != "" && val != "") {
                profUrl = "window.open('/player/data/profile/?"+profCd+"','profile','scrollbars=yes,width=530,height=600')";
                wkVal = '<a href="javascript:;" onClick="'+profUrl+'">'+val+'</a>';
                val = wkVal;
            }
            return val;
        }
		
		// 画像用
		function fnSetImageFile(imageData, PlayerNm) {
			var imgHtml = "";
			if (imageData != "" && PlayerNm != "") {
				imgHtml = '<img src="'+imageData+'" alt="写真：'+PlayerNm+'" width="50" height="50">';
			}
			return imgHtml;
		}

        // Survey用
        function fnSetSurveyButton(surveyUrl, surveyName, playNm) {
            var SurveyHtml = "";
            if (surveyUrl != "" && surveyName != "" && playNm != "") {
                SurveyHtml = '<form action="'+surveyUrl+'" method="POST"><input type="hidden" name="'+surveyName+'" value="'+playNm+'"><input type="submit" value="応募する"></form>';
            }
            return SurveyHtml;
        }

		
		////
		// 並べ替え
		// @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);
