//___________________________________________________________________
function CompoundedProperty(property_str,label_str,compoundManager,editAuth){
	
	var self				= this;
	var value_str			= '';
	var defaultValue_str	= '';
	
	var broadcaster			= new Broadcaster(this);
	broadcaster.createEventType('valueChange');
	
	compoundManager.addEventListener('update',handlePropertyUpdate);
	
	this.__defineGetter__('label',function(){return label_str;});
	this.__defineGetter__('value',getValue);
	this.__defineSetter__('value',setValue);
	
	//---------------------------------------------------------------
	function getValue(){
		
		var value_str		= compoundManager.getPropertyValue(property_str);
		value_str			= value_str? value_str : defaultValue_str;
		return value_str;
	};
	//---------------------------------------------------------------
	function handlePropertyUpdate(){
		
		var newValue_str		= compoundManager.getPropertyValue(property_str);
		if(value_str != newValue_str){
			value_str			= newValue_str;
			broadcaster.triggerEvent('valueChange');
		}
	};
	//---------------------------------------------------------------
	function setValue(newValue_str){
		
		compoundManager.setPropertyValue(property_str,newValue_str);
	};
	//_______________________________________________________________
	this.setDefaultValue = function(value_str){
		
		defaultValue_str		= value_str;
	};
	//_______________________________________________________________
	this.bindValueToAttribute = function(element_h,attribute_str){
		
		
		// define a function to update element_h upon change in Property.value
		// replace line breaks with <br /> tags
		var refreshElement	= function(){element_h.setAttribute(attribute_str,self.value);};
		refreshElement();
		
		// execute function on value change
		this.addEventListener('valueChange',refreshElement);
	};
	//_______________________________________________________________
	this.bindValueToInnerHTML = function(element_h){
		
		// define a function to update element_h upon change in Property.value
		// replace line breaks with <br /> tags
		var refreshElement	= function(){element_h.innerHTML = self.value.replace(/\n/g,'<br />');};//'
		refreshElement();
		
		// execute function on value change
		this.addEventListener('valueChange',refreshElement);
	};
	//________________________________________________________________
	this.bindValueToInput = function(input_h){
		
		// define functions to bind values between input_h and Property
		//------------------------------------------------------------
		function refreshInputValue(){
			
			if(input_h.value != self.value){
				input_h.value	= self.value;
			}
		};
		//------------------------------------------------------------
		function refreshInputAttributes(){
			
			input_h.disabled= !editAuth.valid;
		};
		//------------------------------------------------------------
		function takeInputValue(){
			
			self.value 		= input_h.value;
		};
		//------------------------------------------------------------
		refreshInputAttributes();
		refreshInputValue();
		
		// add parentObj listeners that will trigger value syncing
		this.addEventListener('valueChange',refreshInputValue);
		editAuth.addEventListener('validate',refreshInputAttributes);
		editAuth.addEventListener('invalidate',refreshInputAttributes);
		input_h.addEventListener('valueChange',takeInputValue,false);
		input_h.addEventListener('keyup',takeInputValue,false);
	};
};	//________________________________________________________________
//___________________________________________________________________
function CompoundPropertyManager(property,xEvent,xEventEditAuth){
	
	var self				= this;
	var descriptionDiv_h;
	
	var broadcaster			= new Broadcaster(this);
	broadcaster.createEventType('update');
	broadcaster.createEventType('reset');
	
	var properties_xdoc		= createRootXDoc();
		
	xEvent.addEventListener('dataLoad',initialiseCompound);
	xEvent.addEventListener('reset',initialiseCompound);
	property.addEventListener('valueChange',initialiseCompound);
	
	//---------------------------------------------------------------
	function createRootXDoc(){
	
		return document.implementation.createDocument('','properties',null);
	};
	//---------------------------------------------------------------
	function initialiseCompound(){
		
		// parse properties from price string
		properties_xdoc		= stringToXML(property.value);
		broadcaster.triggerEvent('update');
	};
	//---------------------------------------------------------------
	function updateCompoundValue(){
		
		property.value 		= xmlToString(properties_xdoc);
	};
	//---------------------------------------------------------------
	function xmlToString(data_xdoc){
	
		var xml_str			= data_xdoc.firstChild.saveXML();
		xml_str				= xml_str.replace(/</g,'{');
		xml_str				= xml_str.replace(/>/g,'}');
		xml_str				= xml_str.replace(/({\/[^}]*})/g,"$1 ");
		return xml_str;
	};
	//---------------------------------------------------------------
	function stringToXML(xml_str){
		
		xml_str				= xml_str.replace(/{/g,'<');
		xml_str				= xml_str.replace(/}/g,'>');
		var parser			= new DOMParser();
		var xml_xdoc		= parser.parseFromString(xml_str,'text/xml');
		if(xml_xdoc && xml_xdoc.firstChild.tagName!='properties'){
			xml_xdoc		= null;
		}
		xml_xdoc			= xml_xdoc? xml_xdoc : createRootXDoc();
		
		return xml_xdoc;
	};
	//---------------------------------------------------------------
	function getPropertyNode(property_str){
		
		var property_xml 	= properties_xdoc.firstChild.xPathQuery(property_str,'firstNode');
		if(!property_xml){
			property_xml 	= properties_xdoc.firstChild.createChild(property_str);
		}
		return property_xml;
	};
	//_______________________________________________________________
	this.setPropertyValue = function(property_str,newValue_str){
		
		var property_xml			= getPropertyNode(property_str);
		property_xml.textContent 	= newValue_str;
		updateCompoundValue();
	};
	//_______________________________________________________________
	this.getPropertyValue = function(property_str){

		var property_xml 	= getPropertyNode(property_str);
		return property_xml.textContent;
	};
};	//_______________________________________________________________
//___________________________________________________________________