//<!--
// XML, DOM Common Modules

// nodeType const
var NODE_Element = 1;
var NODE_Attribute = 2;
var NODE_Text = 3;
var NODE_CDATASection = 4;
var NODE_EntityReference = 5;
var NODE_Entity = 6;
var NODE_ProcessingInstruction = 7;
var NODE_Comment = 8;
var NODE_Document = 9;
var NODE_DocumentType = 10;
var NODE_DocumentFragment = 11;
var NODE_Notation = 12;

// (DOM) Get Object by ID
function getObjEle(id){
	if(id!='')
	if(document.getElementById) return document.getElementById(id)
	else if (document.layers) return document.layers[id]
	else if (document.all) return document.all[id]
	else return null;
}

// (DOM) Show Object
function eleShowNoBlock(id){
	var obj = getObjEle(id); if(obj==null) return;
	if(document.getElementById || document.all) obj.style.visibility = 'visible';
	else if(document.layers) obj.visibility = 'show';
}
// (DOM) Hide Object
function eleHideNoBlock(id){
	var obj = getObjEle(id); if(obj==null) return;
	if(document.getElementById || document.all) obj.style.visibility = 'hidden';
	else if(document.layers) obj.visibility = 'hide';
}

// (DOM) Show Object (with display-style:block)
function eleShow(id){
	var obj = getObjEle(id); if(obj==null) return;
	eleShowObj(obj);
}
function eleShowObj(obj){
	if(obj==null) return;
	if(document.getElementById || document.all){
		obj.style.visibility = 'visible'; obj.style.display = 'block';
	}else if(document.layers){
		obj.visibility = 'show'; obj.display = 'block';
	}
}
// (DOM) Hide Object (with display-style:none)
function eleHide(id){
	var obj = getObjEle(id); if(obj==null) return;
	eleHideObj(obj);
}
function eleHideObj(obj){
	if(obj==null) return;
	if(document.getElementById || document.all){
		obj.style.visibility = 'hidden'; obj.style.display = 'none';
	}else if(document.layers){
		obj.visibility = 'hide'; obj.display = 'none';
	}
}

// (XML) XPath で指定したノードElemenet を返す
// Opera 8以下は、シンプルなXPath（/aa/bb/ccc[text()='dd'] の形式）のみ対応
function getNodeXParh(xmlDoc, xPath){
	var f_val = null;
	if (window.ActiveXObject)  {
		// code for IE
		f_val = xmlDoc.selectSingleNode(xPath);
		return f_val;
	}
	else if (document.implementation && document.implementation.createDocument) {
		if(!is_opera){
			// code for Gecko (Not Opera)
			var resolver = xmlDoc.createNSResolver(xmlDoc);
			var expression = xmlDoc.createExpression(xPath, resolver);
			var result = expression.evaluate(xmlDoc.documentElement, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
			f_val = result.singleNodeValue;
			return f_val;
		}else if(is_opera){
			// code for Opera 8
			// Opera 8 の場合は、XPath は / と タグ名の組み合わせのみ（/aaa/bbb）対応

			if(xPath.length>3)
			if(xPath.substring(0, 2)=='//'){ xPath = xPath.substring(1, xPath.length+1); }

			var i, textSel = null, xPathSp = xPath.split('/');

			// [text()=''] が指定されているとき、 textSel に '' を取得
			if(xPathSp[xPathSp.length-1].indexOf('[')>=0 && xPathSp[xPathSp.length-1].indexOf(']')>=0){
				textSel = xPathSp[xPathSp.length-1].substring(xPathSp[xPathSp.length-1].indexOf('[')+1, xPathSp[xPathSp.length-1].indexOf(']'));
				if(textSel.indexOf("text")>=0)
				textSel = textSel.substring(textSel.indexOf("'")+1, textSel.length-1);
			}

			// [text()=''] が指定されているとき [～] を除外する
			for(i=0;i<=xPathSp.length;i++)
			if(xPathSp[i]!=null && xPathSp[i]!='')
			if(xPathSp[i].indexOf('[')>=0 && xPathSp[i].indexOf(']')>=0){
				xPathSp[i] = xPathSp[i].substring(0, xPathSp[i].indexOf('['));
			}

			var parentSafe = false, xParent, xSp = xmlDoc.getElementsByTagName( xPathSp[xPathSp.length-1] )

			if(xSp.length<=0) return null;

			var rootOk, textvar;
			for(i=0;i<=xSp.length-1;i++){
			if(xSp[i].nodeType==1 && xSp[i].tagName.toLowerCase()==xPathSp[xPathSp.length-1].toLowerCase()){

				rootOk = false;
				if(textSel!='' && textSel!=null){

					if(xSp[i].childNodes.length>0)
					if(xSp[i].childNodes.item(0).nodeType==3)
					if(xSp[i].childNodes.item(0).nodeValue.toLowerCase()==textSel.toLowerCase())
					rootOk = true;

				}else{
					rootOk = true;
				}

				if(rootOk){
					if(xPathSp.length==1){
						return xSp[i];
					}else{
						xParent = xSp[i];
						for(is=(xPathSp.length-2);is>=0;is--){
							xParent = xParent.parentNode;

							if(is==0 && xParent.nodeType==9 && xPathSp[is]=='')
								return xSp[i];
							else if(is==0 && xParent.nodeType==1 && xPathSp[is].toLowerCase()=='')
								return xSp[i];
							else if(is==0 && xParent.nodeType==1 && xPathSp[is].toLowerCase()==xParent.tagName.toLowerCase())
								return xSp[i];
							else if(xParent.nodeType!=1 || xPathSp[is].toLowerCase()!=xParent.tagName.toLowerCase())
								break;

						}
					}
				}
			}
			}
		}
	}else{
		return null;
	}
}



// (AJAX) Create xmlHttpRequest Object
function createXmlHttp(){
	var xmlHttpReq = null;
	if(window.ActiveXObject){
	// for Windows IE
		try{
			// for MSXML2 Upper
			xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
		}catch (e){
			try{
				// for MSXML
				xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e2){
				return null;
			}
		}
		return xmlHttpReq;
	}else if(window.XMLHttpRequest){
		// for Not Windows-IE, and include XMLHttpRequest object browsers
		xmlHttpReq = new XMLHttpRequest();
		if(!is_opera) xmlHttpReq.overrideMimeType('text/xml; charset=utf-8');
/*
		try {
			// http://www.mozilla.org/projects/security/components/signed-scripts.html#privs
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		} catch (e) {
			alert(e);
			return null;
		}
*/
		return xmlHttpReq;

	}else{
		return null;
	}
}
// (AJAX) Create XML Object
function createXML(){
	var xmlDoc;
	if (window.ActiveXObject) {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
		xmlDoc.setProperty("SelectionLanguage", "XPath");
		return xmlDoc;
	} else if (document.implementation && document.implementation.createDocument) {
		xmlDoc = document.implementation.createDocument("" , "" , null);
		if(xmlDoc.childNodes.length>0) xmlDoc.removeChild(xmlDoc.firstChild);
		if(!is_opera) xmlDoc.async = false;
		return xmlDoc;
	} else {
		return null;
	}
}

// (AJAX, XML-RPC) Create "methodCall" initialize document
function createMethodCallxmlDoc(methodName){
	var xmlDoc = createXML(); if(xmlDoc==null) return null;

	var eleRoot = xmlDoc.appendChild(xmlDoc.createElement("methodCall"))
	eleRoot.appendChild(xmlDoc.createElement("methodName")).appendChild(xmlDoc.createTextNode(methodName));
	eleRoot.appendChild(xmlDoc.createElement('params')).appendChild(xmlDoc.createElement('param'))
	return xmlDoc;
}
// (AJAX, XML-RPC) Add "value/struct" Node
function appendStructNodes(xmlDoc, node_Root, member_array){
	if(xmlDoc==null) return false;

	var node_Struct = node_Root.appendChild(xmlDoc.createElement("value")).appendChild(xmlDoc.createElement("struct"));

	if(node_Struct==null) return false;
	var node_member;
	for(i=0;i<=member_array.length-1;i++){
		if(member_array[i].length==3)
		if(member_array[i][0]!='' && member_array[i][1]!='' && member_array[i][2]!=''){

			node_member = xmlDoc.createElement("member");
			node_member.appendChild(xmlDoc.createElement("name")).appendChild(xmlDoc.createTextNode( member_array[i][0] ));
			node_member.appendChild(xmlDoc.createElement("value")).appendChild(xmlDoc.createElement( member_array[i][1] )).appendChild(xmlDoc.createTextNode( member_array[i][2] ));
			node_Struct.appendChild(node_member);
		}
	}
	return true;
}

// (XML-RPC) 受信した xmlHttpRequest から XMLオブジェクトを取得して返す
function getXMLfromXmlHttpRequest(xmlhttp){
	var xmlDoc = createXML();
	if(xmlhttp==null || xmlDoc==null) return null;


	if(window.ActiveXObject){
		xmlDoc.loadXML(xmlhttp.responseText);
		if(xmlDoc.parseError!=0) return null;
	}else if(window.DOMParser){

		xmlDoc = xmlhttp.responseXML;
		if(xmlDoc==null || xmlDoc.documentElement == null) return null;
		if(xmlDoc.documentElement.tagName=='parsererror'
			&& xmlDoc.documentElement.namespaceURI=='http://www.mozilla.org/newlayout/xml/parsererror.xml') return null;
	}else{
		return null;
	}
	return xmlDoc;
}
// (XML-RPC) XMLオブジェクトのXMLコードをフルテキストで返す
function getXMLText_from_xmlObj(xmlDoc){
	if(xmlDoc==null) return null;
	if(window.ActiveXObject){
		return xmlDoc.xml;
	}else if(window.DOMParser){
		var xmlSerial  = new XMLSerializer();
		return xmlSerial.serializeToString(xmlDoc);
	}
	return null;
}
// (XML-RPC) フルテキストのXMLコードを、XMLオブジェクトにして返す
function getXmlObj_from_Text(xmlText){
	var xmlDoc = createXML();
	if(xmlDoc==null || xmlText==null || xmlText=='') return null;

	if(window.ActiveXObject){
		xmlDoc.loadXML(xmlText);
		if(xmlDoc.parseError!=0) return null;
	}else if(window.DOMParser){
		var xmlParser = new DOMParser().parseFromString(xmlText, "text/xml");
		xmlDoc = xmlParser;

		if(xmlDoc==null || xmlDoc.documentElement == null) return null;
		if(xmlDoc.documentElement.tagName=='parsererror'
			&& xmlDoc.documentElement.namespaceURI=='http://www.mozilla.org/newlayout/xml/parsererror.xml')
			return null;
	}else{
		return null;
	}

	return xmlDoc;
}



// (AJAX) Fault Response Analyzing
// Fault が返されたときのエラー内容を返す
function faultSplit(resXml){

	var f_val = getNodeXParh(resXml, '/methodResponse/fault/value');

	if(f_val==null) return 'Unknown Error.';
	if(!f_val.hasChildNodes) return 'Unknown Error.';

	var arrayIdx, retArray, faultnum = '', faultmsg = '';
	for(i=0;i<=f_val.childNodes.length-1;i++){
		if(f_val.childNodes.item(i).nodeName=='struct'){

			if(!getStructParams(f_val.childNodes.item(i))) return 'Unknown Error. (bad returned structure of param)';

			for(ix=0;ix<=arrayIdx;ix++){
				if(retArray[ix][0]=='faultCode') faultnum = retArray[ix][1];
				if(retArray[ix][0]=='faultString') faultmsg = retArray[ix][1];
			}

			return ('('+faultnum+')\n'+faultmsg+'');
		}else{
			return 'Unknown Error.';
		}
	}

	// Get Struct Parameters
	function getStructParams(xmlNode){
		arrayIdx = -1;

		if(xmlNode.childNodes.length<=0) return false;
		retArray = new Array(xmlNode.childNodes.length);

		var xMember, xName, xValue;
		for(i=0;i<=xmlNode.childNodes.length-1;i++){
			if(xmlNode.childNodes.item(i).nodeName=='member'){
				xMember = xmlNode.childNodes.item(i);
				arrayIdx++;
				retArray[arrayIdx] = new Array(1);

				// get param-name
				if(xMember.getElementsByTagName('name').length>0)
				if(xMember.getElementsByTagName('name')[0].hasChildNodes)
				if(xMember.getElementsByTagName('name')[0].firstChild.nodeType == 3)
				retArray[arrayIdx][0] = xMember.getElementsByTagName('name')[0].firstChild.nodeValue;

				// get param-value
				if(xMember.getElementsByTagName('value').length>0)
				if(xMember.getElementsByTagName('value')[0].hasChildNodes)
				if(xMember.getElementsByTagName('value')[0].firstChild.nodeName.match(/^((i4)|(int)|(boolean)|(string)|(double)|(dateTime\.iso8601)|(base64))$/))
				if(xMember.getElementsByTagName('value')[0].firstChild.hasChildNodes)
				if(xMember.getElementsByTagName('value')[0].firstChild.firstChild.nodeType == 3)
				retArray[arrayIdx][1] = xMember.getElementsByTagName('value')[0].firstChild.firstChild.nodeValue;
			}

		}
		if(arrayIdx<0) return false;
		return true;
	}
}

// (XML-RPC) 渡された member ノードの value 値を返す
function getMemberNodeValues(node_member){
	if(!node_member.hasChildNodes) return null;
	if(node_member.nodeName!='member') return null;
	if(node_member.getElementsByTagName('value')==null) return null;
	if(node_member.getElementsByTagName('value').length<=0) return null;
	if(node_member.getElementsByTagName('value')[0].nodeType!=1) return null;

	if(node_member.getElementsByTagName('value')[0].hasChildNodes)
	if(node_member.getElementsByTagName('value')[0].firstChild.nodeName.match(/^((i4)|(int)|(boolean)|(string)|(double)|(dateTime.iso8601)|(base64))$/))
	if(node_member.getElementsByTagName('value')[0].firstChild.hasChildNodes)
	if(node_member.getElementsByTagName('value')[0].firstChild.firstChild.nodeType == 3)
	return node_member.getElementsByTagName('value')[0].firstChild.firstChild.nodeValue;

	return null;
}



//-->

