jQuery.fn.tableForm = function(params) {
	var options = {
		dimension: 2,
		size1row_selector: ".head",
		size2cell_index: 0,
		category_selector: "#Left h2",
		clear_button: "#clear_btn",
		add_button: "#dodaj",
		send_button: "#wyslij",
		main_send_button: "#wyslij_2",
		input_class: "query_input",
		cookie_name: 'query',
		send_form_selector: '#Formularz',
		table_summary_selector: '#products_query_summary',
		textarea_query_content_selector: "textarea[name=query_content]"
	}
	
	if (typeof params != "undefined")
		jQuery.extend(options, params);
		
	if (this.length == 0) return;
	
	var category_name = jQuery(options.category_selector).text();

	jQuery(options.send_form_selector).hide().css({
		'background':'#fff',
		'padding':'10px'
	});
	
	var readData = function(category) {
		var data = jQuery.JSONCookie(options.cookie_name);
		
		try {
			if (typeof data == "undefined")
				data = [];
			else if (typeof data != "undefined" && !jQuery.isArray(data))
				data = JSON.parse(data);
		} catch (err) {
			data = []
		}

		if (typeof category == "undefined")
			return data;
		else {
			var result = [];
			for (var n = 0; n < data.length; n++) {
				if (data[n].category == category) {
					result = data[n].items;
					break;
				}
			}
			return result;
		}
	}
	
	var prepareData = function() {
		var data = [];
		jQuery("input." + options.input_class).each(function(){
			if (jQuery(this).val().match(/^[0-9]+$/)) {
				data.push({
					dimension: jQuery(this).attr('alt'),
					count: jQuery(this).val()
				});
			}
		});
		return data;
	}

	var clearData = function() {
		jQuery.JSONCookie(options.cookie_name, []);
	}
	
	/*var deleteItem = function(category_id, item_id) {
		var data = readData();
		
		for (var cid = 0; cid < data.length; cid++) {
			var row = [];
			for (var i = 0; i < data[cid].items.length; i++) {
				if (!(cid == category_id && i == item_id)) {
					row.push(data[cid].items[i]);
				}
			}
			data[cid].items = row;
		}
		jQuery.JSONCookie(options.cookie_name, data);
	}*/
	
	var saveData = function() {
		var data = readData();
		
		prepared_data = prepareData();
		
		var updated = false;
		
		for (var n = 0; n < data.length; n++) {
			if (data[n].category == category_name) {
				data[n].items = prepared_data;
				updated = true;
			}
		}
		if (!updated) {
			data.push({
				category: category_name,
				items: prepared_data
			});
		}
		jQuery.JSONCookie(options.cookie_name, data);
	}
	
	if (jQuery(options.clear_button).length == 0) {
		jQuery('<input type="button" value="wyczyść zapytanie" id="clear_btn" rel="#usunieto" />').insertBefore(options.send_button);
	}
	
	var category_data = readData(category_name);
	try {
		if (!jQuery.isArray(category_data))
			category_data = JSON.parse(category_data);
	} catch (err) {
		category_data = [];
	}
	
	for (var n = 0; n < this.length; n++) {
		var table = jQuery(this[n]);
		if (options.dimension == 1) {
			jQuery("input[type=checkbox]", table).each(function(){
				var cell = jQuery(this).closest("td");
				var row = jQuery(this).closest("tr");
				var dimension = jQuery("td", row).eq(options.size2cell_index).text();
				
				var value = "";
				for (var i = 0; i < category_data.length; i++) {
					if (category_data[i].dimension == dimension)
						value = category_data[i].count;
				}
				
				cell.html('<input class="' + options.input_class + '" type="text" size="2" value="' + value + '" alt="' + dimension + '" />');
			});
		} else if (options.dimension == 2) {
			jQuery("td:contains(x), td:contains(X)", table).each(function(n2){
				var cell = jQuery(this);
				var row = jQuery("td", cell.closest("tr"));
				var index = row.index(cell);
				var d1 = jQuery(options.size1row_selector + " td:eq(" + index + ")", table).text();
				var d2 = row.eq(options.size2cell_index).text();
				var dimension = d1 + ', ' + d2;
				
				var value = "";
				for (var i = 0; i < category_data.length; i++) {
					if (category_data[i].dimension == dimension)
						value = category_data[i].count;
				}
				
				cell.html('<input class="' + options.input_class + '" type="text" size="2" value="' + value + '" alt="' + dimension + '" />');
			});
		}
	}
	
	jQuery(options.clear_button).click(function(e){
		clearData();
	});
	
	jQuery(options.add_button).click(function(e){
		saveData();
	});
	
	jQuery(options.send_button + ", " + options.main_send_button).click(function(e){
		var data = readData();
		var summary_table = jQuery(options.table_summary_selector);
		var summary_content = jQuery(options.textarea_query_content_selector);
		summary_content.val('');
		jQuery("tr", summary_table).remove();
		for (var cid = 0; cid < data.length; cid++) {
			summary_table.append('<tr class="head"><td colspan="3">' + data[cid].category + '</td></tr>');
			summary_content.val(summary_content.val() + data[cid].category + '<ul>');
			
			try {
				if (!jQuery.isArray(data[cid].items))
					data[cid].items = JSON.parse(data[cid].items);
			} catch (err) {
				data[cid].items = [];
			}
			
			for (var i = 0; i < data[cid].items.length; i++) {
				summary_table.append('<tr class="' + (i%2==0?'even':'odd') + '"><td>' + data[cid].items[i].dimension + '</td><td><input name="count_' + cid + '_' + i + '" value="' + data[cid].items[i].count + '" /> szt.</td><td><a class="summary_table_delete" rel="' + cid + ',' + i + '" style="cursor:pointer">usuń</a></td></tr>');
				summary_content.val(summary_content.val() + '<li rel="' + cid + ',' + i + '">' + data[cid].items[i].dimension + ': {$count_' + cid + '_' + i + '} szt.</li>');
			}
			summary_content.val(summary_content.val() + '</ul>');
		}
		jQuery("a.summary_table_delete").click(function(e){
			e.preventDefault();
			e.stopPropagation();
			var ids = jQuery(this).attr('rel').split(',');
			var summary_query = jQuery('<div>' + summary_content.val() + '</div>');
			jQuery(this).closest('tr').remove();
			jQuery("li[rel='" + jQuery(this).attr('rel') + "']", summary_query).remove();
			summary_content.val(summary_query.html());
		});
	});

	jQuery(options.textarea_query_content_selector).closest('form').submit(function(e){
		clearData();
	});
	
	jQuery(options.send_button + ", " + options.add_button + ", " + options.main_send_button + ", " + options.clear_button).overlay({
		mask: {
			color: '#000',
			loadSpeed: 200,
			opacity: 0.9
		},
		fixed: false,
		closeOnClick: true
	});
}

