var Try = {
  these: function() {
	var returnValue;

	for (var i = 0, length = arguments.length; i < length; i++) {
	  var lambda = arguments[i];
	  try {
		returnValue = lambda();
		break;
	  } catch (e) { }
	}

	return returnValue;
  }
};

function getXMLDom(){
	var tmpXmlDoc = Try.these(
			function(){return document.implementation.createDocument("","",null);},
			function(){return new ActiveXObject("Msxml2.XMLDOM");},
			function(){return new ActiveXObject("Microsoft.XMLDOM");}
		) || false;
	return tmpXmlDoc;
}

//options -- id_num, selectClassName, resultClassName

OneWayXmlParser = function(string, type, options){
	this.startPoint = null;  //xml selector start point
	this.id = "";
	this.selectClassName = "";
	this.resultClassName = "";
	this.selectors = [];
	this.results = [];
	this.target = null;
	this.onchange = function(){};
	//merge options
	if(options.id) this.id = options.id;
	if(options.selectClassName)	this.selectClassName = options.selectClassName;
	if(options.resultClassName) this.resultClassName = options.resultClassName;
	if(options.target) this.setTarget(options.target);
	if(options.onchange) this.onchange = options.onchange;
	
	if(string){this.init(string, type)}
};

OneWayXmlParser.prototype = {
	
	init : function(string, type){
		//get xml dom
		if(type == "file"){
			var xmlDom = getXMLDom();
			xmlDom.async = false;
			xmlDom.load(string);
		} else {
		
		}
		//create selections and results
		var select_options = xmlDom.getElementsByTagName("CONFIG_OPTION")[0].childNodes;
		var result_options = xmlDom.getElementsByTagName("RESULT")[0].childNodes;
		this.startPoint = xmlDom.getElementsByTagName("SELECTOR")[0];
		
		for(var i = 0; i < select_options.length; i++){
			if(select_options[i].nodeType != 3){
				var text = select_options[i].getAttribute("TEXT");
				var title = select_options[i].getAttribute("DESC");
				this.selectors.push(text);
				this[text] = new Object();
				this[text].node = document.createElement("div");
				this[text].node.id = text + '_' + this.id;
				this[text].node.className = this.selectClassName;
				
				this[text].fieldName = document.createElement("div");
				this[text].fieldName.innerHTML = title;
				this[text].node.appendChild(this[text].fieldName);
				
				this[text].select = document.createElement("select");
				this[text].node.appendChild(this[text].select);
				
				var ref = this;
				this[text].select.onchange = function(){ref.changeSelect(this)};
			}
		}

		for(var i = 0; i < result_options.length; i++){
			if(result_options[i].nodeType != 3){
				var text = result_options[i].getAttribute("TEXT");
				var title = result_options[i].getAttribute("DESC");
				this.results.push(text);
				this[text] = new Object();
				this[text].node = document.createElement("div");
				this[text].node.id = text + '_' + this.id;
				this[text].node.className = this.resultClassName;
				
				this[text].fieldName = document.createElement("div");
				this[text].fieldName.innerHTML = title;
				this[text].node.appendChild(this[text].fieldName)
				
				this[text].result = document.createElement("input");
				this[text].result.setAttribute("type", "text");
				this[text].result.readOnly = true;
				this[text].node.appendChild(this[text].result);
			}
		}
		
		this.getOption();
	},
	
	changeSelect : function(node){
		var value = node.value;
		var str = '_' + this.id
		var text = node.parentNode.id.slice(0, node.parentNode.id.length - str.length);
		this.setup(text, value);
		this.onchange();
	},
		
	setTarget : function(target){
		if(typeof target == 'string'){
			this.target = document.getElementById(target);
		} else {
			this.target = target;
		}
		
	},
	
	reset : function(){
		this.resetSelectors();
		this.resetResult(); 
		this.getOption();
		this.onchange();
	},
	
	resetSelectors : function(){
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			this[text].select.innerHTML = "";
			this[text].value = null;
		}
	},
	
	resetResult : function(){
		for(var i = 0; i < this.results.length; i++){
			var text = this.results[i];
			this[text].result.value = "";
			this[text].value = null;
		}	
	},
	
	getOption : function(){
		var locDom = this.startPoint;
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			locDom = locDom.getElementsByTagName(text)[0];
			if(this[text].value){
				var options = locDom.childNodes;
				for(var j = 0; j < options.length; j++){
					if(options[j].nodeType != 3){
						if(this[text].value == options[j].getAttribute("TEXT")){	
							locDom = options[j];
							break;
						}
					}
				}
			} else {
				var options = locDom.childNodes;
				var flag = 0;
				for(var j = 0; j < options.length; j++){
					if(options[j].nodeType != 3){
						var option = document.createElement("option");
						var value = options[j].getAttribute("TEXT");
						option.setAttribute("value", value);
						option.innerHTML = value;
						this[text].select.appendChild(option);
						if(flag == 0){
							locDom = options[j];
							this[text].value = value;
							this[text].select.value = value;
							flag = 1;
						}
					}
				}
			}
		}
		
		for(var i = 0; i < this.results.length; i++){
			var text = this.results[i];
			locDom = locDom.getElementsByTagName(text)[0];
			var options = locDom.childNodes;
			for(var j = 0; j < options.length; j++){
				if(options[j].nodeType != 3){
					var value = options[j].getAttribute("TEXT")
					this[text].value = value;
					this[text].result.value = value;
					locDom = options[j];
				}
			}
		}
	},
	
	setup : function(fieldName, value){
		this[fieldName].value = value;
		this[fieldName].select.value = value;
		var flag = 0;
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			if(flag == 1){
				this[text].select.innerHTML = "";
				this[text].value = null;
			} else {
				if(fieldName == text){
					flag = 1;
				}
			}
		}
		
		for(var i = 0; i < this.results.length; i++){
			var text = this.results[i];
			this[text].result.value = "";
			this[text].value = null;
		}
		this.getOption();
	},
	
	render : function(target){
		this.setTarget(target);
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			this.target.appendChild(this[text].node);
		}
		
		for(var i = 0; i < this.results.length; i++){
			var text = this.results[i];
			this.target.appendChild(this[text].node);
		}
	}
};

TagXmlParser = function(string, type, options){
	this.startPoint = null;  //xml selector start point
	this.id = "";
	this.selectClassName = "";
	this.target = null;
	this.selectors = [];
	this.items = [];
	this.result_items = [];
	this.fieldName = new Object();
	this.onchange = function(){};
	//merge options
	if(options.id) this.id = options.id;
	if(options.selectClassName)	this.selectClassName = options.selectClassName;
	if(options.target) this.setTarget(options.target);
	if(options.onchange) this.onchange = options.onchange;
	
	if(string){this.init(string, type)}
};

TagXmlParser.prototype = {
	
	init : function(string, type){
		//get xml dom
		if(type == "file"){
			var xmlDom = getXMLDom();
			xmlDom.async = false;
			xmlDom.load(string);
		} else {
		
		}
		
		//create selections and results
		var select_options = xmlDom.getElementsByTagName("CONFIG_OPTION")[0].childNodes;
		var result_options = xmlDom.getElementsByTagName("RESULT")[0].childNodes;
		var items = xmlDom.getElementsByTagName("ITEM");
		
		for(var i = 0; i < result_options.length; i++){
			if(result_options[i].nodeType != 3){
				var text = result_options[i].getAttribute("TEXT");
				var title = result_options[i].getAttribute("DESC");
				this.fieldName[text] = title;
			}
		}
		for(var i = 0; i < select_options.length; i++){
			if(select_options[i].nodeType != 3){
				var text = select_options[i].getAttribute("TEXT");
				var title = select_options[i].getAttribute("DESC");
				this.fieldName[text] = title;
			}
		}
		
		for(var i = 0; i < items.length; i++){
			var item = new Object();
			for(k in this.fieldName){
				item[k] = items[i].getAttribute(k)
			}
			this.items.push(item)
		}
		
		for(var i = 0; i < select_options.length; i++){
			if(select_options[i].nodeType != 3){
				var text = select_options[i].getAttribute("TEXT");
				var title = select_options[i].getAttribute("DESC");
				this.selectors.push(text);
				this[text] = new Object();
				this[text].node = document.createElement("div");
				this[text].node.id = text + '_' + this.id;
				this[text].node.className = this.selectClassName;
				
				this[text].fieldName = document.createElement("div");
				this[text].fieldName.innerHTML = title;
				this[text].node.appendChild(this[text].fieldName);
				
				this[text].select = document.createElement("select");
				this[text].node.appendChild(this[text].select);
				
				var insert_options = new Array();
				for(var j = 0; j < this.items.length; j++){
					var item_options = this.items[j][text].split(",");
					for(var k = 0; k < item_options.length; k++){
						var flag = 1;
						for(var l = 0; l < insert_options.length; l++){
							if(item_options[k] == insert_options[l]){
								flag = 0;
								break;
							}
						}
						if(flag == 1){
							insert_options.push(item_options[k]);
						}
					}
				}
				
				var option = document.createElement("option");
				option.innerHTML = "all";
				option.setAttribute("value", "all");
				this[text].select.appendChild(option);
				
				for(var j = 0; j < insert_options.length; j++){
					var option = document.createElement("option");
					option.innerHTML = insert_options[j]
					option.setAttribute("value", insert_options[j]);
					this[text].select.appendChild(option)
				}
				
				var ref = this;
				this[text].select.onchange = function(){ref.changeSelect(this)};
			}
		}
		this.result_items = this.items;
	},

		
	setTarget : function(target){
		if(typeof target == 'string'){
			this.target = document.getElementById(target);
		} else {
			this.target = target;
		}
	},
	
	reset : function(){
		this.resetSelectors();
		this.changeSelect();
	},
	
	searchResultItems : function(){
		this.result_items = [];
		for(var i = 0; i < this.items.length; i++){
			var flag = 1;
			for(var j = 0; j < this.selectors.length; j++){
				var text = this.selectors[j];
				if(this[text].select.value != "all"){
					var options = this.items[i][text].split(",");
					var match = 0
					for(var k = 0; k < options.length; k++){
						if(this[text].select.value == options[k]){
							match = 1;
							break;
						}
					}
					if(match == 0){
						flag = 0;
						break;
					}
				}
			}
			if(flag == 1){
				this.result_items.push(this.items[i]);
			}
		}
	},
	
	changeSelect : function(){
		this.searchResultItems();
		this.onchange();
	},
	
	resetSelectors : function(){
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			this[text].value = "all";
			this[text].select.value = "all";
		}
	},
	
	setup : function(fieldName, value){
		this[fieldName].value = value;
		this[fieldName].select.value = value;
		this.searchResultItems();
	},
	
	render : function(target){
		this.setTarget(target);
		for(var i = 0; i < this.selectors.length; i++){
			var text = this.selectors[i];
			this.target.appendChild(this[text].node);
		}
	}
};

MatchXmlParser = function(string, type){
	if(type == "file"){
		var xmlDom = getXMLDom();
		xmlDom.async = false;
		xmlDom.load(string);
	} else {
	
	}
	var items = xmlDom.getElementsByTagName("ITEM");
	for(var i = 0; i < items.length; i++){
		this[items[i].getAttribute("TEXT")] = items[i].childNodes[0].nodeValue
	}
};

