if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
	
var filter_container = null;
var order_container = null;
// LISTA -------------
	
	/**
	 *  Wyswietla menu dla elementu listy (do diva z menu aktualnie zaznaczonego elementu listy przenosi zawartosc ukrytego menu dla elementu listy).
	 *  Dodatkowo zaznacza wybrany element listy
	 */
	function printMenu(menu_div, element_menu_div, element_div, menu_class_name)
  	{
	  		// zaladowanie tresci do menu
	      	dojo.byId(menu_div).innerHTML = dojo.byId(element_menu_div).innerHTML;
		$("#context_menu a").mousedown(function(){
				$(this).css({"background-position":"0px -73px"});
			}).mouseup(function() {
				$(this).css({"background-position":"0px -37px"});
			}).mouseover(function() {
				$(this).css({"background-position":"0px -37px"});
			}).mouseout(function() {
				$(this).css({"background-position":"0px 0px"});
		});

  	}
	
  	function setMenuStyle(menu_div)
  	{
  		$("#context_menu a").mousedown(function(){
				$(this).css({"background-position":"0px -73px"});
			}).mouseup(function() {
				$(this).css({"background-position":"0px -37px"});
			}).mouseover(function() {
				$(this).css({"background-position":"0px -37px"});
			}).mouseout(function() {
				$(this).css({"background-position":"0px 0px"});
		});
  		
  		$("#context_menu div").show();
  	}

	/**
	 *  Klikniety atrybut zaznacza na liscie elementow dla wszystkich elementow listy
	 */  	
  	function selectListAttribute(attribute_class_name, list_class_name)
  	{
  		var all_attributes = document.getElementsByClassName(list_class_name);
      	for(var i=0; i<all_attributes.length; i++)
      	{
      		all_attributes[i].removeAttribute('style');
      	}
      	
      	var selected_attributes = document.getElementsByClassName(attribute_class_name);
      	for(var i=0; i<selected_attributes.length; i++)
      	{
      		selected_attributes[i].setAttribute('style', 'font-weight: bold');
      	}
  	} 
  	
// FILTROWANIE I SORTOWANIE (DND) -----------  	
  	
  	/**
  	 *  tworzy liste atrybutow
  	 */
  	function attributeCreator(item, hint) {
		var div = document.createElement("div");
		div.appendChild(document.createTextNode(item.attribute));
		return {node: div, data: item, type: item.type};
	};
	
	/**
	 *  tworzy liste filtrow
	 */
	function filterCreator(item, hint) {
		var div = document.createElement("div");
		div.innerHTML = dojo.byId(item.filter).innerHTML;
		
		// sprawdza czy dodawany filtr nie jest juz dodany
		var filters=document.getElementById('filters').getElementsByTagName('dt');
//		for(var i=0; i<filters.length; i++)
//		{
//			if(filters[i].id == div.getElementsByTagName('dt')[0].id)
//			{
//				return null;
//			}
//		}
		return {node: div, data: item, type: item.type};
	};
	
	/**
	 *  tworzy liste sortowan
	 */
	function orderCreator(item, hint) {
		var div = document.createElement("div");
		div.innerHTML = dojo.byId(item.order).innerHTML;
		
		// sprawdza czy dodawane sortowanie nie jest juz dodane
		var orders=document.getElementById('orders').getElementsByTagName('dt');
//		for(var i=0; i<orders.length; i++)
//		{
//			if(orders[i].id == div.getElementsByTagName('dt')[0].id)
//			{
//				return null;
//			}
//		}
		return {node: div, data: item, type: item.type};
	};
	
	function getFilterElements(component_name){
		var filtersDom = this.document.getElementById('hidden_filters');
		
		var hidden_filters = (filtersDom == null ? new Array(0) : filtersDom.getElementsByTagName('li'));
		
		return hidden_filters;
	}
	
	function getOrderElements(component_name){
		var ordersDom = this.document.getElementById('hidden_orders');
		
		var hidden_orders = (ordersDom == null ? new Array(0) : ordersDom.getElementsByTagName('li'));
		
		return hidden_orders;
	}
	
	/**
	 * Buduje strukture opcji dla listy dostepnych przez DND.
	 * Z odpowiednich ukrytych elementow htmla pobiera atrybuty, filtry i sortowania, buduje obiekty js
	 */ 
	function buildSchema() {
		var attributes_arr = [];
		
		// pobieranie filtrow (z ukrytej listy html)
		var hidden_filters = getFilterElements(component_name);
		// pobieranie sortowan (z ukrytej listy html)
		var hidden_orders = getOrderElements(component_name);
		
		var in_arr = [];
		
		// budowanie tablicy atrybutow. typ ustalany jest na podstawie przynaleznosci do filtrow lub sortowan
		for(i=0; i<hidden_filters.length; i++)
		{
			var name = hidden_filters[i].getAttribute('name');
			var filter = hidden_filters[i].id;
			var types = ['attribute_type', 'filter_type'];
			var order = null;
			
			for(j = 0; j<hidden_orders.length; j++)
			{
				if(hidden_orders[j].getAttribute('name') == name)
				{
					order = hidden_orders[j].id;
					types.push('order_type');
					in_arr.push(name);
					break;
				}
			}
			attributes_arr.push({attribute: name, filter: filter, order: order, type: types});
		}
		for(i=0; i<hidden_orders.length; i++)
		{
		
			var name = hidden_orders[i].getAttribute('name');
			if(in_arr.indexOf(name) < 0)
			{
				var order = hidden_orders[i].id;
				var types = ['attribute_type', 'order_type'];
				var type = null;
			
				attributes_arr.push({attribute: name, filter: filter, order: order, type: types});
			}
			
		}
		return attributes_arr;
	}
	
	/**
	 *  Buduje container dla filtrow, umieszcza w nim aktywne (ustawione przed przeladowaniem strony) filtry
	 */
	function buildFilters() 
	{	
		var filters_arr = [];
		var hidden_filters = getFilterElements(component_name);
		for(i=0; i<hidden_filters.length; i++)
		{		
		
			var name = hidden_filters[i].getAttribute('title');
			if(filters_list.indexOf(name) >= 0)
			{
				var filter = hidden_filters[i].id;
				var types = ['attribute_type', 'filter_type'];
				var order = null;
				filters_arr.push({attribute: name, filter: filter, order: order, type: types});
			}
			
		}
		return filters_arr;
	}
	
	/**
	 *  Buduje container dla sortowan, umieszcza w nim aktywne (ustawione przed przeladowaniem strony) sortowania
	 */
	function buildOrders() 
	{	
		var orders_arr = [];
		var hidden_orders = getOrderElements(component_name);
		for(i=0; i<hidden_orders.length; i++)
		{		
			var name = hidden_orders[i].getAttribute('title');
			if(orders_list.indexOf(name) >= 0)
			{
				var order = hidden_orders[i].id;
				var types = ['attribute_type', 'order_type'];
				var filter = null;
				orders_arr.push({attribute: name, filter: filter, order: order, type: types});
			}
		}
		return orders_arr;
	}

	/**
	 * inicjalizacja obiektow DND
	 */
	function dndinit(){		
		dojo.require("dojo.dnd.Source");
		dojo.require("dijit.TitlePane");

		// pobranie danych z html
		var attributes_arr = buildSchema();
		var filters_arr = buildFilters();
		var orders_arr = buildOrders();
		
		// box atrybutow
		var attribute_box = new dijit.TitlePane({title: "Atrybuty", open: false}, "attribute_container");
		var attribute_node = new dojo.dnd.Source("attribute_node", {copyOnly: true, creator: attributeCreator});
		attribute_node.insertNodes(false, attributes_arr);
		
		// box filtrow
		if(document.getElementById("filter_container") != null){
			var filter_box = new dijit.TitlePane({title: "Filtruj po", open: false}, "filter_container");
			filter_container = new dojo.dnd.Source("filter_container", {skipForm: true, accept: ["filter_type"], creator: filterCreator});
			
			//dodanie słuchacza zdarzenia upuszczenia elementu na kontener
			dojo.connect(filter_container, "onDrop", function(source, nodes, copy){
				if((typeof dojoDndFilterOnDrop) != "undefined"){
					dojoDndFilterOnDrop.call();
				}
			});
			
			filter_container.parent = dojo.query("#filter_form #filters")[0];
			filter_container.insertNodes(false, filters_arr);
			

			//dojo.event.connect(attribute_node, "onDrop", "filter_drop_event");
		}

		// box sortowania
		var order_box = new dijit.TitlePane({title: "Sortuj po", open: false}, "order_container");
		order_container = new dojo.dnd.Source("order_container", {skipForm: true, accept: ["order_type"], creator: orderCreator});
		order_container.parent = dojo.query("#order_form #orders")[0];
		order_container.insertNodes(false, orders_arr);

	};
	
	/**
	 *  usuwanie zaznaczonych filtr�w
	 */
	function deleteFilterNodes(id){
		if((typeof deleteFilterNodesCallback) != "undefined"){
			deleteFilterNodesCallback.call();
		}
		filter_container.deleteSelectedNodes();
		filter_container.getSelectedNodes();
    }
    
    /**
     *  usuwanie zaznaczonych sortowan
     */
    function deleteOrderNodes(id)
	{
		order_container.deleteSelectedNodes();
    }
