function ZMListManager(params) {
	this.xhr = null;
	this.reset = false;
	this.start = params.start || 0;
	this.number = params.number || 0;
	this.initialNumber = params.initialNumber || 0;
	this.xmlElement = params.xmlElement;
	this.container = document.getElementById(params.containerId);
	this.containerClass = params.containerClass || '';
	this.containerHiddenClass = params.containerHiddenClass || 'hidden';
	this.moreLink = document.getElementById(params.moreLink);
	this.containerNoResId = params.containerNoResId || 'div-noresult';
	this.scriptUrl = params.scriptUrl;
	this.loadingData = false;
	this.keepQuerying = true;
	this.lastQuery = params.lastQuery || 0;
	this.triggerHeight = params.height || 300;
	this.maxResultByQuery = 100;
	
	this.createElement_ = params.createElementFn;
	
	this.formValue = null;
	
	if(this.number > this.maxResultByQuery)
		this.number = this.maxResultByQuery
}

ZMListManager.prototype = ZMListManager;

ZMListManager.prototype.setFormValue = function(obj){
	if(typeof(obj) == 'object')
		this.formValue = obj;
	else
		this.formValue = null;
}

ZMListManager.prototype.query = function(){
	if(!this.loadingData && (this.keepQuerying || this.reset)){
		this.xhr = new ZHTTPRequest('POST','xml',true);
		var data = '';
		if (typeof(this.formValue) == 'object'){
			for (var prop in this.formValue) {
				if (data != '') 
					data += '&';
				data += prop + '=' + this.formValue[prop];
			}
		}
		if(this.reset){
			if(this.start > this.maxResultByQuery){
				data += '&st=0&nb='+this.maxResultByQuery;
				this.keepQuerying = true;
			}
			else
				data += '&st=0&nb='+this.start;
			this.start = 0;
		}
		else
			data += '&st='+this.start+(this.number?'&nb='+this.number:'')+(this.lastQuery?'&lq='+this.lastQuery:'');

		var ZMListManager_ = this;
		this.xhr.setCompleteCallback(
							function(xml_doc){
								ZMListManager_.addContent(xml_doc);
							}
		);
		this.xhr.setFailureCallback(
							function(){
								alert('Request failed');
								ZMListManager_.loadingData = false;
							}
		);
		this.loadingData = true;
		this.xhr.query(this.scriptUrl,data);
	}
}

ZMListManager.prototype.init = function(){
	this.query();
	var ZMListManager_ = this;
	ZEvent.addEventListener(window,'scroll',function(e){
							if(ZMListManager_.doQuery())
								ZMListManager_.query();
	},false);
}

ZMListManager.prototype.doQuery = function(){
	var do_query = false;
	var reg_exp = new RegExp('\\b'+this.containerHiddenClass+'\\b');
	if(this.container.style.display!='none' && !reg_exp.test(this.container.className)){
		var windowY = ((document.documentElement && document.documentElement.clientHeight) 
						|| window.innerHeight || self.innerHeight || document.body.clientHeight); 
						
		var scrollY = ((document.documentElement && document.documentElement.scrollTop) 
							|| window.pageYOffset || self.pageYOffset || document.body.scrollTop); 
		
		var pageY = (document.documentElement && document.documentElement.scrollHeight) ? document.documentElement.scrollHeight : 
							((document.body.scrollHeight > document.body.offsetHeight) ? document.body.scrollHeight : document.body.offsetHeight);
							
		do_query = (pageY-windowY-scrollY < this.triggerHeight);
	}

	return do_query;
}

ZMListManager.prototype.addContent = function(xml_doc){
	if(xml_doc!=null){
		var elements = new Array();
		xml_doc = ZHTTPRequest.cleanXML(xml_doc.documentElement);
		var elt_nodes = xml_doc.getElementsByTagName(this.xmlElement);
		if(elt_nodes.length>0){
			for(var i=0;i<elt_nodes.length;i++){
				elements.push(this.createElement_(elt_nodes[i]));
			}
			if(elt_nodes.length < parseInt(xml_doc.getAttribute('members')))
				this.keepQuerying = false;
			if(xml_doc.getAttribute('query'))
				var last_query = parseInt(xml_doc.getAttribute('query'));
			else
				var last_query = 0;
			
			if(this.reset || last_query > this.lastQuery){
				this.lastQuery = last_query;
				this.start = elt_nodes.length;
				this.reset = true;
			}
			else
				this.start += elt_nodes.length;
		}
		else
			this.keepQuerying = false;
		
		if(this.reset){
			var div = document.createElement('div');
			if(elt_nodes.length){
				div.id = this.container.id;
				if(this.containerClass){
					div.setAttribute('class',this.containerClass);
					div.setAttribute('className',this.containerClass);
				}
			}
			else
				div.id = this.containerNoResId;
		}
		if(elements.length>0){
			for(var i=0;i<elements.length;i++){
				if(this.reset)
					div.appendChild(elements[i]);
				else
					this.container.appendChild(elements[i]);
			}
		}
		if(this.reset){
			this.container.parentNode.replaceChild(div,this.container);
			this.container = div;
		}

		if(this.start > this.initialNumber && this.moreLink && (this.moreLink.getAttribute("className")!='hidden' || this.moreLink.getAttribute("class")!='hidden')){
			this.moreLink.setAttribute("className",'hidden');
			this.moreLink.setAttribute("class",'hidden');
		}

		this.loadingData = false;
	}
	else
		this.loadingData = false;
	this.reset = false;
}

ZMListManager.prototype.removeElement = function(id){
	var del_elt = document.getElementById(id);
	if(del_elt){
		this.container.removeChild(del_elt);
		this.start--;
		if(this.start<1){
			this.start = 0;
			this.number = this.initialNumber;
			this.query();
		}
	}
}

ZMListManager.prototype.addElement = function(xml_node){
	var div = this.createElement_(xml_node);
	if(div){
	 	if(this.container.hasChildNodes()){
			if(document.getElementById(div.id))
				this.container.replaceChild(div,document.getElementById(div.id));
			else if(this.container.firstChild.id == this.containerNoResId)
				this.container.replaceChild(div,this.container.firstChild);
			else
				this.container.insertBefore(div,this.container.firstChild);
		}
		else
			this.container.appendChild(div);
		this.start++;
	}
}

ZMListManager.prototype.orderBy = function(order){
	var exec = false;
	if(this.formValue.dir && this.formValue.od == order){
		if(this.formValue.dir == 'a')
			this.formValue.dir = 'd';
		else
			this.formValue.dir = 'a';
		exec = true;
	}
	else if(this.formValue.od != order){
		if(this.formValue.dir)
			this.formValue.dir = 'd';
		exec = true;
	}
	if(exec){
		this.reset = true
		this.formValue.od = order;
		this.query();	
	}
}

ZMListManager.prototype.getOrderingCritera = function(){
	return this.formValue.od;
}
ZMListManager.prototype.getOrderingDirection = function(){
	return this.formValue.dir;
}
