/* fields

page
sort
sorttype

rating
fullname
dtcreate
capital
gain
daygain
rating-dd
rating-fr

offers_activ
show_equity
sub_type
currency_USD
currency_EUR
currency_RUR

*/



(function($){

	$.ie6 = $.browser.msie && $.browser.version < 7;

	$.fn.extend({
		grid: function(config){
			this.each(function(){
				var form = $(this).closest('form').css('position', 'relative').submit(function(){return false;});;
				var mask = form.find('.mask').length ? form.closest('form').find('.mask') : $('<div class="mask"></div>').appendTo(form);
				mask.click(function(e){
					e.stopPropagation();
					e.preventDefault();
				});
				mask.height(form.outerHeight());

				var grid = {
					'source': $(this),
					'id': this.id + (config.popup ? '-popup' : ''),
					'filterContainer': config['filterContainer'],
					'filterFields': config['filterFields'],
					'fields': false,
					'visiblefields': {},
					'fieldsTarget': form.find('div.fields'),
					'cells': [],
					'innerWidth': 0,
					'fixedWidth': 0,
					'noscrollWidth': 0,
					'scrollWidth': 0,
					'stretchMinWidth': config.minwidth ? config.minwidth : 220,
					'load': config['load'],
					'notfound': config['notfound'],
					'form': form,
					'mask': $(mask),
					'url': $(this).closest('form').attr('action') ? $(this).closest('form').attr('action') : location.pathname,
					'showlink': false,
					'popup': config.popup,
					'scrollerwidth': gridScrollerWidth()
				}

				if (config.tooltipTexts){
					grid['tooltipTexts'] = {
						'invest': config['tooltipTexts'].invest,
						'more': config['tooltipTexts'].more
					}
				}

				grid['url'] = grid['url'] + '?' + Math.random();

				gridLoad(grid);

				if (grid.popup){
					$(window).bind('resize', function(){
						$('#popup').css('visibility', 'hidden');
						clearTimeout(grid.timeout);
						delete grid.timeout;
						grid.timeout = setTimeout(function(){
							gridResize(grid);
						}, 600);
					});

					$('#popup .popup-close a').click(function(e){
						e.preventDefault();
						gridRemove(grid);
						return false;
					});
				}
			});
		}
	});

	function gridRemove(grid){
		var popup = $('#popup');
		$(window).unbind('resize');
		$('#popup').remove();
		$.mask(false, false, false);
	}

	function gridResize(grid){
		gridAdjustPopup(grid);
	}

	function gridScrollerWidth(){
		var div = $('<div style="position: absolute; top: 0; left: 0; z-index: 100000; width: 200px;"><div style="width: 100%; background: #ccc; overflow: scroll;"><div>&nbsp;</div></div></div>').appendTo('body');
		var width = 200 - div.find('div>div').width() + 2;
		div.remove();
		return width;
	}

	function gridClose(grid){
		$(window).unbind('resize', function(){
			gridResize(grid);
		});
	}

	function gridAdjustPosition(grid){
		var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
		var popupWidth = $('#popup').outerWidth();
		var popupHeight = $('#popup').outerHeight();
		var offsetWidth = $('body').innerWidth();
		var offsetHeight = $('html').innerHeight();
		var left = (offsetWidth - popupWidth) / 2;
		var top = scrollTop + ((offsetHeight - popupHeight) / 2);

		$('#popup').stop().css('left', left);

		if ($('#popup').css('position') == 'fixed'){
			$('#popup').css('top', (offsetHeight - popupHeight) / 2);
		} else {
			$('#popup').css('top', top);
		}
	}

	function gridAdjustPopup(grid, force){
		gridAdjustWidth(grid, force);
		gridAdjustHeight(grid, force);
		gridAdjustPosition(grid, force);
		if (!window.opera){
			$('#popup').css('visibility', 'inherit');
		}
	}

	function gridAdjustWidth(grid, force){
		var bodyWidth = $('body').innerWidth();
		var currentWidth = $('#popup').outerWidth();
		var width = 1000;
		if (bodyWidth >= 1250){
			width = 1240;
		}

		if (force || currentWidth != width){
			$('#popup').width(width);
			gridInit(grid, false);
		}
	}

	function gridAdjustHeight(grid){
		var heightStretch = $('html').innerHeight() / 100 * 90;
		$('#popup').height(heightStretch);

		var height = heightStretch - grid.form.find('.grid-body-relative').eq(0).offset().top + $('#popup').offset().top - grid.form.find('.paging').outerHeight();
		grid.target.find('div.grid-body-absolute').css('width', '100%').css('overflow-y', 'auto').css('height', height);
		grid.target.find('div.grid-body-relative').height(height);

		if (window.opera){
			$('#popup').css('visibility', 'inherit');
		}
		var tableHeight = grid.target.find('div.grid-body-absolute table').height();
		if (tableHeight <= grid.target.find('div.grid-body-absolute').height()){
			grid.target.find('div.grid-body-absolute').height(tableHeight + grid.form.find('.grid-not-found').outerHeight());
			grid.target.find('div.grid-body-relative').height(tableHeight + grid.form.find('.grid-not-found').outerHeight());
			$('#popup').height(grid.form.height());
		}
	}

	function gridShowHash(e, grid){
		var hash = gridMakeHash(grid);
		var href = 'http://' + location.hostname + location.pathname + gridMakeHash(grid);
		e.preventDefault();
		e.stopPropagation();
		
		grid.filter['hashContainer'].show();
		grid.filter['hashContainer'].find('textarea').val('http://' + location.hostname + location.pathname + gridMakeHash(grid));
		grid.filter['hashContainer'].find('textarea').focus();
	}

	function gridHideHash(grid){
		grid.filter['hashContainer'].find('textarea').blur();
		grid.filter['hashContainer'].hide();
	}

	function gridMakeHash(grid){
		var hash = '#' + grid['id'] + '?';

		for (var i in grid['fields']){
			if (!grid['fields'][i] || grid['fields'][i] == '0') continue;
			var value = encodeURI(grid['fields'][i]) + '&';
/*
			if (i == 'page' && grid['form'].find('div.paging a.active').length){
				value = grid['form'].find('div.paging a.active').html().replace(/[\[\]]/g, '') + '&';
			}
*/
			hash += i + '=' + value;
//		hash += i + '=' + grid['fields'][i] + '&';
		}

		hash = hash.substring(0, hash.length - 1);

		location.hash = hash;

		return hash;
	}

	function gridParseHash(grid, clear){
		var hash = location.href.substring(location.href.indexOf('#')).replace('-popup', '');
		var query = (hash.substring(1, grid['id'].replace('-popup', '').length + 2) == grid['id'].replace('-popup', '') + '?') ? hash.substring(grid['id'].replace('-popup', '').length + 2) : false;

		if (!query) return;

		$('div.lang a').each(function(){
			var location = this.href.substring(0, this.href.indexOf('#') > -1 ? this.href.indexOf('#') : this.href.length);
			this.href = this.href + hash;
		});

		query = query.split('&');

		var params = {};

		for (var i = 0; i < query.length; i++){
			params[query[i].substring(0, query[i].indexOf('='))] = query[i].substring(query[i].indexOf('=') + 1);
		}

		if (clear){
			location.hash = '';
			return;
		}
		return params;
	}

	function gridParseCookies(grid){
		var fields = grid['fieldsTarget'].find('input');
		var params = {}
		fields.each(function(i, input){
			var name = this.name;
			try {
				params[name] = decodeURI($.cookie(grid.id + '-' + name)) != 'null' ? decodeURI($.cookie(grid.id + '-' + name)) : '';
			} catch (e) {
				params[name] = $.cookie(grid.id + '-' + name) != 'null' ? $.cookie(grid.id + '-' + name) : '';
			}
		});
		return params;
	}

	function gridMask(grid, show){
		if (show){
			grid['mask'].height(grid.popup ? $('#popup').outerHeight() : grid['form'].outerHeight());
			var backgroundPos;
			if (grid.filter){
				if (grid.filter['hidden']){
					backgroundPos = '50% 50px';
				} else {
					backgroundPos = '50% 120px';
				}
			} else {
				backgroundPos = '50% 25px';
			}

			if (grid.popup){
				backgroundPos = 'center';
			}

			grid['mask'].css('background-position', backgroundPos);
			grid['mask'].show().css('opacity', 0.8);
	 	} else {
			grid['mask'].hide();
		}
	}

	function gridLoad(grid, force){
		var params = gridParseHash(grid);// || gridParseCookies(grid);

		if (!params || !grid['source'].find('table').length || (params && grid['load'] !== false)){
			gridMask(grid, true);
			$.ajax({
			  url: grid['url'],
				type: 'post',
				data: params,
				success: function(data, textStatus){
					$(grid['source']).html(data);
					if (grid.popup && !grid['form'].find('h1').length){
						$('#main_header').clone().prependTo(grid['form']);
					}
					grid['fieldsTarget'].html($(grid['source']).find('div.fields').html());
					if (grid.popup){
						gridAdjustPopup(grid, true);
					} else {
						gridInit(grid);
					}
					gridMask(grid, false);
					if (grid.filter){
						if (gridParseHash(grid)){
							grid.filter['hash'].find('a').css('visibility', 'inherit');
							grid.filter['reset'].css({
								'display': 'block',
								'opacity': ''
							}).removeClass('disabled');
						} else {
							grid.filter['hash'].find('a').css('visibility', 'hidden');
							grid.filter['reset'].css({
								'opacity': '0.3'
							}).addClass('disabled');
						}
					}
				}
			});
		} else {
			if (grid.popup){
				gridAdjustPopup(grid);
			} else {
				gridInit(grid);
			}
			gridMask(grid, false);
		}
	}

	function gridInit(grid, adjust){
		var sourceTable = grid['source'].find('table').eq(0);

		gridFields(grid);

		if (!sourceTable.parent().hasClass('gridSource')){
			sourceTable.wrap('<div class="gridSource"></div>');
		}

		grid['target'] = sourceTable.parent().next().hasClass('gridContainer') ? sourceTable.parent().next() : $('<div class="gridContainer"></div>').insertAfter(sourceTable.parent());

		grid['table'] = $(grid['table']).closest('div')[0] ? $(grid['table'])[0] : grid['source'].find('table')[0];

		var padding = 0;

		if (grid.popup){
			padding = grid.scrollerwidth;
		}
		grid['width'] = $(grid['table']).parent()[0].offsetWidth - padding;

		grid.scrollWidth = 0;
		grid.noscrollWidth = 0;
		grid.fixedWidth = 0;

		$(grid['table']).find('thead tr:first th').each(function(i, el){
			grid['cells'][i] = {
				'text': this.title,
				'id': this.id,
				'noscroll': this.className.indexOf('grid-noscroll') > -1,
				'stretch': this.className.indexOf('grid-stretch') > -1,
				'defaultsort': $(this).attr('defaultsort') || 'ASC',
				'src': grid['source']
			}

			var sortname = grid['cells'][i].id.substring('sort_'.length);

			grid['cells'][i]['hidden'] = false;
			grid['cells'][i]['defaultHidden'] = this.className.indexOf('grid-hidden') > -1;

			var cookieHidden = $.cookie(grid['table'].id + '-' + grid['cells'][i].id + '.hidden');
			if ( cookieHidden == 'true' || (!cookieHidden && this.className.indexOf('grid-hidden') > -1) ){
				grid['cells'][i]['hidden'] = true;
			}

			if (grid.fields[sortname].length){
				grid.cells[i].hidden = false;
			}

			if (sortname == grid.fields['sort']){
				grid.cells[i].hidden = false;
			}

			$.cookie(grid['table'].id + '-' + grid['cells'][i].id + '.hidden', grid['cells'][i].hidden.toString(), {
				path: '/',
				expires: 90
			});

			grid.noscrollWidth += (
				grid.cells[i].noscroll &&
				!grid.cells[i].hidden &&
				!grid.cells[i].stretch)
					? $(el).outerWidth() : 0;
			grid.fixedWidth += (
				!grid.cells[i].stretch &&
				!grid.cells[i].hidden)
					? $(el).outerWidth() : 0;
			grid.cells[i].width = !grid.cells[i].stretch ? $(el).outerWidth() : 'auto';
			grid.cells[i].minwidth = grid.cells[i].stretch ? grid.stretchMinWidth : 0;

		});

		grid.stretchWidth = (grid.width - grid.fixedWidth <= grid.stretchMinWidth) ? grid.stretchMinWidth : grid.width - grid.fixedWidth;
		grid.scrollWidth = grid.width - grid.noscrollWidth - grid.stretchWidth;

		gridPaging(grid);
		gridDraw(grid);
		if (adjust !== false && grid.popup){
			gridAdjustPopup(grid);
		}
//	gridMakeHash(grid);
//	grid.filter['refresh'].css('visibility', 'inherit');
	};

	function gridUpdate(grid, load, adjust){
		var headers = grid.headersLayout;
		headers['relative'].find('input').blur();
		if (headers['relative'].find('input.form-invalid')[0]){
//		alert('Îøèáêà!');
			setTimeout(function(){
				headers['relative'].find('input.form-invalid').eq(0).focus();
			}, 0)
			return;
		}

//	grid.target.find('.grid-scroll').css('overflow-x', 'hidden');
//	grid.filter['refresh'].css('visibility', 'hidden');

		if (load === false){
			gridInit(grid, adjust);
			gridMask(grid, false);
		} else {
			gridMakeHash(grid);
			gridMask(grid, true);

			if (grid.animate){
				grid.target.find('div.grid-body-relative').animate({
					height: 0
				}, function(){
					grid['url'] = grid['url'].substring(0, grid['url'].indexOf('?') + 1) + Math.random();
//				grid.target.find('div.grid-scroll').css('overflow-x', 'auto');
					gridMakeHash(grid);
					gridLoad(grid);
				})
			} else {
				grid.target.find('div.grid-body-relative').height(0);
				grid['url'] = grid['url'].substring(0, grid['url'].indexOf('?') + 1) + Math.random();
				gridMakeHash(grid);
				gridLoad(grid);
			}
		}
	}

	function gridFieldSetValue(grid, name, value){
		var value = value;
		try {
			value = decodeURI(encodeURI(value));
		} catch (e){
			value = encodeURI(value);
		}

		if (name != 'page'){
			gridFieldSetValue(grid, 'page', '1');
		}
/*
		$.cookie(grid.id + '-' + name, value, {
			path: '/',
			expires: 0
		});
*/
		grid.fields[name] = value;
		gridField(grid, name).val(value);
	}

	function gridFieldGetValue(grid, name){
		var value = decodeURI(gridField(grid, name).val());
		return value;
	}

	function gridField(grid, name){
		return grid['fieldsTarget'].find('input[name = ' + name + ']');
	}

	function gridFields(grid){
		grid['fields'] = {};
		grid['fieldsTarget'].find('input').each(function(){
//			grid.fields[this.name] = this.value;
			try {
				grid.fields[this.name] = decodeURI(this.value);
			} catch (e) {
				grid.fields[this.name] = this.value;
			}
		});
	}

	function gridPaging(grid){
		var html = grid['source'].find('.paging').html();
		grid['form'].find('div.paging').html(html);
		var links = grid['form'].find('div.paging a');
		var hiddenInput = gridField(grid, 'page');
		if (!hiddenInput.val()){
			gridFieldSetValue(grid, 'page', '1');
		}

		links.click(function(){
			var a = $(this);
			if (!a.hasClass('active')){
				gridFieldSetValue(grid, 'page', a.html());
				gridUpdate(grid);
			}
		});
	}

	function gridDraw(grid){
		// checkboxes
		if (grid['filterContainer'].length){
			gridFilter(grid)
		}
		grid.target.html('');

		// headers layout
		var headersLayout = {};
		headersLayout['relative'] = $('<div class="grid-headers-relative"></div>').appendTo(grid.target);
		headersLayout['noscrollContainer'] = $('<div class="grid-noscroll grid-headers"></div>').appendTo(headersLayout['relative']);
		headersLayout['noscrollTable'] = $('<table class="grid grid-formatted"></table>').appendTo(headersLayout['noscrollContainer']);
		headersLayout['noscrollTHead'] = $('<thead></thead>').appendTo(headersLayout['noscrollTable']);
		headersLayout['noscrollHeaders'] = $('<tr></tr>').appendTo(headersLayout['noscrollTHead']);
		headersLayout['noscrollFilters'] = $('<tr></tr>').appendTo(headersLayout['noscrollTHead']);
		headersLayout['scrollContainer'] = $('<div class="grid-scroll grid-headers"></div>').appendTo(headersLayout['relative']);
		headersLayout['scrollTable'] = $('<table class="grid grid-formatted"></table>').appendTo(headersLayout['scrollContainer']);
		headersLayout['scrollTHead'] = $('<thead></thead>').appendTo(headersLayout['scrollTable']);
		headersLayout['scrollHeaders'] = $('<tr></tr>').appendTo(headersLayout['scrollTHead']);
		headersLayout['scrollFilters'] = $('<tr></tr>').appendTo(headersLayout['scrollTHead']);
	
		$('<span class="clear"></span>').appendTo(headersLayout['relative']);

		// body layout
		var bodyLayout = {};
		bodyLayout['relative'] = $('<div class="grid-body-relative"></div>').appendTo(grid.target);
		if (grid.popup){
			bodyLayout['relative'].css('overflow-y', 'auto');
		}
		bodyLayout['absolute'] = $('<div class="grid-body-absolute"></div>').appendTo(bodyLayout['relative']);

		function gridPammHelpShow(e){
			if (!grid.tooltipTexts) return;

			if ($(e.target).closest('.grid-body').length && $(e.target).closest('td').hasClass('fullname') && $(e.target).is('a')){
				e.stopPropagation();
				clearTimeout(grid.tooltipTimeout);
				delete grid.tooltipTimeout;
				$(e.target).closest('td').attr('title', '');
				var row = $(e.target).closest('tr');
				var rowIndex = row.attr('rowIndex');
				var pammid = row.attr('pammid');
				var pammlogin = row.attr('pammlogin');
				var pammname = row.find('td.fullname a').html();
				var lklink = 'https://www.alpari.ru/ru/live-account/personal-area/pamm-info/' + pammid + '/';
				var pammlink = $(e.target).attr('href');
				var top = $(e.target).offset().top + $(e.target).height() + 2;
				var left = $(e.target).offset().left;

				if (!grid.tooltip){
					grid.tooltip = $('<div class="pamm-tooltip"></div>').appendTo('body');
				}
				grid.tooltip.html('<strong>' + pammname + '</strong>');
				var links = $('<ul class="moduleList"></ul>').appendTo(grid.tooltip);
				var linksText = {
					'invest': grid['tooltipTexts'].invest,
					'more': grid['tooltipTexts'].more
				}

				$('<li><a href="' + lklink + '">' + linksText['invest'] + '</a></li>').appendTo(links);
				$('<li><a href="' + pammlink + '">' + linksText['more'] + '</a></li>').appendTo(links);
				grid.tooltip.show();
				grid.tooltip.css({
					top: top,
					left: e.pageX + 10
				});
			} else if ($(e.target).closest('.pamm-tooltip').length) {
				e.stopPropagation();
				clearTimeout(grid.tooltipTimeout);
				delete grid.tooltipTimeout;
			} else {
				if (!grid.tooltipTimeout){
					grid.tooltipTimeout = setTimeout(gridPammHelpHide, 300);
				}
			}
		}

		function gridPammHelpHide(e){
			$('div.pamm-tooltip').hide();
		}

		if (!grid._event){
			grid._event = true;
//			$('body').mouseover(gridPammHelpShow);
		};

		bodyLayout['noscrollContainer'] = $('<div class="grid-noscroll grid-body"></div>').appendTo(bodyLayout['absolute']);
		bodyLayout['scrollContainer'] = $('<div class="grid-scroll grid-body"></div>').appendTo(bodyLayout['absolute']);
		bodyLayout['noscrollTable'] = $('<table class="grid grid-formatted"></table>').appendTo(bodyLayout['noscrollContainer']);
		bodyLayout['scrollTable'] = $('<table class="grid grid-formatted"></table>').appendTo(bodyLayout['scrollContainer']);
		$('<span class="clear"></span>').appendTo(bodyLayout['absolute']);

		headersLayout['scrollContainer'].scroll(function(e){
			if (e.target == bodyLayout['scrollContainer'][0]) return;
			bodyLayout['scrollContainer'][0].scrollLeft = this.scrollLeft;
		});
		bodyLayout['scrollContainer'].scroll(function(e){
			if (e.target == headersLayout['scrollContainer'][0]) return;
			headersLayout['scrollContainer'][0].scrollLeft = this.scrollLeft;
		});
	
		headersLayout['noscrollContainer'].width(grid.noscrollWidth + grid.stretchWidth);
		headersLayout['noscrollTable'].width(grid.noscrollWidth + grid.stretchWidth);
		headersLayout['scrollContainer'].width(grid.scrollWidth);
		headersLayout['scrollTable'].width(grid.scrollWidth);
		bodyLayout['noscrollContainer'].width(grid.noscrollWidth + grid.stretchWidth);
		bodyLayout['noscrollTable'].width(grid.noscrollWidth + grid.stretchWidth);
		bodyLayout['scrollContainer'].width(grid.scrollWidth);
		bodyLayout['scrollTable'].width(grid.scrollWidth);
	
		var table = grid.table;
		grid['headersLayout'] = headersLayout;

		// headers
		grid.fields['sort'] = grid.fields['sort'] ? grid.fields['sort'] : table.tHead.rows[0].cells[0].id.substring('sort_'.length);

		for (var i = 0; i < grid.cells.length; i++){
			var config = grid.cells[i];
			var header = table.tHead.rows[0].cells[i].cloneNode(true);
			var sorttype;
			var sortname = config.id.substring('sort_'.length);

			if (sortname == grid.fields['sort']){
				$(header).addClass('sort');//('sort' + '-' + grid.fields['sorttype']);
			}

			if (config.hidden) continue;

			var destination = config.noscroll ? headersLayout['noscrollHeaders'] : headersLayout['scrollHeaders'];
			destination[0].appendChild(header);
			$(header).width(config.stretch ? grid.stretchWidth : config.width);
/*
			header = header.cloneNode().appendTo(config.noscroll ? headersLayout['noscrollHeaders'] : headersLayout['scrollHeaders']);
			header.width(config.stretch ? grid.stretchWidth : config.width);
*/
			$(header).find('div')[0].defaultsort = config['defaultsort'];
			$(header).find('div').bind('click', function(){
				var defaultsort = $(this).attr('defaultsort');
				var sortname = $(this).parent()[0].id.substring('sort_'.length);

				if (grid.fields['sort'] == sortname){
					sorttype = (grid.fields['sorttype'] == 'ASC') ? 'DESC' : 'ASC';
				} else {
					sorttype = defaultsort || 'ASC';
				}

				gridFieldSetValue(grid, 'sorttype', sorttype);
				gridFieldSetValue(grid, 'sort', sortname);

				gridUpdate(grid);
			});
			grid.innerWidth += $(header).width();
		}
	
		// filters
		for (var i = 0; i < grid.cells.length; i++){
			var config = grid.cells[i];
			if (config.hidden) continue;
			var filter = table.tHead.rows[1].cells[i].cloneNode(true);
			var destination = config.noscroll ? headersLayout['noscrollFilters'] : headersLayout['scrollFilters'];
			destination[0].appendChild(filter);
			$(filter).width(config.stretch ? grid.stretchWidth : config.width);
		}

//		headersLayout['noscrollFilters'].find('select.combo').combo({cookie: true});
		headersLayout['noscrollFilters'].find('input').each(function(){
			var name = this.id.substring('rating-'.length);
			$(this).val(decodeURI(gridField(grid, name).val()));
//			$(this).val(gridField(grid, name).val());
			gridFieldSetValue(grid, name, decodeURI($(this).val()));
			$(this).bind('change', function(){
				var value = this.value;
//				var value = this.value;
				gridFieldSetValue(grid, name, value);
				grid.filter['refresh'].css('visibility', 'inherit');
			});

			$(this).bind('keypress', function(e){
				if (e.keyCode == 13){			
					$(this).change();
					gridUpdate(grid);
				}
			});
		});

		headersLayout['scrollFilters'].find('select.combo').each(function(){
			var name = this.id.substring('rating-'.length);
			$(this).combo({
//			'cookie': true,
				'tooltip': true,
				'onchange': function(){
					var value = this.input.val();
					gridFieldSetValue(grid, name, value);
					grid.filter['refresh'].css('visibility', 'inherit');
				},
				'onenter': function(){
					gridUpdate(grid);
				},
				'hiddenInput': gridField(grid, name)
			});
		});
	
		// body
		if (!table.tBodies[table.tBodies.length - 1].rows.length){
			$(bodyLayout['relative']).find('.grid-not-found').remove();
			$('<div class="grid-not-found">' + grid['notfound'] + '</div>').appendTo(bodyLayout['relative']).show();
		}
		for (var i = 0; i < table.tBodies[table.tBodies.length - 1].rows.length; i++){
			var pammid = $(table.tBodies[table.tBodies.length - 1].rows[i]).attr('pammid');
			var noscrollRow = $('<tr pammid="' + pammid + '"></tr>').appendTo(bodyLayout['noscrollTable']);
			var scrollRow = $('<tr pammid="' + pammid + '"></tr>').appendTo(bodyLayout['scrollTable']);
	
			for (var j = 0; j < grid.cells.length; j++){
				var sortname = table.tHead.rows[0].cells[j].id.substring('sort_'.length);;
				var config = grid.cells[j];
				if (config.hidden) continue;
				var cell = table.tBodies[table.tBodies.length - 1].rows[i].cells[j].cloneNode(true);
				var destination = config.noscroll ? noscrollRow : scrollRow;
				destination[0].appendChild(cell);
				if (i == 0){
					$(cell).width(config.stretch ? grid.stretchWidth : config.width);
				}

				if (sortname == grid.fields['sort']){
					$(cell).addClass('sort');
				}
			}
		}

		grid.innerWidth = headersLayout['noscrollContainer'][0].scrollWidth + headersLayout['scrollContainer'][0].scrollWidth;
		grid.scrollbar = grid.innerWidth > grid.width;
	
		var innerScrollbar = (headersLayout['scrollContainer'].height() - headersLayout['noscrollContainer'].height() == 0);
		var scrollbarHeight = headersLayout['scrollContainer'].height() - headersLayout['scrollContainer'][0].clientHeight;
	
		if (grid.scrollbar && innerScrollbar){
			scrollbarHeight = headersLayout['scrollContainer'][0].offsetHeight - headersLayout['scrollContainer'][0].clientHeight;
			headersLayout['scrollFilters'].find('td').height(headersLayout['scrollFilters'].height() + scrollbarHeight);
			bodyLayout['scrollContainer'].css('padding-bottom', scrollbarHeight);
		}

		headersLayout['noscrollFilters'].find('td').height(headersLayout['noscrollFilters'].height() + scrollbarHeight);

//		$(grid.target).find('td.fullname div a').ellipsis();
//		$(grid.target).find('td.fullname div a').tooltip();

		headersLayout['noscrollContainer'].css({
			float: 'none'
		});

		if ($('html').attr('dir') != 'rtl'){
			headersLayout['scrollContainer'].css({
				position: 'absolute',
				top: 0,
				left: headersLayout['noscrollContainer'].width()
			});
		} else {
			headersLayout['scrollContainer'].css({
				position: 'absolute',
				top: 0,
				right: headersLayout['noscrollContainer'].width()
			});
		}
	
/*
		function rowMouseEnter(){
			var index = $(this)[0].rowIndex;
			var noscrollRow = $(bodyLayout['noscrollTable']).find('tr').eq(index);
			var scrollRow = $(bodyLayout['scrollTable']).find('tr').eq(index)
			var a = noscrollRow.find('td.fullname a').addClass('hover');
	
			if (a.attr('title')){
				a.html(a.attr('title'));
			}
	
			noscrollRow.addClass('hlRow');
			scrollRow.addClass('hlRow');
			if (scrollRow.height() != noscrollRow.height()){
				scrollRow.find('td div').height(noscrollRow.find('td.fullname div')[0].clientHeight);
			}
		}
	
		function rowMouseLeave(){
			var index = $(this)[0].rowIndex;
			var noscrollRow = $(bodyLayout['noscrollTable']).find('tr').eq(index);
			var scrollRow = $(bodyLayout['scrollTable']).find('tr').eq(index)
			var a = noscrollRow.find('td.fullname a').removeClass('hover');
	
//			a.ellipsis();
	
			noscrollRow.removeClass('hlRow');
			scrollRow.removeClass('hlRow').find('td div').height('auto');
		}
*/
	
//		$(bodyLayout['noscrollTable']).find('tr').hover(rowMouseEnter, rowMouseLeave);
//		$(bodyLayout['scrollTable']).find('tr').hover(rowMouseEnter, rowMouseLeave);

//		grid.target.find('div.grid-scroll').css('overflow-x', 'hidden');
		var _height = (grid.target.find('div.grid-body-absolute table').height() ? grid.target.find('div.grid-body-absolute table').height() : grid.target.find('div.grid-not-found').outerHeight()) + scrollbarHeight;

		if (grid.animate){
			grid.target.find('div.grid-body-relative').animate({
				height: _height
			}, 'fast', function(){
				grid.target.find('.grid-scroll.grid-headers').css('overflow-x', 'auto');
				if (!grid.popup){
					grid.target.find('.grid-scroll.grid-body').css('overflow-x', 'auto');
 				}
			});
		} else {
			grid.target.find('div.grid-body-relative').height(_height);
//			grid.target.find('.grid-scroll.grid-headers').css('overflow-x', 'auto');
			if (!grid.popup){
//				grid.target.find('.grid-scroll.grid-body').css('overflow-x', 'auto');
			}
		}
	}
	
	function gridFilterFields(grid){
		var fields = grid['filterFields'];
		var values = 0;

		fields.each(function(i, el){
			var name = this.id.substring('rating-'.length);
			var field = $(this);
			var hiddenInput = gridField(grid, name);
			field.unbind('change click');
			field.removeAttr('disabled');
			if (this.tagName.toLowerCase() == 'select'){
				if (hiddenInput.val() && hiddenInput.val() != '0'){
					values++;
				} 
				gridFieldSetValue(grid, name, hiddenInput.val() ? hiddenInput.val() : '0');
				field.val(hiddenInput.val());
				field.bind('change', function(){
					gridFieldSetValue(grid, name, this.value);
					gridUpdate(grid);
				});
			} else if (this.tagName.toLowerCase() == 'input' && this.type == 'checkbox'){
				if (hiddenInput.val() != 'false'){
					field.attr('checked', true);
				} else {
					field.attr('checked', false);
					values++;
				}

				field.bind('click', function(){
					gridFieldSetValue(grid, name, this.checked ? '' : 'false');
					field.attr('disabled', '');
					gridUpdate(grid);
				});
			}
		});

		return values > 0;
	}

	function gridBlockHide(e, grid, block){
		if (e) e.preventDefault();

		var id = block && block[0] ? '#' + block[0].id : this.href.substring(this.href.indexOf('#')); 
		var div = grid.filter['container'].find(id);
		var links = grid.filter['container'].find(id + '-links');

		if (grid.animate){
			div.stop().animate({
				height: 0,
				opacity: 0
			}, 'fast');
		} else {
			div.css({
				height: 0,
				opacity: 0
			});
		}

		links.removeClass('table-filter-toggle-visible');
		if (grid.popup){
			gridAdjustPopup(grid);
		}
//		grid.filter['hidden'] = true;
	}

	function gridBlockShow(e, grid, block){
		if (e) e.preventDefault();
		var id = block && block[0] ? '#' + block[0].id : this.href.substring(this.href.indexOf('#')); 
		var div = grid.filter['container'].find(id);
		var links = grid.filter['container'].find(id + '-links');
		var blocks = grid.filter['container'].find('div.table-filter-relative');

		var height = Math.max(div.find('.table-filter-absolute')[0].scrollHeight, div.outerHeight());
		if (div.find('div.table-filter-left')[0] && div.find('div.table-filter-right')[0]){
			height = Math.max(div.find('div.table-filter-left').height(), div.find('div.table-filter-right').height());
		}

		grid.filter['container'].find('select').css('visibility', 'inherit');

		blocks.each(function(i, el){
			if (this.id != div[0].id){
				gridBlockHide(false, grid, $(this));
			}
		});

		if (grid.animate){
			div.stop().css('display', 'block').animate({
				height: height,
				opacity: 1
			}, 'fast', function(){
				$(this).css('opacity', '');
			});
		} else {
			div.css('display', 'block').css({
				height: height,
				opacity: ''
			});
		}
		links.addClass('table-filter-toggle-visible');
//		grid.filter['hidden'] = false;
		if (grid.popup){
			gridAdjustPopup(grid);
		}
	}

	function gridReset(grid){
		for (var i in grid['fields']){
			gridFieldSetValue(grid, i, '');
		}     	
		for (var i = 0; i < grid.cells.length; i++){
			var cell = grid.cells[i];
			$.cookie(grid.table.id + '-' + cell.id + '.hidden', null, {
				path: '/'
			});
			if (grid.form.find('#checkbox_' + cell.id)[0]){
				grid.form.find('#checkbox_' + cell.id)[0].checked = !cell['defaultHidden'];
			}
		}
		grid['filterFields'].each(function(i, el){
			this.value = '0';
		});
		location.hash = grid.id + '?';
		gridLoad(grid, true);
	}

	function gridCheckboxesAll(grid, show, update){
		for (var i = 0; i < grid.cells.length; i++){
			var cell = grid.cells[i];
			var id = "checkbox_" + cell.id;
			if (grid.popup){
				id = 'popup_' + id;
			}
			if (!grid.form.find('#' + id).length) continue;
			grid.form.find('#' + id)[0].checked = show;
			if (show){
			$(cell.src).removeClass('grid-hidden');
				$.cookie(grid.table.id + '-' + cell.id + '.hidden', 'false', {
					path: '/',
					expires: 90
				});
			} else {
				var name = cell.id.substring('sort_'.length);
				var field = gridField(grid, name);

				$(cell.src).addClass('grid-hidden');
				$.cookie(grid.table.id + '-' + cell.id + '.hidden', 'true', {
					path: '/',
					expires: 90
				});

				if (field.val()){
					grid.form.find('input#rating_' + name).val('');
					field.val('');
					gridFieldSetValue(grid, name, '');
					update = true;
				}

				if (name == gridField(grid, 'sort').val()){
					gridFieldSetValue(grid, 'sort', 'rating');
					gridFieldSetValue(grid, 'sorttype', 'ASC');
					update = true;
				}
			}
		}
		gridMask(grid, true);
		if (update !== false){
			gridUpdate(grid, update === true ? true : false);
		}
	}

	function gridFilter(grid){
		var src = grid['filterContainer'];
		if (grid.filter) return;
	
		var values;
		if (grid['filterFields'].length){
			values = gridFilterFields(grid);
		}
		if (!grid.filter){
			var filter = {};
			filter['container'] = grid['filterContainer'].closest('div.table-filter');
			filter['visible'] = filter['container'].hasClass('table-filter-visible');
			filter['reset'] = filter['container'].find('.table-filter-reset').css({
				'display': 'block',
				'opacity': 0.3
			}).addClass('disabled');
			filter['hash'] = filter['container'].find('.table-filter-hash');

			filter['hashContainer'] = filter['hash'].find('div');

			filter['hashContainer'].find('textarea').attr('readonly', 'true').bind('click', 'focus', function(){
				this.select();
			});

			filter['hashClose'] = filter['hashContainer'].find('a');
			filter['hashClose'].click(function(e){
				e.stopPropagation();
				e.preventDefault();
				gridHideHash(grid);
			});

			filter['hashContainer'].click(function(e){
				e.stopPropagation();
				e.preventDefault();
				return false;
			});


			filter['hash'].find('a').eq(0).click(function(e){
				gridShowHash(e, grid);
			});

			$('body').click(function(e){
				if ($(e.target).closest('.table-filter-popup').length){
					return;
				}
				gridHideHash(grid);
			});

			filter['refresh'] = filter['container'].find('.table-filter-refresh');
			filter['left'] = filter['container'].find('div.table-filter-left');
			filter['right'] = filter['container'].find('div.table-filter-right');

			filter['toggle'] = filter['container'].find('#table-filter-toggle-links');
			filter['help-height'] = filter['container'].find('#table-filter-help').height();
			filter['link-filter-show'] = filter['toggle'].find('a.show-filter');
			filter['link-filter-hide'] = filter['toggle'].find('a.hide-filter');

			filter['help'] = filter['container'].find('#table-filter-help-links');
			filter['link-help-show'] = filter['help'].find('a.show-filter');
			filter['link-help-hide'] = filter['help'].find('a.hide-filter');

			filter['reset'].find('div').unbind('click').bind('click', function(e){
				e.preventDefault();
				if ($(this).parent().hasClass('disabled')){
					return;
				}
				gridReset(grid);
			});

			filter['refresh'].find('div').unbind('click').bind('click', function(){
				gridUpdate(grid);
			});

			filter['link-filter-show'].unbind('click').bind('click', function(e){
				gridBlockShow.call(this, e, grid);
			});

			filter['link-filter-hide'].unbind('click').bind('click', function(e){
				gridBlockHide.call(this, e, grid);
			});

			filter['link-help-show'].unbind('click').bind('click', function(e){
				gridBlockShow.call(this, e, grid);
			});

			filter['link-help-hide'].unbind('click').bind('click', function(e){
				gridBlockHide.call(this, e, grid);
			});

			grid['filter'] = filter;

			if (values){
				gridBlockShow(false, grid, filter['container'].find('#table-filter-toggle'));
			} else {
				grid['filter'].hidden = true;
			}
		}

		var checkboxesLayout = {};
		checkboxesLayout['container'] = grid['filter'].container.find('.grid-checkboxes').length ? grid['filter'].container.find('.grid-checkboxes').empty() : $('<div class="grid-checkboxes"></div>').appendTo(src);
	
		var wrap = $('<div class="wrap"></div>').appendTo(checkboxesLayout['container']);
	
		var cells = [];
	
		for (var i = 0 ; i < grid.cells.length; i++){
			var disabled = grid.cells[i].noscroll || grid.cells[i].disabled;
			if (!disabled){
				cells.push(grid.cells[i]);
			}
		}

		grid.form.find('.table-filter-checkboxes-all').unbind('click').click(function(e){
			e.preventDefault();
			gridCheckboxesAll(grid, true);
		});
	
		grid.form.find('.table-filter-checkboxes-none').unbind('click').click(function(e){
			e.preventDefault();
			gridCheckboxesAll(grid, false);
		});
	
		checkboxesLayout['container'].empty();
		for (var i = 0; i < cells.length; i++){
/*
			if (i > 0 && i % 2 == 0){
				wrap = $('<div class="wrap"></div>').appendTo(checkboxesLayout['container']);
			}
*/
			if (i == 0){
				wrap = $('<div class="wrap"></div>').appendTo(checkboxesLayout['container']);
			}

			var unit = $('<div class="unit form-checkbox"></div>').appendTo(wrap);
/*
			if (i > 0 && i % 2 == 1){
				$('<span class="clear"></span>').appendTo(wrap);
			}
*/
			var cell = cells[i];
			var id = "checkbox_" + cell.id;
			if (grid.popup){
				id = 'popup_' + id;
			}
			var input = $('<input type="checkbox" id="' + id + (!cell.hidden ? '" checked="checked"' : '') + '"/>').appendTo(unit);
			var label = $('<label for="' + id + '">' + cell.text + '</label>').appendTo(unit);
			input[0].cell = cell;
			
			input.unbind('click').bind('click', function(e){
				var reload = false;
				e.stopPropagation();
//			e.preventDefault();
				if (this.checked){
					$(this.cell.src).removeClass('grid-hidden');
					$.cookie(grid.table.id + '-' + this.cell.id + '.hidden', 'false', {
						path: '/',
						expires: 90
					});
				} else {
					var name = this.cell.id.substring('sort_'.length);
					var field = gridField(grid, name);
					$(this.cell.src).addClass('grid-hidden');
					$.cookie(grid.table.id + '-' + this.cell.id + '.hidden', 'true', {
						path: '/',
						expires: 90
					});
					if (grid.fields['sort'] == name){
						gridFieldSetValue(grid, 'sort', 'rating');
						gridFieldSetValue(grid, 'sorttype', 'ASC');
						reload = true;
					}
					if (field.val()){
						grid.form.find('input#rating_' + name).val('');
						field.val('');
						gridFieldSetValue(grid, name, '');
						reload = true;
					}
				}

				gridMask(grid, true);
				gridUpdate(grid, reload);
/*
				return $(grid['source']).grid({
					'filterContainer': grid['filterContainer'],
					'filterFields': grid['filterFields'],
					'load': false
				});
*/
			});
		}
		$('<span class="clear"></span>').appendTo(wrap);
	}
})(jQuery);
