jQuery.fn.CoreTpl = function Cfg(cfg){
	var Settings;
	var Defaults = {_UseTpl : false,TplID : '', PagingID : '', URL : '',URLData : {}, ResultCount : {},Tpl : '', Data : [],PagingLink : '#',Loading : '/images/loading.gif',OnPageChange : function(){},
	Action : {}, //process data before replacing
	AfterInsert : function(){}};
	Settings = jQuery.extend({}, Defaults, cfg);
	var _CoreTpl = {Settings : Settings, Load : function(){},Loading : function(){},Process : function(){},Pager : function(){},PagerURL : function(){},ToPage : function(){},Page : function(){}};
	_CoreTpl.Load = function(){
		_CoreTpl.Pager();
	};
	_CoreTpl.Loading = function(){
		$(_CoreTpl.Settings.TplID).html('<li><div class="contentCenter"><img src="'+_CoreTpl.Settings.Loading+'"/></div></li>');
	};
	_CoreTpl.Process = function(){
		var s = _CoreTpl.Settings;
		var d = s.Data;
		if(s.TplID == '') return;
		if(d.length == 0){
			$(s.TplID).html('');
			_CoreTpl.Pager();
			return;
		}
		//replace necessary keys
		s.Tpl = jQuery.UHDataVar(s.Tpl);
		var o = '';
		if(s._UseTpl == true){
			o = $.fn.tpl(UH.Tpl(s.Tpl), {data : d});
		}else{
			for(var i = 0; i < d.length; i++){
				var tpl = s.Tpl;
				for(var x in d[i]){
					if(d[i][x] == null) d[i][x] = '';
					var data = s.Action[x] == undefined || s.Action[x] == '' ? d[i][x] : s.Action[x](d[i][x]);
					eval("tpl = tpl.replace(/{"+x.toUpperCase()+"}/g, data);");
				}
				o += tpl;
			}
		}
		$(s.TplID).html(o);
		_CoreTpl.Pager();
		s.AfterInsert();
	};
	_CoreTpl.Pager = function(){
		var s = _CoreTpl.Settings.ResultCount;
		if(s.Page == undefined){
			jQuery(_CoreTpl.Settings.PagingID).html('');
			return;
		}
		s.Page = parseInt(s.Page);s.TotalPage = parseInt(s.TotalPage);
		if(s.TotalPage == 0 || s.TotalPage == 1){
			jQuery(_CoreTpl.Settings.PagingID).html('');
			return;
		}
		if(_CoreTpl.Settings.PagingID == ''){
			jQuery(_CoreTpl.Settings.PagingID).html('');
			return;
		}
		var start = s.Page - 5 > 1 ? s.Page - 5 : 1;
		var end = s.Page + 5 < s.TotalPage ? s.Page + 5 : s.TotalPage;
		var first =  s.Page > 1 ? true : false;
		var last =  s.Page <  s.TotalPage ? true : false;
		var prev =  s.Page > 1 ? true : false;
		var next =  s.Page <  s.TotalPage ? true : false;
		var tmp = '';
		tmp += first ? '<li class="first"><a href="'+_CoreTpl.PagerURL(1)+'" data-p="1">|&lt;</a></li>':'<li class="off">|&lt;</li>';
		tmp += prev ? '<li class="first"><a href="'+_CoreTpl.PagerURL(s.Page-1)+'" data-p="'+(s.Page-1)+'">&laquo;</a></li>':'<li class="off">&laquo;</li>';

		for(var i = start; i <= end;i++){
			tmp += i == s.Page ? '<li class="active">'+i+'</li> ' : '<li><a href="'+_CoreTpl.PagerURL(i)+'" data-p="'+i+'">'+i+'</a></li>';
		}
		tmp += next ? '<li class="last"><a href="'+_CoreTpl.PagerURL(s.Page+1)+'" data-p="'+(s.Page+1)+'">&raquo;</a></li>':'<li class="off">&raquo;</li>';
		tmp += last ? '<li class="last"><a href="'+_CoreTpl.PagerURL(s.TotalPage)+'" data-p="'+s.TotalPage+'">&gt;|</a></li>':'<li class="off">&gt;| </li>';
		
		jQuery(_CoreTpl.Settings.PagingID).html(tmp);
		jQuery(_CoreTpl.Settings.PagingID + ' li a').each(
		function(Idx){
			return jQuery(this).click(_CoreTpl.Page);
		}
		);
	};
	_CoreTpl.PagerURL = function(p){
		return _CoreTpl.Settings.PagingLink != '#' ? _CoreTpl.Settings.PagingLink.replace('{P}',p) : '#';
	};
	_CoreTpl.Refresh = function(){
		return _CoreTpl.ToPage(_CoreTpl.Settings.ResultCount.Page);
	};
	_CoreTpl.ToPage = function(p){
		if(_CoreTpl.Settings.URL == '') return;
		if(p != '' && p == 0) return;
		_CoreTpl.Loading();
		jQuery.post(_CoreTpl.Settings.URL.replace('{P}',p).replace('{PP}',_CoreTpl.Settings.ResultCount.PerPage), _CoreTpl.Settings.URLData,
			function(data){
			 if(data["ErrorStr"] == "")
			 {
				_CoreTpl.Settings.ResultCount = data['ResultCount'];
				_CoreTpl.Settings.Data = data['Data'];
			 	_CoreTpl.Process();
			 }
			 }, "json");
	};
	_CoreTpl.Page = function(event){
		if(_CoreTpl.Settings.OnPageChange(this) == true) return true;
		event.preventDefault();
		var p = parseInt(jQuery(this).data('p'));
		_CoreTpl.ToPage(p);
		return false;
	};

	jQuery(this).data('_CoreTpl',_CoreTpl);
	//jQuery(this).data('_CoreTpl').Load();
	return this;
}
jQuery.fn.coregrid = function(Cfg){
	var Settings;
	var Defaults = {DataType : 'json', TargetID : null,
	Height : 0, ScrollV : true, Data : [], SourceID : null, URL : null, URLData : {}, 
	Page : 1, PerPage : 15,Pages : 1, PagerEnable : true, PagerClass : '', PagerSettings : {First : true, Prev : true, Next : true, Last : true, Link : '#'},
	SortAllow : false, Sort : 'Desc', SortIdx : '',
	Events : {}, ColsDisplay : 0, Tpl : '<table cellspacing="0" cellpadding="0">{HEAD}{FOOT}<tbody></tbody></table>', Foot : '',
	Cols : [], RowSelectedClass : '', RowSelected : [], onRowSelected : function(data){}};
	//PageLink # or http://{PAGE}
	//tpl: Cols : [{Display : true, Name : '', Index 0, Key : '', Width : 0,Scope : '',Class='',DScope='', Value : function(v){return v;}},]
	Settings = jQuery.extend({}, Defaults, Cfg);
	
	var _CoreGrid = {Settings : Settings,
	Head : function(){
		var tmp = '<tr>';
		for(var i  = 0; i < _CoreGrid.Settings.Cols.length; i++){
			if(_CoreGrid.Settings.Cols[i].Display == true){
				tmp += '<th'+(Scope ? ' scope="'+Scope+'"':'')+(Class ? ' scope="'+Class+'"': '')+(Width ? ' width="'+Width+'"' : '')+'>'+_CoreGrid.Settings.Cols[i].Name+'</th>';
				_CoreGrid.Settings.ColsDisplay++;
			}
		}
		return '<thead>'+tmp+'</thead>';
	},
	Foot : function(){
		return _CoreGrid.Settings.Foot != '' ? '<tfoot>'+_CoreGrid.Settings.Foot+'</tfoot>' : '';
	},
	Load : function(){
		if(_CoreGrid.Settings.DataType == "json" && _CoreGrid.Settings.URL != null){
			jQuery.post(_CoreGrid.Settings.URL.replace('{P}',_CoreGrid.Settings.Page).replace('{PP}',_CoreGrid.Settings.PerPage), _CoreGrid.Settings.URLData,
			function(data){
			 if(data["ErrorStr"] == "")
			 {
				_CoreGrid.Settings.Data = Data['Data'];
				_CoreGrid.Settings.Page = 1;
				_CoreGrid.Settings.Pages = Data['Total']['TotalPage'];
			 	_CoreGrid.Process();
			 }
			 }, "json");
		}else if (_CoreGrid.Settings.DataType == 'table' && _CoreGrid.Settings.SourceID != null){
			jQuery('#'+_CoreGrid.Settings.SourceID).css('display','none');
			var keyval = [];
			for(i = 0; i < _CoreGrid.Settings.Cols.length; i ++){
				keyval[_CoreGrid.Settings.Cols[i].Index] = _CoreGrid.Settings.Cols[i].Key;
			}
			var source = jQuery('#'+_CoreGrid.Settings.SourceID).find('tbody').children();
			var item = {};
			_CoreGrid.Settings.Data = [];
			for(i = 0; i < source.length; i++){
				var eachitem = jQuery(source[i]).children();
				for(j = 0; j < eachitem.length; j++){
					item[keyval[j]] = jQuery(eachitem[j]).html();
				}
				_CoreGrid.Settings.Data[i] = item;
				item = {};
			}
			_CoreGrid.Process();
		}
	},
	Process : function(){
		var grid = jQuery(_CoreGrid.Settings.Tpl.replace('{HEAD}',_CoreGrid.Head()).replace('{FOOT}',_CoreGrid.Foot()));

		var tbody = grid.find('tbody');
		for(i = 0; i < _CoreGrid.Settings.Data.length; i++){
			var tr = jQuery('<tr></tr>').data('_CoreGridItem', _CoreGrid.Settings.Data[i]);
			for(j = 0; j < _CoreGrid.Settings.Cols.length; j++){
				if(_CoreGrid.Settings.Cols[j].Display == true){
					jQuery('<td'+(DScope ? ' scope="'+DScope+'"':'')+'>'+
					(_CoreGrid.Settings.Cols[j].Value ? Value(_CoreGrid.Settings.Data[i]) : _CoreGrid.Settings.Data[i][_CoreGrid.Settings.Cols[j].Key])+'</td>').appendTo(tr);
				}
			}
			for(var k in _CoreGrid.Settings.Events){
				tr.bind(k,{Item : _CoreGrid.Settings.Data[i]},  _CoreGrid.Settings.Events[k]);
			}
			if(_CoreGrid.Settings.RowSelectedClass != ''){
				tr.bind('click', {Item : _CoreGrid.Settings.Data[i]}, function(event){
					$(this).toggleClass(_CoreGrid.Settings.RowSelectedClass);
					var selected = false;
					if(_CoreGrid.Settings.RowSelected.length > 0){
						for(var i in _CoreGrid.Settings.RowSelected){
							if(jQuery.param(_CoreGrid.Settings.RowSelected[i]) == jQuery.param(event.data.Item))
							{selected = true;break;}
						}
					}
					if(selected == true){_CoreGrid.Settings.RowSelected.splice(i,1);}
					else{_CoreGrid.Settings.RowSelected[_CoreGrid.Settings.RowSelected.length] = event.data.Item;
					_CoreGrid.Settings.onRowSelected(event.data.Item);}
				});
			}
			tbody.append(tr);
		}
		if(_CoreGrid.Settings.Height > 0){
			tbody.height(_CoreGrid.Settings.Height);
			if(_CoreGrid.Settings.ScrollV == true) tbody.css('overflow-y','auto');
			else tbody.css('overflow-y','hidden');
			tbody.css('overflow-x','hidden');
		}
		if(_CoreGrid.Settings.TargetID){
			jQuery('#'+_CoreGrid.Settings.TargetID).html('');
			 jQuery('#'+_CoreGrid.Settings.TargetID).append(grid);
		}
		_CoreGrid.Pager();

	},
	Pager : function(){
		var s = _CoreGrid.Settings;
		if(s.PagerClass == '') return;
		var start = s.Page - 5 > 1 ? s.Page - 5 : 1;
		var end = s.Page + 5 < s.Pages ? s.Page + 5 : s.Pages;
		var first =  s.PagerSettings.First && s.Page > 1 ? true : false;
		var last =  s.PagerSettings.First && s.Page <  s.Pages ? true : false;
		var prev =  s.PagerSettings.Prev && s.Page > 1 ? true : false;
		var next =  s.PagerSettings.Next && s.Page <  s.Pages ? true : false;
		var tmp = '';
		
		if(s.PagerSettings.First){
			tmp += first ? '<li class="first"><a href="'+_CoreGrid.PagerURL(1)+'">|&lt;</a></li>':'<li class="off"><a href="'+_CoreGrid.PagerURL(1)+'">|&lt;</a></li>';
		}
		if(s.PagerSettings.Prev){
			tmp += prev ? '<li class="first"><a href="'+_CoreGrid.PagerURL(s.Page-1)+'">&laquo;</a></li>':'<li class="off"><a href="'+_CoreGrid.PagerURL(s.Page-1)+'">&laquo;</a></li>';
		}
		for(var i = start; i < end;i++){
			tmp += i == s.Page ? '<li class="active">'+i+'</li> ' : '<li><a href="'+_CoreGrid.PagerURL(i)+'">'+i+'</a></li>';
		}
		if(s.PagerSettings.Next){
			tmp += next ? '<li class="last"><a href="'+_CoreGrid.PagerURL(s.Page+1)+'">|&lt;</a></li>':'<li class="off"><a href="'+_CoreGrid.PagerURL(s.Page+1)+'">|&lt;</a></li>';
		}
		if(s.PagerSettings.Last){
			tmp += last ? '<li class="last"><a href="'+_CoreGrid.PagerURL(end)+'">&laquo;</a></li>':'<li class="off"><a href="'+_CoreGrid.PagerURL(end)+'">&laquo;</a></li>';
		}
		jQuery('.'+s.PagerClass).html(tmp);
		//perform page click:
		jQuery('.'+s.PagerClass + ' a').each(
		function(Idx){
			jQuery(this).click(_CoreGrid.Page);
		}
		);
	},
	PagerURL : function(p){
		return _CoreGrid.Settings.PagerSettings.Link != '#' ? _CoreGrid.Settings.PagerSettings.Link.replace('{P}',p) : '#';
	},
	Page : function(event){
		if(!_CoreGrid.Settings.PagerEnable || _CoreGrid.Settings.URL == null) return;
		event.preventDefault();
		jQuery.post(_CoreGrid.Settings.URL.replace('{PAGE}',jQuery(this).html()).replace('{PERPAGE}',_CoreGrid.Settings.PerPage), _CoreGrid.Settings.URLData,
			function(data){
			 if(data["ErrorStr"] == "")
			 {
				_CoreGrid.Settings.Data = Data['Data'];
				_CoreGrid.Settings.Page = Data['Total']['Page'];
				_CoreGrid.Settings.Pages = Data['Total']['TotalPage'];
			 	_CoreGrid.Process();
			 }
			 }, "json");
	}
	};
	jQuery(this).data('_CoreGrid',_CoreGrid);
	jQuery(this).data('_CoreGrid').Load();
	return this;
};
