(function($){
    $.fn.list = function(_options) {
		var _list;
		this.each(function(){
			_list = new $.fn.list.lister(this, _options); 
		});
		
		return _list;	
    };
    
	$.fn.list.lister = function(_element, _options){
		this.options = {
          urlAdd:           '',
          urlUpdate:        '',
          urlRemove:        '',
          filter:           {},
          paging:           {
                            element:            '',
                            action:             '',
                            columnOrder:        '',
                            columnOrderASCDESC: 'ASC',
                            rowPerPages:        30,
                            position:           0,
                            page:               1,
                            pages:              1,
                            records:            0,
                            sql:                ''},
          form:             {},
          events:           {afterRefresh:   function(){},
                             afterRemove:   function(){}}
        };
		
		this.setOption(_options);
		
		this.data;
		this.element = $(_element);
		this.templateROW = this.element.find('tbody tr').fillTemplate([]);
		this.templatePAGING;
		if(this.options.paging.element!='') {
		    this.templatePAGING = this.element.find(this.options.paging.element).fillTemplate(this.options.paging);
		};
		
		this.element.find("thead td[orderby!='']").bind('click', this, this.orderBy);
		
		if (this.options.paging.action=='moveFirst') this.update();
    };
    
    var lister = $.fn.list.lister;
	
	lister.prototype.refresh = function(data){
	    if(data) this.data = data;
	    this.element.find('tbody').html(this.templateROW.parse(this.data.rows));
	    if (this.element.find('tbody').attr('odd')) this.element.find('tbody tr:odd').css("background-color",this.element.find('tbody').attr('odd'));
	    if (this.element.find('tbody').attr('even')) this.element.find('tbody tr:even').css("background-color",this.element.find('tbody').attr('even'));
		//RS - imposto i valori della paginazione
		this.options.paging.position = data.position;
		this.options.paging.page = data.page;
		this.options.paging.pages = data.pages;
		this.options.paging.records = data.records;
		if(this.options.paging.element!='') this.element.find(this.options.paging.element).replaceWith(this.templatePAGING.parse(this.options.paging));
		//RS - attivo gli eventi sui pulsanti
		this.element.find("[action='moveFirst']").one('click', this, this.moveFirst);
		this.element.find("[action='movePrev']").one('click', this, this.movePrev);
		this.element.find("[action='moveNext']").one('click', this, this.moveNext);
		this.element.find("[action='moveLast']").one('click', this, this.moveLast);
		this.element.find("[remove!='']").one('click', this, this.remove);
    };
	
	lister.prototype.update = function(_options){
	    this.setOption(_options);		
	    var appo = this;
	    $.ajax({ url: this.options.urlUpdate,
			  type: 'POST',
			  cache: false,
			  processData: false,
			  data: appo.getXML(),
			  //dataType: 'json',
			  success: function(data, textStatus){
			    var _result = $.parseJSON(data);
			    if(_result.error==''){
				    appo.refresh(_result);				
				} else {
				    alert(_result.error);
				};
			  }
		});
    };
    
    lister.prototype.moveFirst = function(event){
        event.data.update({paging: {action: 'moveFirst'}});
	};
	
	lister.prototype.movePrev = function(event){
	    event.data.update({paging: {action: 'movePrev'}});
	};
	
	lister.prototype.moveNext = function(event){
	    event.data.update({paging: {action: 'moveNext'}});
	};
	
	lister.prototype.moveLast = function(event){
        event.data.update({paging: {action: 'moveLast'}});
	};
	
	lister.prototype.orderBy = function(event){
	    event.data.options.paging.action = 'moveFirst';
	    if(event.data.options.paging.columnOrder!=$(this).attr('orderby')){
	        event.data.options.paging.columnOrder = $(this).attr('orderby');
	        event.data.options.paging.columnOrderASCDESC = 'ASC';
	    } else {
	        if(event.data.options.paging.columnOrderASCDESC == 'ASC'){
	            event.data.options.paging.columnOrderASCDESC = 'DESC';
	        } else {
	            event.data.options.paging.columnOrderASCDESC = 'ASC';
	        };
	    };
	    event.data.update();
	};
	
	lister.prototype.remove = function(event){
	    var appo = this;
	    appo.options.form = event.form; 
        appo.options.action = 'moveFirst';
        $.ajax({ url: appo.options.urlRemove,
			  type: 'POST',
			  cache: false,
			  processData: false,
			  data: appo.getXML(),
			  success: function(data, textStatus){
			    var _result = $.parseJSON(data);
			    if(_result.error==''){
				    appo.refresh(_result);				
				} else {
				    alert(_result.error);
				};
			  }
		});
	};
	
	lister.prototype.setOption = function(_options){
	    if(_options){
	        $.extend(this.options.paging, _options.paging);
		    var tmpPaging = this.options.paging;
		    $.extend(this.options, _options);
		    this.options.paging = tmpPaging;
		};
	};
	
	lister.prototype.JSONtoXML = function (_tableName, _row) {
        var GetXML_Parametri = '';
        
            GetXML_Parametri += "<" + _tableName + ">\n";
        if (_row) {
            jQuery.each(_row, function(_key, _value){
                if (_key!='') GetXML_Parametri += "<" + _key + ">" + _value + "</" + _key + ">\n";    
            });
            GetXML_Parametri += "</" + _tableName + ">\n";
        }; 

        return GetXML_Parametri;
    };
	
	lister.prototype.getXML = function (){
        var GetXML_Parametri = '<Elenco>\n';
        
        GetXML_Parametri += this.JSONtoXML('Parametri', this.options.paging);
        GetXML_Parametri += this.JSONtoXML('Filtro', this.options.filter);
        GetXML_Parametri += this.JSONtoXML('Form', this.options.form);

        GetXML_Parametri += "</Elenco>";
        
        return GetXML_Parametri;
    };
})(jQuery);