function Query(){
	this.execute = query_execute;
	this.isComplete = query_is_complete;
	this.addAdminUnits = query_add_admin_units;
	this.addAdminUnit = query_add_admin_unit;
	this.update = query_update;
	this.checkQueryName = query_name_ok;
	this.name = '';
	this.persist = query_persist;
	this.getParameterArray = query_get_params;
	this.getExcel = query_get_excel;
	this.isDirty = false;
}
function query_execute(){
	var params = this.getParameterArray();
	callServerMethod('getQueryResults',params);
}
function query_get_excel(headerStyle){
	var params = this.getParameterArray();
	params.push(new Parameter("header_style",headerStyle));
	callServerMethod('getExcel',params);
}
function query_is_complete(){
	var isComplete = true;
	var headerNames = new Array("year_header","unit_header","measure_header");
	for(var i = 0; i < headerNames.length; i++){
		var header = document.getElementById(headerNames[i]);
		if(header.className.indexOf("no_items") > -1){
			isComplete = false;
			break;
		}
	}
	return isComplete;
}

function query_add_admin_units(cdsArray,cancelNavigation){
	var params = new Array();
	for(var i = 0; i < cdsArray.length; i++){
			params.push(new Parameter('admin_units[]',cdsArray[i]));
	}
	if(cancelNavigation){
		params.push(new Parameter('cancel_nav',1));
	}
	callServerMethod('addAdminUnits',params);
}

function query_add_admin_unit(cds){
	var params = new Array(new Parameter('admin_units[]',cds));
	callServerMethod('addAdminUnits',params);
}

function query_update(){
	if(this.isDirty){
		var params = this.getParameterArray();
		callServerMethod('saveQuery',params);
	}
}

function query_persist(){
	var name = window.prompt("Enter a name for this query",this.name);
	if(name===null){	//user cancelled
		return;
	}
	if(name.length > 0){	//otherwise, don't save, because need a name
		if(name != this.name){
			var nameOK = this.checkQueryName(name);
			if(!nameOK){		//give a chance to enter another name
				this.persist();
				return;
			}
			this.name = name;
			this.storedQueries.push(name);
		}
		//gather the query values
		var params = this.getParameterArray();
		params.push(new Parameter('name',name));
		params.push(new Parameter('action','save'));
		callServerMethod('saveQuery',params);
	}
}

function query_name_ok(name){
	var foundName = false;
	var item;
	for(var i=0;i<this.storedQueries.length;i++){
		if(name==this.storedQueries[i]){
			foundName = true;
			break;
		}
	}
	if(!foundName){	//not a duplicate, so OK
		return true;
	} else {
		var allowDuplicate = window.confirm("Overwrite saved query '" + name + "'?");
		return allowDuplicate;
	}
}
function query_get_params(){
	var params = new Array();
	var querySection = document.getElementById("current_query");
	var lists = querySection.getElementsByTagName("ul");
	var checkbox, list, inputs;
	for(var i = 0; i < lists.length; i++){
		list = lists[i];
		if(list.className == "unit_info"){
			continue;
		}
		var anyChecked = false;
		var varName = list.id + "[]";
		inputs = list.getElementsByTagName("input");
		for(var j = 0; j < inputs.length; j++){
			checkbox = inputs[j];
			if(checkbox.checked){
				params.push(new Parameter(varName,checkbox.value));
				anyChecked = true;
			}
		}
		if(!anyChecked){	//workaround for Opera
			var header = list.previousSibling;
			while(header.tagName != "DIV"){
				header = header.previousSibling;
			}
			if(header.className.indexOf("no_items") == -1){
				var items = list.getElementsByTagName("li");
				for(var k=0; k < items.length; k++){
					items[k].style.display = "block";
				}
				for(var j = 0; j < inputs.length; j++){
					checkbox = inputs[j];
					if(checkbox.checked){
						params.push(new Parameter(varName,checkbox.value));
					}
				}
				for(var k=0; k < items.length; k++){
					items[k].style.display = "none";
				}
			}
		}
	}
	return params;
}

var currentQuery = new Query();