(function()
{

	Element.addMethods({
	  hasInnerText : function(element) 
	  {
		return document.getElementsByTagName('body')[0].innerText;
	  },
	  setInnerText : function(element, innerText) 
	  {
		if (element.hasInnerText()) {
		  element.innerText = innerText;
		}
		else {
		  element.textContent = innerText;
		}
	  },
	  getInnerText : function(element) 
	  {
		var text = (element.hasInnerText() ? element.innerText : element.textContent);
		return text.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	  }
	});	

	var Akyla_Prototype_AdvancedTable = Class.create(Akyla_Prototype_Observer,
	{
		localization : 
		{
			"nl_NL":
			{
				"Hide" : "Verbergen"
			}
		},
		/**
		 * 
		 */
		domLoaded : function ()
		{
			$$("div.advancedTableWrapper").each(function (wrapper)
			{
				this.listenToClickEvents(wrapper);
			}.bind(this));
			Event.observe(document.body,"container:change", function (event)
			{
				$(event.target).select("div.advancedTableWrapper").each(function (wrapper)
				{
					this.listenToClickEvents(wrapper);
				}.bind(this));
			}.bind(this));
		},
		/**
		 * Processes a JSON component. In this cases it @use this.buildTable
		 * @param object component JSON component to process
		 */
		processComponent : function (component, requestOptions)
		{
			var table = requestOptions.table;
			var wrapper = table.up("div.advancedTableWrapper");
			table.down("tbody").replace(component.tbody);
			var pagingControls = wrapper.down("div.pagingControls");
			if (component.page === null)
			{
				component.page = 1;
			}
			component.page = parseInt(component.page,10);
			pagingControls.writeAttribute("page",component.page);
			var activePage = pagingControls.down("span.pager.current");
			if (activePage)
			{
				activePage.removeClassName("current");
			}
			if (component.page == 0)
			{
				pagingControls.addClassName("switched");
			}
			else
			{
				pagingControls.removeClassName("switched");
				pagingControls.select("span.pager")[component.page-1].addClassName("current");
			}
			this.limitToPages(table,component.maxPages,component.page);
		},
		/**
		 * Name of the module 
		 */
		moduleName : "Akyla.AdvancedTable",
		/**
		 * Load default preferences for the JSON  Table
		 */
		loadDefaultPreferences : function loadDefaultPreferences ()
		{
			this.baseUrl = "";
			this.preferences = {
				//pageMask : [10000,1000,500,100,50,10,3,1]
			};
			
			this.preferences.pageMask = Akyla.getSetting("Akyla.AdvancedTable.pageMask");
		},
		/**
		 * Will listen to right and left click events on a tableWrapper
		 *
		 * @param HTMLElement tableWrapper The div which wraps the div
		 */
		listenToClickEvents : function listenToEvents(tableWrapper)
		{
			$(tableWrapper).observe("keydown", function (event)
			{
				var target = event.target;
				if (!target)
				{
					target = target.up();
				}
				else
				{
					var tagName = event.target.tagName;
					// Check if the click observer exists
					if (tagName && this.keydownObservers[tagName.toLowerCase()])
					{
						this.keydownObservers[tagName.toLowerCase()](target,event);
					}
				}
			}.bind(this));
			/* Listen to left clicks */
			$(tableWrapper).observe("click", function (event)
			{
				var target = event.target;
				if (!target)
				{
					target = target.up();
				}
				else
				{
					var tagName = event.target.tagName;
					// Check if the click observer exists
					if (tagName && this.clickObservers[tagName.toLowerCase()])
					{
						this.clickObservers[tagName.toLowerCase()](target,event);
					}
				}
			}.bind(this));
			/* Listen to contextmenu clicks */
			$(tableWrapper).observe("contextmenu", function (event)
			{
				var target = event.target;
				if (!target)
				{
					return;
				}
				else
				{
					var tagName = event.target.tagName;
					// Check if the context observer exists
					if (tagName && this.contextObservers[tagName.toLowerCase()])
					{
						this.contextObservers[tagName.toLowerCase()](target,event);
					}
				}
			}.bind(this));
			this.makeReorderable(tableWrapper.down("table"))
		},
		/**
		 * This holds a lookup object of tag names which will get called whenever a keyboard keypress
		 * occurs.
		 */
		keydownObservers : 
		{
			input : function input(target,event)
			{
				var keyCode = event.keyCode;
				/* Search widget */
				if (target.up("span.searchWidget") && keyCode == Event.KEY_RETURN)
				{
					var table = target.up("div.advancedTableWrapper").down("table");
					if (!table.searchHistory)
					{
						table.searchHistory = new Array();
					}
					var historySpan = target.up("div.searchControls").down("span.history");
					var searchText = $F(target);
					if (searchText == "")
					{
						historySpan.update("");
						table.searchHistory = new Array();
					}
					else
					{
						var operatorSelect = target.up("div.searchControls").down("span.searchWidget select");
						var operatorValue = operatorSelect.options[operatorSelect.selectedIndex].value;
						var operatorText = operatorSelect.options[operatorSelect.selectedIndex].text;
						if (historySpan.getInnerText() == "")
						{
							historySpan.insert({bottom : searchText});
						}
						else
						{
							historySpan.insert({bottom : " " + operatorText + " " +searchText});
						}
						table.searchHistory.push({operator : operatorValue, text : searchText});
					}
					Akyla.AdvancedTable.request(table);
				}
			}
		},
		dropdownHandlers : 
		{
			columnList : function columnList(target,event)
			{
				var columnIndex = target.readAttribute("columnIndex");
				var table = target.up("div.advancedTableWrapper").down("table");
				table.select("[columnindex="+columnIndex+"]").each(function (cell)
				{
					cell.removeClassName("invisible");
				});
				target.addClassName("invisible");

			},
			exportMenu : function columnList(target,event)
			{
				if (target.hasClassName("excel"))
				{
					var table = target.up("div.advancedTableWrapper").down("table");
					Akyla.AdvancedTable.request(table,null,"excelexport",null,
					{
						method : "post",
					});
				}
			},
			contextMenu : function columnList(target,event)
			{
				if (target.hasClassName("saveConfig"))
				{
					var table = target.up("div.advancedTableWrapper").down("table");
					var module = null;
					var tr = table.down("tbody tr");
					if (tr.hasAttribute("module"))
					{
						module = tr.readAttribute("module");
					}
					else if (table.hasAttribute("module"))
					{
						module = table.readAttribute("module");
					}
					var thead = table.down("thead");
					var parameters = {
						columnConfig : {
							visible : [],
							invisible : []
						}
					};
					var columnId = null;
					thead.select("th").each (function (column)
					{
						if (column.hasAttribute("columnid"))
						{
							columnId = column.readAttribute("columnid");
							if (column.hasClassName("invisible"))
							{
								parameters.columnConfig.invisible.push(columnId);
							}
							else
							{
								parameters.columnConfig.visible.push(columnId);
							}
						}
						
					});
					parameters.columnConfig.visible = parameters.columnConfig.visible.join("||");
					parameters.columnConfig.invisible = parameters.columnConfig.invisible.join("||");
					Akyla.AdvancedTable.request(table,module,"savecolumnconfig",null,
					{
						method : "post",
					});
					//new Akyla.Ajax.ajaxRequest(object,"savecolumnconfig",{parameters : parameters});
					// TODO : console.log("Save table config");
				} 
				else if (target.hasClassName("resetConfig"))
				{
					var table = target.up("div.advancedTableWrapper").down("table");
					var module = null;
					var tr = table.down("tbody tr");
					if (tr.hasAttribute("module"))
					{
						module = tr.readAttribute("module");
					}
					else if (table.hasAttribute("module"))
					{
						module = table.readAttribute("module");
					}
					Akyla.AdvancedTable.request(table,module,"resetcolumnconfig",null,
					{
						method : "post",
					});
				}
			}

		},
		/**
		 * This holds a lookup object of tag names which will get called whenever a left click
		 * occurs.
		 */
		clickObservers : 
		{
			input : function input(target,event)
			{
				target.activate();
			},
			li : function li (target, event)
			{
				if (target.up("a") && target.up("a").hasClassName("dropDown"))
				{
					var dropDownHandler = target.up("ul").readAttribute("class");
					if (Akyla.AdvancedTable.dropdownHandlers[dropDownHandler])
					{
						Akyla.AdvancedTable.dropdownHandlers[dropDownHandler](target,event);
					}
					
				}
			},
			td : function td (target,event)
			{
				var tr = target.up("tr")
				var table = tr.up("table");
				if (!target.up("tbody"))
				{
					return;
				}
				var url = null;
				var action = "detail";
				if (table.hasAttribute("detailaction"))
				{
					action = table.readAttribute("detailaction");
				}
				var id = tr.readAttribute("objectid");
				if (target.hasAttribute("module"))
				{
					module = target.readAttribute("module");
				}
				else if (tr && tr.hasAttribute("module"))
				{
					module = tr.readAttribute("module");
				}
				else if (table && table.hasAttribute("module"))
				{
					var module = table.readAttribute("module");
				}
				Akyla.AdvancedTable.request(table,module,action,"/id/"+id);
			},
			div : function div(target,event)
			{
				target = target.up("th");
				if (target)
				{
					Akyla.AdvancedTable.clickObservers.th(target,event);
				}
			},
			th : function th(target,event)
			{
				/* This will be a sorting action */
				if (target.up("thead") && !target.hasClassName("unsortable"))
				{
					var sortDir = "asc";
					/* Reset the other columns */
					target.siblings().each(function (column)
					{
						column.removeClassName("asc").removeClassName("desc");
					});
					/* Figure out which way to sort on */
					if (target.hasClassName("asc"))
					{
						target.removeClassName("asc").addClassName("desc");
						sortDir = "desc";
					}
					else if (target.hasClassName("desc"))
					{
						target.removeClassName("desc").addClassName("asc");
					}
					else
					{
						target.addClassName("asc");
					}
					Akyla.AdvancedTable.request(target.up("table"));
					Event.stop(event);
				}
			},
			a : function a(target,event)
			{
				if (target.hasClassName("search"))
				{
					var table = target.up("div.advancedTableWrapper").down("table");
					if (!table.searchHistory)
					{
						table.searchHistory = new Array();
					}
					var searchControls = target.up("div.searchControls")
					var historySpan = searchControls.down("span.history");
					var searchText = $F(searchControls.down("input"));
					if (searchText == "")
					{
						historySpan.update("");
						table.searchHistory = new Array();
					}
					else
					{
						var operatorSelect = target.up("div.searchControls").down("span.searchWidget select");
						var operatorValue = operatorSelect.options[operatorSelect.selectedIndex].value;
						var operatorText = operatorSelect.options[operatorSelect.selectedIndex].text;
						if (historySpan.getInnerText() == "")
						{
							historySpan.insert({bottom : searchText});
						}
						else
						{
							historySpan.insert({bottom : " " + operatorText + " " +searchText});
						}
						table.searchHistory.push({operator : operatorValue, text : searchText});
					}
					Akyla.AdvancedTable.request(table);
					Event.stop(event);
				}
			},
			img : function img(target,event)
			{
				if (target.up("a.search"))
				{
					Akyla.AdvancedTable.clickObservers.a(target.up("a.search"),event);
				}
				else if (target.up("div.bottomToolbar"))
				{
					var wrapper = target.up("div.advancedTableWrapper");
					var table = wrapper.down("table");
					var searchText = "";
					var pagingControls = target.up("div.pagingControls");
					var sortingCol = table.select("thead tr th.asc","thead tr th.desc").first();
					var sortDir = "asc", url = null;
					var maxPageNumbers = parseInt(pagingControls.readAttribute("totalpages"),10);
					var currentPageNumber = parseInt(pagingControls.readAttribute("page"),10);
					var pageNo = currentPageNumber;
					var page = target.readAttribute("alt");
					if (page == "first")
					{
						if (currentPageNumber !== 1)
						{
							pageNo = 1;
						}
					}
					else if (page == "previous")
					{
						if (currentPageNumber > 1)
						{
							pageNo = currentPageNumber-1;
						}
					}
					else if (page == "next")
					{
						if (currentPageNumber < maxPageNumbers)
						{
							pageNo = currentPageNumber+1;
						}
					}
					else if (page == "last")
					{
						if (currentPageNumber < maxPageNumbers)
						{
							pageNo = maxPageNumbers;
						}
					}
					else if ( page == "book")
					{
						if (pagingControls.hasClassName("switched"))
						{
							pageNo = 1;
						}
						else
						{
							pageNo = 0;
						}
					}
					var url = "/page/"+pageNo;
					if (currentPageNumber !== pageNo)
					{
						Akyla.AdvancedTable.request(table,null,null,url);
					}
				}
				else if (target.up("div.topToolbar"))
				{
					if (target.hasClassName("excel"))
					{
						var table = target.up("div.advancedTableWrapper").down("table");
						Akyla.AdvancedTable.exportCSV(table);
					}
				}
			},
			span : function span(target,event)
			{
				if (target.up("div.pagingControls"))
				{
					var wrapper = target.up("div.advancedTableWrapper");
					var table = wrapper.down("table");
					var sortingCol = table.select("thead tr th.asc","thead tr th.desc").first();
					var sortDir = "asc", url = null;
					var pageNumber = parseInt(target.innerHTML,10);
					var currentPageNumber = parseInt(target.up("div.pagingControls").readAttribute("page"),10);
					var maxPages = parseInt(target.up("div.pagingControls").readAttribute("totalpages"),10);
					var searchInput = wrapper.down("div.topToolbar div.searchControls span.searchWidget input");
					var searchText = "";
					if (searchInput)
					{
						if ($F(searchInput) != "")
						{
							searchText = "/search/"+$F(searchInput);
						}
					}
	
					var url = "/page/"+pageNumber;
					if (currentPageNumber != pageNumber)
					{
						Akyla.AdvancedTable.request(table,null,null,url);
					}
				}
			}
		},
		/**
		 * This holds a lookup object of tag names which will get called whenever a context click
		 * occurs.
		 */
		contextObservers : 
		{
			td : function td(target,event)
			{
				if (target.hasAttribute("module"))
				{

				}
				else if (target.up("tr").hasAttribute("module"))
				{
				}
				else if (target.up("table").hasAttribute("module"))
				{
				}
			},
			th : function th(target,event)
			{
				/* This will be a column hide action */
				if (target.up("thead") && target.hasAttribute("columnindex"))
				{
					Akyla.AdvancedTable.createPopupMenu(target.up("div.advancedTableWrapper"),target, event);
					Event.stop(event);
				}
			},
			div : function div(target,event)
			{
				if (target.up("th"))
				{
					Akyla.AdvancedTable.contextObservers.th(target.up("th"),event);
				}
			}
		},
		limitToPages : function (table, pages, currentPageNo)
		{
			var wrapper = table.up("div.advancedTableWrapper");
			if (!wrapper) return;
			var pagingControls = wrapper.down("div.bottomToolbar div.pagingControls");
			if (!pagingControls) return;
			var index = 1;
			if (pages)
			{
				pagingControls.select("span.pager").each( function (pager)
				{
					if (index > pages)
					{
						pager.removeClassName("enabled")
						pager.addClassName("disabled")
					}
					else
					{
						pager.addClassName("enabled")
						pager.removeClassName("disabled")
					}
					index++;
				});
			}
			var maskLookup = this.preferences.pageMask.toArray();
			var pagers = pagingControls.select("span.pager.enabled");
			if (!pages)
				pages = pagers.length;
			pagingControls.writeAttribute("totalpages",pages);
			var invertedMask = maskLookup.clone().reverse();
			maskLookup = maskLookup.filter(function (item)
				{
					return item <= (pages/2) && item <= currentPageNo;
				});
			var up = false;
			var offset = 0, mask = 0, comparator = 0;
			mask = maskLookup.shift();
			comparator = maskLookup.shift();
			if (!comparator)
				comparator = mask;
			if (currentPageNo == 1)
			{
				up = true;
				maskLookup = invertedMask;
				mask = maskLookup.shift();
			}
			else
			{
				invertedMask.shift();
			}
			for (var index = 1; index <= pagers.length; index++)
			{
				offset = Math.abs(currentPageNo-index);
				if (offset%mask != 0 && index != 1 && index < pagers.length && offset != comparator)
				{
					pagers[index-1].addClassName("invisible");
				}
				else
				{
					pagers[index-1].removeClassName("invisible");
				}
				if (up && offset == mask)
				{
					if (maskLookup.length > 0)
					{
						mask = maskLookup.shift();
					}
				}
				else if (!up && offset == comparator)
				{
					if (maskLookup.length == 0 & !up)
					{
						maskLookup = invertedMask;
						mask = maskLookup.shift();
						up = true;
					}
					else
					{
						mask = comparator;
						comparator = maskLookup.shift();
					}
				}
				if ((Math.abs(currentPageNo-index)) <= 3)
				{
					pagers[index-1].setStyle({padding : (6-Math.abs(currentPageNo-index))+"px"});
				}
				else
				{
					pagers[index-1].setStyle({padding : 2+"px"});
				}
			}
		},
		request : function request(table, module,action, url, options)
		{
			var wrapper = table.up("div.advancedTableWrapper");
			var sortColumn = null;
			var detailAction = "detail";
			if (table.hasAttribute("detailaction"))
			{
				detailAction = table.readAttribute("detailaction");
			}
			var sortDir = "asc";
			if (!module)
				module = table.readAttribute("module");
			if (!action)
			{
				if (table.hasAttribute("actionurl"))
				{
					action = table.readAttribute("actionurl");
				}
				else
				{
					action = "listtable";
				}
			}

			var parameters = {
				"advancedTable[action]" : action
			};
			var requestUrl = module+"/"+action;
			if (url)
				requestUrl = requestUrl + url;
			if (wrapper.down("div.pagingControls") && wrapper.down("div.pagingControls").hasAttribute("page") )
			{
				if (url && url.search(/page/) != -1)
				{
				}
				else
				{
					var currentPage = parseInt(wrapper.down("div.pagingControls").readAttribute("page"),10);
					if (currentPage === 0)
					{
						requestUrl = requestUrl + "/page/0";
					}
				}
			}
			table.select("thead tr th").each(function (header)
			{
				if (header.hasAttribute("columnid") && (header.hasClassName("asc") || header.hasClassName("desc")))
				{
					sortColumn = header.readAttribute("columnid");
					if (header.hasClassName("desc"))
						sortDir = "desc";
					else
						sortDir = "asc";

				}
				if (!header.hasAttribute("columnid"))
				{
					return;
				}
				if (header.hasClassName("invisible"))
				{
					parameters["advancedTable[columns]["+header.readAttribute("columnid").gsub("[","(").gsub("]",")")+"]"] = "false";
				}
				else
				{
					parameters["advancedTable[columns]["+header.readAttribute("columnid").gsub("[","(").gsub("]",")")+"]"] = "true";
				}
			});
			if (sortColumn && action != detailAction)
			{
				requestUrl = requestUrl + "/sort/"+sortColumn+"/direction/"+sortDir;
			}
			if (table.searchHistory && table.searchHistory.length > 0)
			{
				for (var i = 0; i < table.searchHistory.length; i++)
				{
					var searchPair = table.searchHistory[i];
					parameters["advancedTable[search]["+i+"][operator]"] = searchPair.operator;
					parameters["advancedTable[search]["+i+"][text]"] = searchPair.text;
				}
			}
			if (this.actions[action])
			{
				this.actions[action](table);
			}
			if (action == detailAction)
			{
				new Akyla.Ajax.ajaxRequest(requestUrl,null,{ table : table});
			}
			else
			{
				if (wrapper.overlay)
				{
					wrapper.overlay.show();
					wrapper.loadingOverlay.show();

				}
				else
				{

					var overlay = new Element("div").addClassName("advancedTableOverlay").update("&nbsp;");
					var loadingOverlay = new Element("div").addClassName("loadingOverlay").update("&nbsp;");
					
					wrapper.insert({bottom : overlay});
					wrapper.insert({bottom : loadingOverlay});
					wrapper.overlay = overlay;
					wrapper.loadingOverlay = loadingOverlay;
				}
				var dimensions = wrapper.getDimensions();
				wrapper.overlay.setStyle({
						position : "absolute",
						left : "0px",
						top : "0px",
						width : dimensions.width+"px",
						height : dimensions.height+"px"
					});
				wrapper.loadingOverlay.setStyle({
						position : "absolute",
						left : "0px",
						top : "0px",
						width : dimensions.width+"px",
						height : dimensions.height+"px"
					});
				if (action == "resetcolumnconfig")
				{
					new Akyla.Ajax.ajaxRequest(requestUrl,null,{
						onComplete : function ()
						{
							if (wrapper.overlay)
							{
								wrapper.overlay.hide();
								wrapper.loadingOverlay.hide();
							}
							this.resetColumnHeaders(wrapper);
						}.bind(this)
					});
				}
				else
				{
					// SOme kinda voodoo going on, create overlay
					new Akyla.Ajax.ajaxRequest(requestUrl,null,{ parameters : parameters, table : table, onComplete : function ()
					{
						if (wrapper.overlay)
						{
							wrapper.overlay.hide();
							wrapper.loadingOverlay.hide();
						}
						this.resetColumnHeaders(wrapper);
					}.bind(this)});
			}
				
			}
		},
		/**
		 * Will reset the column headers if these contain checkboxes
		 */
		resetColumnHeaders: function(wrapper)
		{
			var inputs =wrapper.select("table thead th input");
			if (inputs)
			{
				inputs.each(function (input)
				{
					if (input.type == "checkbox")
					{
						input.checked = false;
						input.removeAttribute("checked");
					}
				});
			}
		},
		/**
		 * Create right click popup menu
		 *
		 */
		createPopupMenu: function(wrapper, target,event)
		{
			popupMenu = new Element("ul",{className : "popup"});
			var li = new Element("li").update(Akyla.translate("Hide"));
			popupMenu.insert({top:li});

			pos = target.cumulativeOffset();
			var x = Event.pointerX(event)-5;
			var y = Event.pointerY(event)-5; 

			popupMenu.style.left = x+'px';
			popupMenu.style.top = y+'px';
			popupMenu.style.position = 'absolute';
			popupMenu.observe("mouseout", function (event)
			{
				setTimeout(function ()
				{
					popupMenu.remove();
				},200);
			});
			popupMenu.observe("click", function (event)
			{
				var columnIndex = target.readAttribute("columnindex");
				var table = target.up("table");
				if (!table)
				{
					return;
				}
				table.select("[columnindex="+columnIndex+"]").each(function (cell)
				{
					cell.addClassName("invisible");
				});
				if (!table.up("div.advancedTableWrapper"))
				{
					return;
				}
				table.up("div.advancedTableWrapper").down("div.topToolbar ul.columnList li[columnindex="+columnIndex+"]").removeClassName("invisible");
				Event.stop(event);

				popupMenu.remove();
			}.bind(this));
			$(document.body).insert({bottom: popupMenu});
			return popupMenu; 
		},
		exportCSV : function exportCSV(table)
		{
			var exportAction = "";
			var header = new Array();
			table.select("thead th").each(function (th)
			{
				header.push(th.getInnerText());
			});
			exportAction = exportAction + header.join(";") + "\n";
			table.select("tbody tr").each(function (row)
			{
				var ar = new Array();
				row.select("td").each(function (td)
				{
					ar.push(td.getInnerText());
				});
				exportAction = exportAction + ar.join(";") + "\n";
			});
			Akyla.AdvancedTable.request(table,null,"excel",null,
				{
					method : "post",
					parameters : 
					{
						text : exportAction
					}
				});
		},
		makeReorderable : function (table)
		{
			var headers = table.select("thead th");
			headers.each(function (th)
			{
				var dummyDiv = new Element("div", {className : "draggable", columnid : th.readAttribute("columnid")}).update(th.innerHTML);
				th.update(dummyDiv);
				Droppables.add(th, {
						hoverclass : "gettingDrop",
						onHover : function (droppedTarget, droppable)
						{
							if (this.hovering != droppable)
							{
								this.markDroppable(droppable);
								this.hovering = droppable;
							}
							else
							{
							}
						}.bind(this),
						onDrop : function onDrop(droppedTarget, dropArea, event) 
						{ 
							this.switchColumns(table,droppedTarget, dropArea);
							if ($("jsonTableDropMarker") != null)
							{
								$("jsonTableDropMarker").remove();
							}
							Event.stop(event);

						}.bind(this)});
				new Draggable(dummyDiv, {
						revert : true,
						constraint : "horizontal",
						onStart : function (draggable, event)
						{
							$(draggable.element).up("th").addClassName("dragging");
							$(draggable.element).addClassName("dragging");
							Event.stop(event);
						},
						onDrag : function (draggable, event)
						{
							Event.stop(event);
						},
						onEnd : function (draggable, event)
						{
							$(draggable.element).up("th").removeClassName("dragging");
							$(draggable.element).removeClassName("dragging");
							if ($("jsonTableDropMarker") != null)
							{
								$("jsonTableDropMarker").remove();
							}
							Event.stop(event);
						}});

			}.bind(this));
		},
		actions : 
		{

		},
		markDroppable : function markDroppable(droppable)
		{
			var pos = droppable.cumulativeOffset();
			var x = pos[0]+droppable.getWidth()-8;
			var y = pos[1]-16;
			var img = new Element("img", {id : "jsonTableDropMarker", src : "image/icons/original/arrow_down.png"}).setStyle({position : "absolute", left : x+"px", top : y+"px", zIndex : 1000});
			if ($("jsonTableDropMarker"))
			{
				$("jsonTableDropMarker").replace(img);
			}
			else
			{
				$(document.body).insert({bottom : img});
			}
		},
		applyToColumn : function(table,number, func)
		{
			var headers = table.select("table thead th");
			var rows = table.select("table tbody tr");
			func(headers[number]);
			rows.each(function (row)
			{
				var cells = row.select("td");
				func(cells[number]);
			});
		},
		switchColumns : function(table,from, to)
		{
			from = from.parentNode.cellIndex;
			to = to.cellIndex;
			if (from == to)
			{
				return;
			}
			table.writeAttribute("dirty","dirty");
			var headers = table.select("thead th");
			var rows = table.select("tbody tr");
			headers[to].insert({after : headers[from]});
			rows.each(function (row)
			{
				var cells = row.select("td");
				cells[to].insert({after : cells[from]});

			});

		}		
	});

	Akyla.AdvancedTable = new Akyla_Prototype_AdvancedTable();
})();



