function resetStatus(){
	showMsg("","green");
}

function showMsg(msg,color){
     $("#node-validate-result").html(msg);
     $("#node-validate-result")
	 			.css('color', '')
    				.css('color', color);
}

function getAttributeValue(xmlStr,attribute){

	var attrVal=null;
	try{
		if(xmlStr != null){
			var myRe = new RegExp(attribute + "[\s+]?=[\s+]?['\"]([^'\"]+)['\"]","m");
			var myArray = myRe.exec(xmlStr);
			if(myArray != null && myArray[1] != null){
				attrVal=myArray[1];
			}
		}
	}catch(err){
		console.log(err);
	}
	return attrVal;
}


var resp = true;
var processedNode = "";
var errList=[];
var elementCount=0;
function processNode(xmlNode){
	if(xmlNode == null) return;
	if(xmlNode.nodeName != "parsererror" && xmlNode.nodeName != "#text"){
			processedNode = xmlNode.nodeName;
	}
	//console.log("processedNode:" + processedNode);
	switch(xmlNode.nodeType){
		case 1:
			elementCount++;
	       		//ELEMENT_NODE
			//console.log(xmlNode.nodeName);
			//console.dir(xmlNode.nodeName);
			if(xmlNode.nodeName == "parsererror"){
				//var nearNode = xmlNode.previousSibling != null ?xmlNode.previousSibling.nodeName : xmlNode.parentNode.nodeName;
				console.log("Error parsing xml after node " + processedNode);
				var msg = "error parsing XML after element <" + processedNode + "> Element#" + elementCount;
				errList.push(msg);
				resp = false;
				return;
			}	
			processedNode = xmlNode.nodeName;
			var attrs = xmlNode.attributes;
			for(var i=0;i<attrs.length;i++){
				//console.log("Attribute:" + attrs[i].nodeName);
				//console.log("Value:" + attrs[i].value);
				if(attrs[i].nodeName != "value" && attrs[i].value == ""){
					var msg="";
					/*
					var prevSibling = xmlNode.previousSibling;
					if(prevSibling != null && prevSibling != undefined){
						msg = "element &lt;" + xmlNode.nodeName  + "&gt; attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount;
					}else{
						msg = "element &lt;" + xmlNode.nodeName  + "&gt; attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount;
					}
					*/
					msg = "element &lt;" + xmlNode.nodeName  + "&gt; attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount;
					errList.push(msg);
					//console.log("element <" +  xmlNode.nodeName + "> attribute '" + attrs[i].nodeName + "' is not set.Element#" + elementCount);
					resp = false;
				}
			}
			var childNodes = xmlNode.childNodes;
			for(var k=0;k<childNodes.length;k++){
				processNode(childNodes[k]);
			}
			break;
		case 2:
			//ATTRIBUTE_NODE
			//console.log(xmlNode.nodeName);
			break;
		case 3:
			//TEXT_NODE
			//console.log(xmlNode.nodeValue);
			break;
		case 4:
			//CDATA_SECTION_NODE
			console.log("CDATA_SECTION_NODE");
			break;
		case 5:
			//ENTITY_REFERENCE_NODE
			console.log("ENTITY_REFERENCE_NODE");
			break;
		case 6:
			//ENTITY_NODE
			console.log("ENTITY_NODE");
			break;
		case 7:
			//PROCESSING_INSTRUCTION_NODE
			console.log("PROCESSING_INSTRUCTION_NODE");
			break;
		case 8:
			//COMMENT_NODE
			console.log("COMMENT_NODE");
			break;
		case 9:
			//DOCUMENT_NODE
			console.log("DOCUMENT_NODE");
			break;
		case 10:
			//DOCUMENT_TYPE_NODE
			console.log("DOCUMENT_TYPE_NODE");
			break;
		case 11:
			//DOCUMENT_TYPE_NODE
			console.log("DOCUMENT_FRAGMENT_NODE");
			break;
		case 12:
			//NOTATION_NODE
			console.log("DOCUMENT_FRAGMENT_NODE");
			break;
	}
}

function validateFinalXML(xmlStr){

	//console.dir(RED);
	processedNode="";
	resp=true;
	errList=[];
	elementCount=0;
	//console.log("In validateXML xmlStr:" + xmlStr);
	if(xmlStr == null || xmlStr == "") return true;
	xmlStr = xmlStr.trim();
	try{
		var xmlDoc;
         	if (window.DOMParser){
			try{
            			var parser=new DOMParser();
            			xmlDoc=parser.parseFromString(xmlStr,'text/xml');
				//console.log("Not IE");
				var n = xmlDoc.documentElement.nodeName;
				if(n == "html"){
					resp=false;
					console.log("Error parsing");
					return resp;
				}
			}catch(e){
				console.log("Error parsing" +e);
				return false;
			}
         	}else{ 
			try{
				//console.log("IE");
	    			// code for IE
            			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
            			xmlDoc.async=false;
            			xmlDoc.loadXMLString(xmlStr); 
			}catch(e){
				console.log("Error parsing" +e);
				return false;
			}
        	} 

		//console.dir(xmlDoc);
		processNode(xmlDoc.documentElement);
		
		if(resp){
			console.log("Validation Successful");
			RED.notify("<strong>XML validation</strong>: SUCCESS","success");
		}else{
			console.log("Errors found. ");
			RED.notify("<strong>XML validation</strong>: FAILED","error");
		}
	}catch(e){
		console.log("error:" +e);
		RED.notify("<strong>XML validation</strong>: FAILED","error");
		resp=false;
		return resp;
	}
	return resp;
}

function validateXML(xmlStr){

	//console.dir(RED);
	processedNode="";
	resp=true;
	errList=[];
	elementCount=0;
	//console.log("In validateXML xmlStr:" + xmlStr);
        //var xmlStr = $("#node-input-xml-editor").text();
	if(xmlStr == null || xmlStr == undefined){
        	xmlStr = $("#node-input-xml-editor").text();
	}
	if(xmlStr == undefined) return false;
	//console.dir($("#node-input-xml-editor"));
	//console.log("xmlStr:" +  xmlStr);
	xmlStr = xmlStr.trim();
	var startTag ;
	var endTag ;
	try{
		var re = /^[0-9]+/;
		xmlStr = xmlStr.replace(re,'');
		var regex = /(<)([\w-]+)(.*)?/;
		var match = regex.exec(xmlStr);
		if(match != null){
			if(match[1] != undefined && match[2] != undefined){ 
	   			startTag = match[2];
			}
		}else{
			resp=false;
			showMsg("startTag not found.","red");
			return resp;
		}
	}catch(e){
		console.log(e);
		return false;
	}
	//console.log(xmlStr);	
	if(xmlStr == ""){
		resp=false;
		showMsg("XML not found","red");
		return resp;
	}
	endTag = "</" + startTag + ">";

	if(xmlStr.indexOf(endTag) != -1){
		resp=false;
		showMsg("Error: End tag &lt;/" + startTag + "&gt; must not be included.","red");
		console.log("End tag " + endTag + " must not be included.");
		return resp;
	}
	try{
		//var xmlTopStr = "<?xml version='1.0' encoding='UTF-8'?>\n" ;
		//xmlStr = xmlTopStr + xmlStr;
		//xmlStr = xmlStr.replace(/'/g,"\"");
		xmlStr+= "\n" +  endTag;
		xmlStr = xmlStr.trim();
		//console.log("xmlStr:" + xmlStr);
		var xmlDoc;
         	if (window.DOMParser){
			try{
            			var parser=new DOMParser();
            			xmlDoc=parser.parseFromString(xmlStr,'text/xml');
				//console.log("Not IE");
				var n = xmlDoc.documentElement.nodeName;
				if(n == "html"){
					resp=false;
					showMsg("Error parsing","red");
					console.log("Error parsing");
					return resp;
				}
			}catch(e){
				console.log("Error parsing" +e);
				return false;
			}
         	}else{ 
			try{
				//console.log("IE");
	    			// code for IE
            			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
            			xmlDoc.async=false;
            			xmlDoc.loadXMLString(xmlStr); 
			}catch(e){
				console.log("Error parsing" +e);
				return false;
			}
        	} 

		//console.dir(xmlDoc);
		processNode(xmlDoc.documentElement);
		if(resp){
			showMsg("Validation Successful","green");
		}else{
			showMsg("Errors found. <a onclick='javascript:showErrors()'>show errors</a>","red");
			console.log("Errors found. ");
		}
	}catch(e){
		console.log("error:" +e);
		showMsg(e,"red");
		resp=false;
		return resp;
	}
	return resp;
}

function showErrors() {
                //var sourceField = event != null ?event.srcElement:event.target;
                //console.dir(sourceField);
                //sourceField.style.backgroundColor="skyblue";
                //var leftVal = event.target.offsetLeft  ; 
                //alert(topVal + ":" + leftVal);
                /*left:leftVal,*/
                //var pos = event.target;
                //var topVal = event.target.offsetTop + topPosition ;
                //var topVal = event.target.offsetTop +75;
		var htmlStr="<div id='error-list-div'><table id='errTable' border='1'><tr><th>Error List</th></tr>";	
		for(var i=0;errList != null && i<errList.length;i++){
			var errSeq = i+1;
			htmlStr += "<tr><td>" + errSeq + ")"  + errList[i] + "</td></tr>"; 
		}
		htmlStr += "</table></div>";
		//var prevHtml = $("#tab-info").html();
		//htmlStr += "<input type='button' value='Hide Errors' onclick=\"closeShowErrors('" + prevHtml + "')\" >";
                //$('#show-errors-div').html(htmlStr);
		//$("#tab-info").html(prevHtml + htmlStr);

		//$('<div></div>').dialog({
		$('#show-errors-dialog').dialog({
                              modal: true,
                              title: "XML Error List ",
                              width: 500,
                              open: function () {
                                $(this).html(htmlStr);
                              },
                              buttons: {
                                Close: function () {
                                  $(this).dialog("close");
                                }
                              }
                            }); // end dialog div
}