﻿function populate(xml, divs, urldecode, warning) {
  try {
	  //alert(divs.length);
	  for (i=0; i < divs.length; i++) {
		  //alert('2');
		if (divs[i].hasChildNodes()) {
		  while (divs[i].childNodes.length > 0) {
			  //alert('removing');
			divs[i].removeChild(divs[i].childNodes[0]);
		  };
		};
	  }
	  /*
	  if (divs.hasChildNodes() {
		  while (divs.childNodes.length > 0) {
			divs.removeChild(div.childNodes[0]);
		  };
      };
	  */
	  fields = getFields(divs);
      
	  funcs = getFuncs(divs, warning);
	  populateFields(xml, fields, urldecode, warning);
	  populateFuncs(xml, funcs);
  } catch(e) {
      alert('Populator error: ' + e.message);
  };
};

function populateFuncs(xml, funcs) {

var re_generate;
var div_id;
var result;
var i;
var isdefined;

re_funcs = new RegExp('generate_(.+)');

//alert('enter populateFuncs' + String(funcs.length));
for (i=0; i < this.funcs.length; i++) {
  // call function name as specified in id attribute, passing the xml and the 
  // containing DIV node.
  
  div_value = '';
  
  div_id = funcs[i].getAttribute('id');
  
  if (div_id == null) {
    div_id = '';
  };
  
  if ((result = div_id.match(re_funcs)) != null) {
	div_value = div_id
  } else {
	div_class = funcs[i].className;
    if (div_class == null) {
      div_class = '';
    }; 
	
	if ((result = div_class.match(re_funcs)) != null) {
	  div_value = div_class;	
	};
  };
  
  //var str = div_value + '(xml, funcs[i]);';
  //alert(str);
  eval(div_value + '(xml, funcs[i]);');
};

}

function populateFields(xml, fields, urldecode, warning) {

var xml_path;
var i;
var field_name;
var field_value;
var j;
var node;
var s;

for (i=0; i < this.fields.length; i++) {
	field_name = fields[i].getAttribute('id');
  
  	if ((field_name == '') || (field_name == null)) {
    	field_name = fields[i].className;
  	};
  	re_field = new RegExp('field_(.+)');
  	if ((result = field_name.match(re_field)) != null) {
      	field_name = result[1];
      	var nodes = xml.getElementsByTagName(field_name);
	  	if (nodes.length > 0) {
			node = nodes[0];
	  	} else {
			node = null;
			if (warning) {
				alert('Warning (populateFields): Field ' + field_name + ' not found in XML.');
			};
	  	};
	  	if (node != null) {
			if (urldecode) {
		  		field_value = decode_value(getNodeText(node));
		  		//alert('unescaping');
		  		//alert(field_value);
			} else {
		  		field_value = getNodeText(node);
			};
			if (((fields[i].childNodes.length > 0) && (fields[i].childNodes[0].tagName == 'TEXTAREA')) && (field_value != '')) {
		  		fields[i].childNodes[0].value = field_value;
			} else {
		  		if (field_value != '') {
					//text_node = document.createTextNode(field_value);
					//fields[i].appendChild(text_node);
					fields[i].innerHTML = field_value;
		  		} else {
			 		fields[i].innerHTML = '';
					//text_node = document.createTextNode(' ');
					//fields[i].appendChild(text_node);
		  		};
			};
	  	} else {
			if ((fields[i].childNodes.length > 0) && (fields[i].childNodes[0].tagName == 'TEXTAREA')) {
		  		fields[i].childNodes[0].value = '';
			} else {
				fields[i].innerHTML = '';
			};
		};
	};
};

};

function decode_value(encoded_value) {
  decoded_value = encoded_value.replace(/\+/g, " ");
  decoded_value = unescape(decoded_value);			
  decoded_value = decoded_value.replace(/\<\!\-\-.*?\-\-\>/,"");
  return(decoded_value);
}

function getFields(divs) {

var re_field;
var i;
var div_id;
var div_class;
var div_value;
var result;
var fields = new Array();
var s="";

re_field = new RegExp('field_(.+)');

for (i = 0; i < divs.length; i++) {
  
  div_id = '';
  div_class = '';
  
  div_id = divs[i].getAttribute('id');
  
  if (div_id == null) {
    div_id = '';
  };
  
  if (div_id == '') {
    div_class = divs[i].className;
    if (div_class == null) {
      div_class = '';
    };  
  };
  
  if (div_id != '') {
    div_value = div_id;
  } else if (div_class != '') {
    div_value = div_class;
  } else {
    div_value = '';
  };
  
  if ((result = div_value.match(re_field)) != null) {
    
    // strip the "field_" prefix
	// (for IGLYO: why?)
	/*
    if (div_id != '') {
      divs[i].setAttribute('id', result[1]);
    } else if (div_class != '') {
      divs[i].className = result[1];
    };
    */
	
    fields[fields.length] = divs[i];
  };
};

return(fields);

};
/*

*/
function getFuncs(divs, warning) {

var re_funcs;
var i;
var div_id;
var result;
var funcs = new Array();
var isdefined;

re_funcs = new RegExp('generate_(.+)');
for (i = 0; i < divs.length; i++) {
  div_value = '';
  
  div_id = divs[i].getAttribute('id');
  
  if (div_id == null) {
    div_id = '';
  };
  
  if ((result = div_id.match(re_funcs)) != null) {
	div_value = div_id
  } else {
	div_class = divs[i].className;
    if (div_class == null) {
      div_class = '';
    }; 
	
	if ((result = div_class.match(re_funcs)) != null) {
	  div_value = div_class;	
	};
  };
  
  if (div_value != "") {
	//alert('found function ' + div_value);
    isdefined = eval('(typeof ' + div_value + '==\'function\');'); 
  
    if (!isdefined) {
      if (warning) {
        alert('Warning (getFuncs): Function ' + div_value + ' not defined.');
      };
    } else {     
      funcs[funcs.length] = divs[i];
    };
  };
};

return(funcs);
};
