/*
 * ID         : $Id: afs-url.js,v 1.4 2008-06-23 15:17:59 mo Exp $
 * Description: Traitement des URLs
 * Auteur     : mo
 * Creation   : 2008-06-12 16:47:22
 * Version    : $Revision: 1.4 $
 * Historique : $Log: afs-url.js,v $
 * Historique : Revision 1.4  2008-06-23 15:17:59  mo
 */

if (!this.AFSF) {
  AFSF = new function() {
	function encodeValue(value) {
	  return value.replace('/\\\\/g', '\\\\').replace('/"/g', '\"').replace('/\n/g', '\\n');
	}

	var result ;

	function processCheckboxInput(form, checkboxes, query)
	{
	  var a = [] ;
		
	  var values = [];
	  var name = checkboxes[0].name;
	  for (var i = 0 ; i < checkboxes.length ; ++i) {
		var checkbox = checkboxes[i];
		if (checkbox.checked) {
		  var value = checkbox.value;
		  addHidden(form, 'afsf:' + name, value);

		  var type = checkbox.getAttribute('afsf:type');
		  
		  if (checkbox.getAttributeNode('afsf:filter') != null) {
			var cond = checkbox.getAttribute('afsf:filter');
			if (type == 'string') {
			  a[a.length] = cond.replace(/##/g, encodeValue(value));
			}
			else {
			  a[a.length] = cond.replace(/##/g, value);
			}
		  }

		  else {
			var type = checkbox.getAttribute('afsf:type');
			if (type == 'string') {
			  value = '"' + encodeValue(value) + '"';
			}
			values[values.length] = value;
		  }
		}
	  }

	  if (values.length > 0) {
		var names = name.split(',');
		for (var i = 0 ; i < names.length ; ++i) {
		  a[a.length] = names[i] + ' in {' + values.join(',') + '}';
		}
	  }

	  if (a.length == 1) {
		query[query.length] = a[0];
	  }
	  else if (a.length > 1) {
		query[query.length] = '(' + a.join(') or (') + ')';
	  }
	}
	
	function processRadioInput(form, radios, query)
	{
	  for (var i = 0 ; i < radios.length ; ++i) {
		var radio = radios[i];
		if (radio.checked) {
		  var value = radio.value;
		  var name = radio.name;
		  addHidden(form, 'afsf:' + name, value);
		  
		  var type = radio.getAttribute('afsf:type');
		  if (type == 'string') {
			value = encodeValue(value);
		  }
		  
		  if (radio.getAttributeNode('afsf:filter') != null) {
			var cond = radio.getAttribute('afsf:filter');
			query[query.length] = cond.replace(/##/g, value);
		  }
		  
		  else {
			var names = name.split(',');
			var a = [] ;
			for (var i = 0 ; i < names.length ; ++i) {
			  if (type == 'string') {
				a[a.length] = names[i] + ' =  "' + value + '"';
			  }
			  else {
				a[a.length] = names[i] + ' = ' + value;
			  }
			}
		  }
		  
		  if (a.length == 1) {
			query[query.length] = a[0];
		  }
		  else if (a.length > 1) {
			query[query.length] = '(' + a.join(') or (') + ')';
		  }
		  break;
		}
	  }
	}
	
	function processTextInput(form, text, query)
	{
	  var value = text.value;
	  if (value != '') {
		var name = text.name;
		
		addHidden(form, 'afsf:' + name, value);
		
		var type = text.getAttribute('afsf:type');
		if (type == 'string') {
		  value = encodeValue(value);
		}
		
		if (text.getAttributeNode('afsf:filter') != null) {
		  var cond = text.getAttribute('afsf:filter');
		  query[query.length] = cond.replace(/##/g, value);
		}
		
		else {
		  var names = name.split(',');
		  var a = [] ;
		  for (var i = 0 ; i < names.length ; ++i) {
			if (type == 'string') {
			  a[a.length] = names[i] + ' like "%' + value + '%"';
			}
			else {
			  a[a.length] = names[i] + ' = ' + value;
			}
		  }
		  
		  if (a.length == 1) {
			query[query.length] = a[0];
		  }
		  else if (a.length > 1) {
			query[query.length] = '(' + a.join(') or (') + ')';
		  }
		}
	  }
	}

	function processMultipleSelect(form, select, query)
	{
	  var a = [] ;
		
	  var values = [];
	  var name = select.name;
	  var type = select.getAttribute('afsf:type');
	  for (var i = 0 ; i < select.options.length ; ++i) {
		var option = select.options[i];
		if (option.selected && option.getAttributeNode('value') != null) {
		  var value = option.value;
		  addHidden(form, 'afsf:' + name, value);

		  if (option.getAttributeNode('afsf:filter') != null) {
			var cond = option.getAttribute('afsf:filter');
			if (type == 'string') {
			  a[a.length] = cond.replace(/##/g, encodeValue(value));
			}
			else {
			  a[a.length] = cond.replace(/##/g, value);
			}
		  }

		  else {
			if (type == 'string') {
			  value = '"' + encodeValue(value) + '"';
			}
			values[values.length] = value;
		  }
		}
	  }

	  if (values.length > 0) {
		var names = name.split(',');
		for (var i = 0 ; i < names.length ; ++i) {
		  a[a.length] = names[i] + ' in {' + values.join(',') + '}';
		}
	  }
	  
	  if (a.length == 1) {
		query[query.length] = a[0];
	  }
	  else if (a.length > 1) {
		query[query.length] = '(' + a.join(') or (') + ')';
	  }
	}

	function processSingleSelect(form, select, query)
	{
	  if (select.selectedIndex == -1) {
		return;
	  }
	  var option = select.options[select.selectedIndex];
	  if (option.getAttributeNode('value') != null) {
		var value = option.value;
		var name = select.name;
		addHidden(form, 'afsf:' + name, value);
		
		var type = select.getAttribute('afsf:type');
		if (type == 'string') {
		  value = encodeValue(value);
		}
		
		if (option.getAttributeNode('afsf:filter') != null) {
		  var cond = option.getAttribute('afsf:filter');
		  query[query.length] = cond.replace(/##/g, value);
		}
		
		else {
		  var names = name.split(',');
		  var a = [] ;
		  for (var i = 0 ; i < names.length ; ++i) {
			if (type == 'string') {
			  a[a.length] = names[i] + ' = "' + value + '"';
			}
			else {
			  a[a.length] = names[i] + ' = ' + value;
			}
		  }
		}
		
		if (a.length == 1) {
		  query[query.length] = a[0];
		}
		else if (a.length > 1) {
		  query[query.length] = '(' + a.join(') or (') + ')';
		}
	  }
	}
	
	function extract(form, query)
	{
	  var filters = {} ;
	  var inputs = form.getElementsByTagName('input');
	  for (var i = 0 ; i < inputs.length ; ++i) {
		var input = inputs[i];
		var name = input.name ;
		if (!(name && (input.getAttributeNode('afsf:type') != null)) || input.disabled) {
		  continue;
		}
		var filter = filters[name];
		if (!filter) {
		  filter = [];
		  filters[name] = filter;
		}
		filter[filter.length] = input;
		input.disabled = true;
	  }

	  var selects = form.getElementsByTagName('select');
	  for (var i = 0 ; i < selects.length ; ++i) {
		var select = selects[i];
		var name = select.name ;
		if (!(name && select.getAttributeNode('afsf:type')) != null || select.disabled) {
		  continue;
		}
		var filter = filters[name];
		if (!filter) {
		  filter = [];
		  filters[name] = filter;
		}
		filter[filter.length] = select;
		select.disabled = true;
	  }

	  for (var name in filters) {
		var filter = filters[name];
		var first = filter[0];
		if (first.nodeName.toLowerCase() == 'input') {
		  switch (first.type.toLowerCase()) {
		    case 'checkbox':
			  processCheckboxInput(form, filter, query);
			  break;
			  
		    case 'radio':
			  processRadioInput(form, filter, query);
			  break;
			
		    case 'text':
		    case 'hidden':
			  processTextInput(form, first, query);
			  break;
		  }
		}
		else if (first.multiple) {
		  processMultipleSelect(form, first, query);
		}
		else {
		  processSingleSelect(form, first, query);
		}
	  }
	}
	
	function addHidden(form, name, value) {
	  var h = document.createElement('input');
	  h.type = 'hidden';
	  h.name = name;
	  h.value = value;
	  form.appendChild(h);
	}
	
	function createHiddens(filters, form) {
	  var query = '(';
	  for (var name in filters) {
		var value = filters[name];
		if (query.length != 1) {
		  query += ') and (';
		}
		
		query += createOneFilter(name, value.enc, value.keywords);
		
		if (typeof(value.raw) == 'object') {
		  for (var i = 0 ; i < value.raw.length ; ++i) {
			addHidden(form, 'afsf:' + name, value.raw[i]);
		  }
		}
		else {
		  addHidden(form, 'afsf:' + name, value.raw);
		}
	  }
	  
	  if (query.length != 1) {
		addHidden(form, 'afs:filter', query + ')');
	  }
	}
	
	this.fromForm = function(form) {
	  try {
		var query = [];
		extract(form, query);
		if (query.length == 1) {
		  addHidden(form, 'afs:filter', query);
		}
		else if (query.length > 1) {
		  addHidden(form, 'afs:filter', '(' + query.join(') and (') + ')');
		}
	  }
	  catch (err) {
		window.setTimeout(function () { throw err; }, 0);
		return false;
	  }
	  return true;
	}
  };
 }
