/*
 * TableLoader script
 * 2007 by Martin Kleinhans
 *
 * loads table rows by ajax requests
 * also used by TablePagination and SortableTable if active
 */
 
	var TableLoader = {
		counter: 0,
		instances : [],
		
		isManaged: function(id) {
			if(TableLoader.getTableLoaderById(id)) {
				return true;
			}
		},
		
		getTableLoader: function(number) {
			return TableLoader.instances[number];
		},
		
		getTableLoaderById: function(id) {
			var tableLoader = undefined;
			TableLoader.instances.each(function(o) {
				if(o.getId() == id) {
					tableLoader = o;
					throw $break;
				}
			});
			return tableLoader;
		},
		
		create : function (id, options) {
			var table = $(id);
			if(!table || !(table.tagName == 'table' || table.tagName == 'TABLE')) {
				return;
			}
		
	    if (options) {
	      p_opt = new Hash(options);
	    } else {
	      p_opt = $H();
	    }
      var pos = TableLoader.counter;
      var object = TableLoader.getTableLoaderById(id);
      if(object) {
        pos = object.getNumber();
      } 
    
	    TableLoader.instances[pos] = new TableLoaderInstance(id, p_opt);
	    
      if(!object) {
        TableLoader.counter++;
      }
    },
		
		handleResponse: function(number,action,result) {
			if(action == 'load') {
				TableLoader.getTableLoader(number).updateTable(result);
			}
		},
		
		onEffectFinished: function(object) {
      var id = object.element.id;
		 	id = id.sub('loading-','');
			id = id.sub('-animation-1','');
			TableLoader.getTableLoaderById(id).onEffectFinished();
		}
	};

	var TableLoaderInstance = Class.create();

	TableLoaderInstance.prototype = {
		options_default : $H({
	      id: '',
	      url: '',
	      column: '',
	      order: '',
	      currentPage: 0,
          staticParameters: '',
	      pageParameter: 'page',
	      columnParameter: 'column',
	      orderParameter: 'order',
	      loadOnCreate: false,
        spacer: '&nbsp;',
	      // private parameters
	      loading: false,
	      animation: false,
	      effect: false,
        rowOnClick: false
    }),
	    
		options : $H({
    }),
    
    initialize: function(id, opt) {
      this.options = Object.clone(this.options_default);
			this.options['id'] = id;
			this.options['number'] = TableLoader.counter;
			if (opt.values().length>0) {
        this.options.merge(opt);
      }
      
      if(this.options['order'] != 'ASC' && this.options['order'] != 'DESC') {
      	this.options['order'] = '';
      }
      
      if(this.options['loadOnCreate']) {
      	this.load();
      }
      if(this.isPaginated()) {
      	this.onPaginationCreated();
      }
      if(this.isSortable()) {
      	this.onSortableCreated();
      }
		},
		
		onPaginationCreated: function() {
			var pagination = TablePagination.getTablePaginationById(this.getId());
			if(pagination.getCurrentPage() == this.options['currentPage']) {
				return;
			}
			this.load();
		},
		
		onSortableCreated: function() {
			var sortable = SortableTable.getSortableTableById(this.getId());
			if(sortable.getSortColumn() == this.options['column'] &&
				sortable.getSortOrder() == this.options['order']) {
				return;
			}
			this.load();
		},
		
		setCurrentPage: function(page) {
			if(this.isPaginated()) {
				TablePagination.getTablePaginationById(this.getId()).setCurrentPage(page);
			} else {
				this.options['currentPage'] = page;
				this.load();
			}
		},
		
		setSortColumn: function(column) {
			if(this.isSortable()) {
				SortableTable.getSortableTableById(this.getId()).setSortColumn(column);
			} else {
				this.options['column'] = page;
				this.load();
			}
		},
		
		setSortOrder: function(order) {
			if(this.isSortable()) {
				SortableTable.getSortableTableById(this.getId()).setSortOrder(order);
			} else {
				this.options['order'] = page;
				this.load();
			}
		},
		
		load: function() {
			if(this.isLoading()) {
				return false;
			}
			this.options['loading'] = true;
			
			var pars = '';
			
			if(this.isPaginated()) {
				var pagination = TablePagination.getTablePaginationById(this.getId());
				if(pagination) {
					pars = pars + this.options['pageParameter']+'=' + pagination.getCurrentPage();
				}
			}
			if(this.isSortable()) {
				var sortableTable = SortableTable.getSortableTableById(this.getId());
				if(sortableTable) {
					if(pars != '') {
						pars = pars + '&';
					}
					pars = pars + this.options['columnParameter']+'=' + sortableTable.getSortColumn();
					if(pars != '') {
						pars = pars + '&';
					}
					pars = pars + this.options['orderParameter']+'=' + sortableTable.getSortOrder();
				}
			}
			
      if(this.options['staticParameters'] != '') {
        pars = pars + '&' + this.options['staticParameters'];
      }
      
			var number = this.getNumber();
			var myAjax = new Ajax.Request(
				this.options['url'], 
				{
					method: 'post', 
					parameters: pars, 
					onComplete: function(request,object) {
              if (!object || object.length == 0) {
                  object = request.responseText.evalJSON();
              } 
							TableLoader.handleResponse(number,'load',object);
						}
				});
			
			this.toggleLoadingAnimation();
		},
		
		isPaginated: function() {
			if(typeof(TablePagination) == 'object' && TablePagination.isManaged(this.getId())) {
				return true;
			}
			return false;
		},
		
		isLoading: function() {
			return this.options['loading'] || this.options['effect'];
		},
		
		isSortable: function() {
			if(typeof(SortableTable) == 'object' && SortableTable.isManaged(this.getId())) {
				return true;
			}
			return false;
		},
		
		getId: function() {
			return this.options['id'];
		},
		
		getNumber: function() {
			return this.options['number'];
		},
		
		getSortColumn: function() {
			return this.options['column'];
		},
		
		getSortOrder: function() {
			return this.options['order'];
		},
		
		getCurrentPage: function() {
			return this.options['currentPage'];
		},
    
    getSpacer: function() {
      return this.options['spacer'];
    },
    
		getHeaderCells : function() {
      var table = $(this.getId());
      return $A((table.tHead && table.tHead.rows.length > 0) ? table.tHead.rows[table.tHead.rows.length-1].cells : table.rows[0].cells);
    },
    
		updateTable: function(data) {
			if(!this.isLoading()) {
				return;
			}
      
			var target = $(this.getId());
			var headers = this.getHeaderCells();
			var tbody;
      
			for(var i=0;i<target.tBodies.length; i++) {
				tbody = target.tBodies[i];
				target.removeChild(tbody);
			}
		
			tbody = document.createElement("tbody");
			
      if (data[0][0] == 'results') {
        var results = data[0][1];
        data.shift();
      }
      
			for(var i=0;i<data.length;i++) {
				var tr = document.createElement('tr');
                
                if (this.options['rowOnClick'] == true) {
                    start = 1;
                    /*
                    var onclickevent = document.createAttribute("onclick");
                    onclickevent.nodeValue = data[i][0];
                    tr.setAttributeNode(onclickevent);  */                
                    tr.onclick = new Function(data[i][0]);
                } else {  
				            start = 0;
                }
                
                for(var j=start;j<data[i].length;j++) {
                        var td = document.createElement('td');
                        
                        if (data[i][j]) {
                                  td.innerHTML = data[i][j];
                      } else {
                        td.innerHTML = this.getSpacer();
                      }
                                
                      tr.appendChild(td);
                }

				tbody.appendChild(tr);
			}
			target.appendChild(tbody);
      
      
      if(this.isPaginated()) {
        var pagination = TablePagination.getTablePaginationById(this.getId()); 
        if (results >= 0) {
          pagination.options['total'] = results;
        }
        pagination.createPageinationList();
      }
      
			if(this.isSortable()) {
				var sortableTable = SortableTable.getSortableTableById(this.getId());
				if(sortableTable) {
					sortableTable.stripeRows();
				}
			}
			this.toggleLoadingAnimation();
			this.options['loading'] = false;
		},
		
		onEffectFinished: function() {
			this.options['effect'] = false;
		},
		
		toggleLoadingAnimation: function() {
      toggleLoadingEffect(this.getId(),TableLoader.onEffectFinished);
      this.options['effect'] = true;
      
			this.options['animation'] = !this.options['animation'];
		}
	};