//对datagrid的参数进行扩展,增加了以下3个参数
 $.extend($.fn.datagrid.defaults, {
	groupHeight: 25,//分组区域出现时的高度
	expanderWidth: 30,//分组左侧的+-号的宽度
	groupStyler: function(value,rows){return ''}//组的css样式
});

//定义全新的分组样式的grid视图,继承默认的视图
var groupview = $.extend({}, $.fn.datagrid.defaults.view, {
	//会执行2次,第一次是冻结列,第二次是指标列(非冻结)
	render: function(target, container, frozen){
		var state = $.data(target, 'datagrid');
		var table = [];
		this.currentIndex = 0;
		var opts = state.options;
		var groupFields = opts.groupField;//分组字段
		if(typeof groupFields == 'string'){
			groupFields = groupFields.split(',');
		}
		//每个汇总字段的计数
		this.fieldCountMap = {};
		for(var i=0;i<groupFields.length;i++){
			this.fieldCountMap[groupFields[i]] = 0;
		}

		var groupOrder = this.groupOrder;
		table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>');
		for(var i=0; i<groupOrder.length; i++){
			var nextOrderIndex = [];
			//默认下一个为空
			if(i < groupOrder.length - 1){
				nextOrderIndex = groupOrder[i+1];
			}
			//上一个,默认也为空
			var lastOrderIndex = [];
			if(i>0){
				lastOrderIndex = groupOrder[i-1];
			}
			if(lastOrderIndex.length == 0 || lastOrderIndex[0]!==groupOrder[i][0]){
				//table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>');
			}
			table.push(this.renderGroup.call(this, target, groupOrder[i],nextOrderIndex, frozen));
			if(nextOrderIndex.length==0 || nextOrderIndex[0]!==groupOrder[i][0]){
				//table.push('</tbody></table>');
			}
		}
		table.push('</tbody></table>');
		if(!frozen){
			state.data.rows = this.newRows;
		}
		$(container).html(table.join(''));
	},
	
	renderGroup: function(target, groupIndexArray,nextGroupIndexArray, frozen){
		var state = $.data(target, 'datagrid');
		var opts = state.options;
		var fields = $(target).datagrid('getColumnFields', frozen);
		var frozenFields = $(target).datagrid('getColumnFields', true);
		var hasFrozen = opts.frozenColumns && opts.frozenColumns.length;
		var groups = this.groups;
		if (frozen){
			if (!(opts.rownumbers || hasFrozen)){
				return '';
			}
		}
		var groupFields = opts.groupField;//分组字段
		if(typeof groupFields == 'string'){
			groupFields = groupFields.split(',');
		}
		var table = [];
		var nestedObj = groups;
		var groupname = '';
		var groupPos = -1;
		//获取当前小组的数据
		for(var i=0;i<groupIndexArray.length;i++){
			groupname = groupIndexArray[i];
			groupPos = i;
			nestedObj = nestedObj[groupname];
		}

		var dataLen = nestedObj.length;
		if(true){
			//是否添加小计:
			dataLen++;
		}
		for(var j=0; j<dataLen; j++) {
			var rowData = null;
			var isSum = false;
			if(j==nestedObj.length){
				var jo = opts.sumFormatter.call(target, groupname, nestedObj);
				rowData = buildFrozenSumRow(nestedObj,groupPos,groupname,jo);
				isSum = true;
			}else{
				//if ((frozen && hasFrozen)){
				//	var oldval = this.fieldCountMap[groupFields[groupPos]];
				//	this.fieldCountMap[groupFields[groupPos]] = oldval+1;
				//}
				rowData = nestedObj[j];
			}
			if (!(frozen && hasFrozen)){
				this.newRows.push(rowData);
			}
			var htmltr = renderRowExt(this,rowData,isSum);
			table.push(htmltr);
			this.currentIndex++;
		} 
		//判断是否需要上级(上上级)的小计:
		for(var m=groupIndexArray.length-2;m>=0;m--){
			//倒数第二个开始
			var isAddExtraRow = false;
			var curGroup = groupIndexArray[m];
			if(nextGroupIndexArray.length == 0){
				isAddExtraRow = true;
			}else{
				var nextGroup = nextGroupIndexArray[m];
				if(curGroup == nextGroup){
					break;
				}else{
					isAddExtraRow = true;
				}
			}
			//如果需要添加合计页
			if(isAddExtraRow == true){
				var jo = opts.sumFormatter.call(target, curGroup, nestedObj);
				var rowData = buildFrozenSumRow(nestedObj,m,curGroup,jo);
				var htmltr = renderRowExt(this,rowData,true);
				table.push(htmltr);
				this.currentIndex++;
				if (!(frozen && hasFrozen)){
					this.newRows.push(rowData);
				}
			}
			
		}
		
		return table.join('');
 

		/**
		 * [buildFrozenSumRow 构建冻结区块的合计信息]
		 * @param  {[type]} rows        [description]
		 * @param  {[type]} groupPos [description]
		 * @param  {[type]} title       [description]
		 * @return {[type]}             [description]
		 */
		function buildFrozenSumRow(rows,groupPos,title,jo){
			var keyField = '';
			if(frozenFields.length>groupPos+1){
				keyField = frozenFields[groupPos+1];
			}
			if(!jo){
				jo = {};
			}

			if(rows.length>0){
				jo = $.extend(jo,rows[0]);
			}
			if(keyField){
				jo[keyField] = title+' 小计';
			}
			if(frozenFields.length>groupPos+2){
				for(var i=groupPos+2;i<fields.length;i++){
					jo[frozenFields[i]] = '';//清空后续的列的值
				}
			}
			return jo;
		}


		function renderRowExt(that,rowData,isSumRow){
			var innerTable= [];
			var css = opts.rowStyler ? opts.rowStyler.call(target, that.currentIndex, rowData) : '';
			var classValue = '';
			var styleValue = '';
			if (typeof css == 'string'){
				styleValue = css;
			} else if (css){
				classValue = css['class'] || '';
				styleValue = css['style'] || '';
			}
			if(isSumRow && isSumRow == true){
				//TODO 临时
				classValue = 'row-sum'
			}

			var cls = 'class="datagrid-row ' + (that.currentIndex % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + classValue + '"';
			var style = styleValue ? 'style="' + styleValue + '"' : '';
			var rowId = state.rowIdPrefix + '-' + (frozen?1:2) + '-' + that.currentIndex;
			innerTable.push('<tr id="' + rowId + '" datagrid-row-index="' + that.currentIndex + '" ' + cls + ' ' + style + '>');
			innerTable.push(that.renderRow.call(this, target, fields, frozen, that.currentIndex, rowData));
			innerTable.push('</tr>');
			return innerTable.join('');
		}
		/*
		function getSumTitle(groupIndexArray,thisPath){
			var title = '';
			var index = -1;
			for(var i=0;i<groupIndexArray.length;i++){
				if(thisPath == groupIndexArray[i]){
					index = i-1;
					break;
				}
			}
			if(index>=0){
				title = groupIndexArray[index];
			}
			return title + '小计';
		}*/
	},
	/*
	bindEvents: function(target){
		var state = $.data(target, 'datagrid');
		var dc = state.dc;
		var body = dc.body1.add(dc.body2);
		var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler;
		body.unbind('click').bind('click', function(e){
			var tt = $(e.target);
			var expander = tt.closest('span.datagrid-row-expander');
			if (expander.length){
				var gindex = expander.closest('div.datagrid-group').attr('group-index');
				if (expander.hasClass('datagrid-row-collapse')){
					$(target).datagrid('collapseGroup', gindex);
				} else {
					$(target).datagrid('expandGroup', gindex);
				}
			} else {
				clickHandler(e);
			}
			e.stopPropagation();
		});
	},*/
	//渲染前的事件
	onBeforeRender: function(target, rows){
		var state = $.data(target, 'datagrid');
		var opts = state.options;
		var groupFields = opts.groupField;//分组字段
		if(typeof groupFields == 'string'){
			groupFields = groupFields.split(',');
		}
		var groups = {};//分组信息
		var groupOrder = [];//分组顺序
		initCss();
		groupRows(rows,groupFields);
		//state.data.rows = newRows;
		this.groups = groups;
		this.groupOrder = groupOrder;
		this.newRows = [];//新数据
		/*
		var that = this;
		setTimeout(function(){
			that.bindEvents(target);
		},0);*/
		
		function groupRows(rows,groupFields){
		    var groupOrderStr = [];
		    for(var i=0; i<rows.length; i++){
	            var row = rows[i];
	            var oldVal = groups;
	            var path = [];
	           for(var j=0; j<groupFields.length; j++){
	           	    path.push(row[groupFields[j]]);
	                if(!oldVal[row[groupFields[j]]]){
	                    if(j == groupFields.length-1){
	                        oldVal[row[groupFields[j]]] = [];
	                    }else{
	                        oldVal[row[groupFields[j]]] = {};
	                    }
	                }
	                oldVal = oldVal[row[groupFields[j]]];
	            }
	            oldVal.push(row);
	            var pathStr = path.join('&#');
	            if($.inArray(pathStr,groupOrderStr) == -1){
	            	groupOrder.push(path);
	            	groupOrderStr.push(pathStr);
	            }
	        }
		}

		function initCss(){
			if (!$('#datagrid-group-style').length){
				$('head').append(
					'<style id="datagrid-group-style">' +
					'.row-sum{/*background-color:#34d7d9 !important;*/ font-weight:700;}'+
					'.datagrid-td-rownumber{font-weight:400;}'+
					'</style>'
				);
			}
		}
	},
	onAfterRender: function(target){
		$.fn.datagrid.defaults.view.onAfterRender.call(this, target);
		//合并单元格;
		//$(target).datagrid('autoMergeCells', ['company','brand']);
	}
});