
function MulticriteriaQuery(setId,templateId) {
	this.setId = setId;
	this.templateId = templateId;
	this.criteria = new Array();
	this.orders = new Array();
	this.pagination = { pageDefinition : 0 , page : 0 }
	this.selectedContents = {};
	return this;
}

MulticriteriaQuery.prototype.setPage = function(page) {
	this.pagination.page = page;
}
MulticriteriaQuery.prototype.setPageDefinition = function(definition) {
	this.pagination.pageDefinition = definition;
}
MulticriteriaQuery.prototype.addCriterion = function(criterion) {
	this.criteria.push(criterion);
}

MulticriteriaQuery.prototype.addOrderBy = function(orderBy) {
	this.orders.push(orderBy);
}

MulticriteriaQuery.prototype.selected = function(id,selected) {
	this.selectedContents[id] = selected;	
}



MulticriteriaQuery.prototype.getSelectedItems = function() {
	var ret = new Array();
	for(var i in this.selectedContents ) {
		if( this.selectedContents[i] == true ) {
			ret.push(i)
		}
	}
	return ret;
}

MulticriteriaQuery.prototype.getQueryParameters = function() {
	parameters = new AjaxQueryParameters(this.setId);
	for(var x =0 ; x < this.criteria.length; x++ ) {
		var criterion = this.criteria[x];
		parameters.criterionParameters.push(criterion.getParameter());		
	}
	
	for(var x =0 ; x < this.orders.length; x++ ) {
		var orderBy = this.orders[x];
		parameters.orderByParameters.push( orderBy.getParameter());		
	}	
	
	parameters.paginationParameter.setDefinition(this.pagination.pageDefinition );
	parameters.paginationParameter.setPage(this.pagination.page );
		
	return parameters;
}

MulticriteriaQuery.prototype.bind = function() {
	for( var x =0; x < this.criteria.length; x++ ) {
		criterion = this.criteria[x];
		criterion.bind();		
	}	
	
		
	for(var x =0 ; x < this.orders.length; x++ ) {
		var orderBy = this.orders[x];
		orderBy.bind();
	}
}


function BoundaryCriterion(criterionId,minId,maxId,min,max) {
	this.criterionId = criterionId;
	this.minId = minId;
	this.maxId = maxId;
	this.min = min;
	this.max = max;
	this.minElement = null;
	this.maxElement = null;
	return this;	
}

BoundaryCriterion.prototype.bind = function() {
	this.minElement = document.getElementById(this.minId);
	this.maxElement = document.getElementById(this.maxId);
	
	var f =  function() {
		this.criterion.valuesChanged();
	}
	
	this.minElement.criterion = this;
	this.minElement.valuesChanged = f;
	this.maxElement.criterion = this;
	this.maxElement.valuesChanged = f;
	
}

BoundaryCriterion.prototype.valuesChanged = function() {
	this.min = this.minElement["value"];
	this.max = this.maxElement["value"];
}

BoundaryCriterion.prototype.getParameter = function () {
	return new AjaxBoundaryParameter(this.criterionId,this.max,this.min);
}


function ChoiceCriterion(criterionId,lchoices) {
	this.criterionId = criterionId;
	this.choices = new Array();
	for( var x =0; x < lchoices.length; x++ ) {
		var choice = lchoices[x];
		this.choices.push( new ChoiceValueCriterion(choice.id,choice.valueId,choice.checked) );
	}
	return this;
}

ChoiceCriterion.prototype.bind = function() {
	for( var x =0; x < this.choices.length; x++ ) {
		choice = this.choices[x];
		choice.bind();
	}
}

ChoiceCriterion.prototype.getParameter = function() {
	var values = new Array();
	for( var x =0 ; x < this.choices.length; x++ ) {
		choice = this.choices[x];
		if( choice.active == true ) {
			values.push( choice.valueId );
		}
	}
	
	return new AjaxChoiceParameter(this.criterionId,values);
}


function ChoiceValueCriterion(id,valueId,checked) {
	this.id = id;
	this.valueId = valueId;
	this.inputElement = null;
	this.active = checked;
	return this;
	
}

ChoiceValueCriterion.prototype.bind = function() {
	this.inputElement = document.getElementById( this.id );
	if( this.inputElement == null ) {
//	 alert("input not found "+this.id+" valueId "+this.valueId);
	} else {
		this.inputElement.criterion = this;
		this.inputElement.selected =  function( v ) {
			this.criterion.selected(v);
		}
		
	}
}

ChoiceValueCriterion.prototype.selected = function(selected) {
	this.active = selected;
}


function BooleanCriterion(criterionId,elementId,enabled) {
	this.criterionId = criterionId;
	this.elementId = elementId;
	this.enabled = enabled;
	return this;
	
}

BooleanCriterion.prototype.bind = function() {
	this.element = document.getElementById(this.elementId);
	this.element.setEnabled =  function( v ) {
			this.criterion.setEnabled(v);
		}
	this.element.criterion = this;
}

BooleanCriterion.prototype.setEnabled = function(enabled) {
	this.enabled = enabled;
}

BooleanCriterion.prototype.getParameter = function() {
	return new AjaxBooleanParameter(this.criterionId,this.enabled);
}


function OrderBy(sortId,elementId,ascendant,enabled) {
	this.sortId = sortId;
	this.elementId = elementId;
	this.ascendant = ascendant;
	this.enabled = enabled;
	this.element = null;
	return this;
	
}


OrderBy.prototype.bind = function() {
	this.element = document.getElementById(this.elementId);
	if( this.element != null ) {
	
		this.element.changeOrder = function() {
			this.orderBy.change();
		}
		this.element.setEnabled =  function( v ) {
			this.orderBy.setEnabled(v);
		}
		
		this.element.setAscendant = function(v) {
			this.orderBySet.setAscendant(v);
		}
		this.element.orderBy = this;
	}
}

OrderBy.prototype.setEnabled = function(enabled) {
	this.enabled = enabled;
}

OrderBy.prototype.setAscendant = function(ascendant) {
	this.ascendant = ascendant;
}

OrderBy.prototype.change = function() {
	if( this.enabled ) {
		if( this.ascendant == false) {
			this.enabled = false;
			this.ascendant = false
		} else {
			this.ascendant = false;
		}
	} else {
		this.enabled = true;
		this.ascendant = true;
	}
}

OrderBy.prototype.getParameter = function() {
	return new AjaxOrderByParameter(this.sortId,this.ascendant,this.enabled );
}

function MulticriteriaQuerySetUtils() {
	this.queryParameters = {}; 
	return this;
}

var multicriteriaQuerySetUtils = new MulticriteriaQuerySetUtils();


MulticriteriaQuerySetUtils.prototype.getCriterionParameter = function( setId, paramId )
{
	var queryParams = this.getQueryParameters(setId);
	return queryParams.getCriterionParameterById( paramId );
}

MulticriteriaQuerySetUtils.prototype.getQueryParameters = function( setId) {
	
	var queryParams = this.queryParameters[setId];
	if( queryParams == null ) {
		queryParams = new AjaxQueryParameters(setId);
		this.queryParameters[setId] = set;
	}
	
	return queryParams;
}

function updateZones(zones) {
	 for(var i =0 ; i < zones.length ;i++) { 
    	zone = zones[i];
    	updateZone(zone);
    	    	
  	}
}

function mqsExecuteJS(elementId) {
   // fix IE bug, e == null ?! message 'null' is null or not an object
   var e = document.getElementById(elementId);
   var scripts = e.getElementsByTagName("script"); 
   for( var i =0 ; i < scripts.length; i++) {
	var ih = scripts[i].innerHTML;
         if(ih &&  ih.indexOf('document.write') == -1 ) {
			try {   eval(ih); } catch(e) {}
         } else {
            // debug("javascript contains document.write "+scripts[i].innerHTML);
         }
   }
}

function updateZone(zone) {
   	dwr.util.setValue(zone["zoneId"],zone["content"],{ escapeHtml:false });
   	mqsExecuteJS(zone["zoneId"]);
}

function AjaxQueryParameters() {
	this.criterionParameters = new Array();
	this.paginationParameter = new AjaxPaginationParameter();
	this.orderByParameters = new Array();
	return this;
}

AjaxQueryParameters.prototype.addBoundaryParameter = function(parameterId,up,down)
{
	var c = new AjaxBoundaryParameter(parameterId,up,down);
	this.criterionParameters.push( c ); 
}

AjaxQueryParameters.prototype.addChoiceParameter = function(parameterId, selectedValues)
{
	var c = new AjaxChoiceParameter(parameterId,selectedValues);
	this.criterionParameters.push( c ); 
}


AjaxQueryParameters.prototype.addBooleanParameter = function ( id, enabled ) {
	this.criterionParameters.push( new AjaxBooleanParameter( id,enabled ));
}

AjaxQueryParameters.prototype.getCriterionParameter = function( i )
{
	return this.criterionParameters.get(i);
}

AjaxQueryParameters.prototype.getCriterionParameterById  = function ( id )
{
	for( var i =0; i < this.criterionParameters.length; i++ ) {
		if( this.criterionParameters[i].parameterId == id ) {
			return this.criterionParameters[i];
		}
	}
	
	return null;
}

AjaxQueryParameters.prototype.getOrderByParameterById  = function ( id )
{
	for( var i =0 ; i < this.orderByParameters.length; i++ ) {
		if( this.orderByParameters[i].sortId == id ) {
			return this.orderByParameters[i];
		}
	}
	
	return null;
}

AjaxQueryParameters.prototype.addOrderByParameter = function ( sortId, ascendant,enabled ) {
	this.orderByParameters.push( new AjaxOrderByParameter( sortId,ascendant,enabled ));
}


function AjaxPaginationParameter()
{
	this.page = 0;
	this.definition = 0;
	return this;
}

AjaxPaginationParameter.prototype.setPage = function(page) {
	this.page = page;
}

AjaxPaginationParameter.prototype.setDefinition = function(definition) {
	this.definition = definition;
}

function AjaxOrderByParameter(sortId,ascendant,enabled )
{
	this.sortId = sortId;
	this.ascendant = ascendant;
	this.enabled = enabled;
	return this;
}

AjaxOrderByParameter.prototype.setEnabled = function( enabled ) {
	this.enabled = enabled;
}

AjaxOrderByParameter.prototype.setAscendant = function( ascendant ) {
	this.ascendant = ascendant;
}


function AjaxChoiceParameter(parameterId,selectedValues) {
	this.parameterId = parameterId;
	this.type = 'bound'
	this.parameters = { };
	for( var i = 0; i < selectedValues.length; i++ ) {
	  this.parameters[ selectedValues[i] ] = "on";
	}
	return this;
}

AjaxChoiceParameter.prototype.addChoiceValue = function ( value ) {
	  this.parameters[ value ] = "on";
}

AjaxChoiceParameter.prototype.removeChoiceValue = function ( value ) {
	  this.parameters[ value ] = null;
}

function AjaxBoundaryParameter(parameterId,up,down )
{
	this.parameterId = parameterId;
	this.parameters = {};
	this.parameters["boundaryUp"] = up;
	this.parameters["boundaryDown"] = down;
	return this;
}

AjaxBoundaryParameter.prototype.setBoundaryUp = function(up) {
	this.parameters["boundaryUp"] = up;
}

AjaxBoundaryParameter.prototype.setBoundaryDown = function(down) {
	this.parameters["boundaryDown"] = down;
}

function AjaxBooleanParameter(parameterId,enabled ) {
	this.parameterId = parameterId;
	this.parameters = {};
	this.parameters.enabled = enabled;
	return this;
}

AjaxBooleanParameter.prototype.setEnabled = function( enabled ) {
	this.parameters.enabled = enabled;
}
