// +------------------------------------------------------------------------+
// | Copyright (c) 2005, Hawk												|
// | All rights reserved.													|
// |																		|
// | Redistribution and use in source and binary forms, with or without 	|
// | modification, are permitted provided that the following conditions 	|
// | are met:																|
// |																		|
// | 1. Redistributions of source code must retain the above copyright		|
// |	notice, this list of conditions and the following disclaimer.		|
// | 2. Redistributions in binary form must reproduce the above copyright	|
// |	notice, this list of conditions and the following disclaimer in the |
// |	documentation and/or other materials provided with the distribution.|
// | 3. The name of the author may not be used to endorse or promote		|
// |	products derived from this software without specific prior written	|
// |	permission. 														|
// |																		|
// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR	|
// | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 		|
// | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 	|
// | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, |
// | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 	|
// | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 	|
// | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 	|
// | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,	|
// | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING	|
// | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 		|
// | THE POSSIBILITY OF SUCH DAMAGE.										|
// |																		|
// +------------------------------------------------------------------------+
// | Author: Hawk <w3l_admin@hawk.34sp.com> 								|
// +------------------------------------------------------------------------+

/**
 * XML Load用クラス for IE+MSXML/Gecko (xmlloader.js)
 * Script Version: 0.1.0
 *
 * [constructor]
 * @param function _loadHandler
 * @param function _errorHandler
 **/
function XmlLoader(_loadHandler, _errorHandler)
{
	if(_errorHandler==null) _errorHandler = function(err){};

	this.onload = _loadHandler;
	this.onerror= _errorHandler;

	/**
	 * Geckoの場合、連続して読み込むとうまくいかない場合があるので
	 * loadHandler の実行を_geckoWaitTime ミリ秒待つ
	 *
	 * @access private
	 * @var int
	 **/
	this._geckoWaitTime = 50;

	/**
	 * @access public
	 * @param string url
	 * @return bool
	 **/
	this.load = function(url) {
		var xmldoc; //DOMDocument
		var loadHandler, errorHandler;

		loadHandler = this.onload;
		errorHandler= this.onerror;

		if(document.implementation &&
			document.implementation.createDocument)
		{
			xmldoc = document.implementation.createDocument("", "", null);
			xmldoc.onload = function()
			{
				if(xmldoc.documentElement==null) {
					errorHandler(
						new XmlLoaderError("指定されたリソースが見つかりません。",url)
					);
				} else if(XmlLoaderError.isError(xmldoc)) {
					var e = XmlLoaderError.fromXml(xmldoc);
						errorHandler(e);
				} else {
					setTimeout(function(){ loadHandler(xmldoc); }, 50);
				}
			}

			//apple ie
			if ( !xmldoc.load ) {

				try {
					var http_request = false;

					if (window.XMLHttpRequest) { // Mozilla, Safari,...
						http_request = new XMLHttpRequest();
						if (http_request.overrideMimeType) {
							http_request.overrideMimeType('text/xml');
						}
					} else if (window.ActiveXObject) { // IE
						try {
							http_request = new ActiveXObject("Msxml2.XMLHTTP");
						} catch (e) {
							try {
								http_request = new ActiveXObject("Microsoft.XMLHTTP");
							} catch (e) {}
						}
					}

					if (!http_request) {
						alert('Giving up :( Cannot create an XMLHTTP instance');
						return false;
					}

					http_request.onreadystatechange = function(){
						if (http_request.readyState == 4) {
							if (http_request.status == 200) {
								alert(http_request.responseText);
								xmldoc = http_request.responseXML;
								loadHandler(xmldoc);
//	var items = xmldoc.getElementsByTagName("logininfo");
//alert(items);
//alert(items.length);
//	for (var i = 0; i < items.length; i++) {
//	  var item = items.item(i);
//	  alert(item);
//	  if (item) {
//			var nickname;/
//		nickname = item.getElementsByTagName("nickname")[0].firstChild;
//		alert(nickname.nodeValue);
//	  }
//	}
							}
						}
					}
					http_request.open('GET', url, true);
					http_request.send(null);

					return true;

				}
				catch (e) {
					alert(e);
				}
			}

		}
		else if(window.ActiveXObject && document.getElementById)
		{
			xmldoc = new ActiveXObject('Microsoft.XMLDOM');
			xmldoc.onreadystatechange = function()
			{
				if(xmldoc.readyState==4) {
					if(XmlLoaderError.isError(xmldoc)) {
						errorHandler(
							XmlLoaderError.fromIXMLDOMParseError(xmldoc.parseError)
						);
					} else {
						loadHandler(xmldoc);
					}
				}
			}
		}
		else { return false; }


		try{

			//standard load
			xmldoc.load(url);

		}
		catch(e) {
			errorHandler(
				new XmlLoaderError("指定されたリソースが見つかりません。",url)
			);
		}
		return true;
	}
}


/**
 * @static
 * @param string url
 * @param function loadHandler
 * @param function errorHandler
 * @return bool
 **/
XmlLoader.load = function (url, loadHandler, errorHandler) {
	var loader = new XmlLoader(loadHandler, errorHandler);
		return loader.load(url);
}

/**
 * class XmlLoaderError
 *
 * [constructor]
 * @param string reason
 * @param string url
 * @param int line
 * @param int pos
 * @param string src
 *
 **/
function XmlLoaderError(reason, url, line, pos, src) {
	this.reason  = reason!=null ? reason: "";
	this.url	 = url	 !=null ? url	: "";
	this.line	 = line  !=null ? line	: 0;
	this.linepos = pos	 !=null ? pos	: 0;
	this.srcText = src	 !=null ? src	: "";

	this.toString= function() {
		return this.reason +"\nURL:"+ this.url
			+"\n行番号 "+ this.line +", 列番号 "+ this.linepos +"\nsourcetext:\n"+ this.srcText;
	}
}
/**
 * @static
 * @param DOMDocument doc
 * @return bool
 **/
XmlLoaderError.isError = function(doc) {
	return (doc.parseError!=null && doc.parseError.errorCode!=0) ||
		(doc.documentElement.tagName=='parsererror'
			&& doc.documentElement.namespaceURI=='http://www.mozilla.org/newlayout/xml/parsererror.xml');
}

/**
 * @static
 * @param DOMDocument doc
 * @return XmlLoaderError
 **/
XmlLoaderError.fromXml = function(doc) {
	var errElm = doc.documentElement;
	var msgs = errElm.firstChild.nodeValue.split(/\n/);
	var reason = msgs[0];
	var url = msgs[1].replace(/^.+[: ](.+)/, "$1");
	var pos = msgs[2].replace(/^[^\d]+(\d+)[^\d]+(\d+)[^\d]*$/, "$1;$2").split(/;/);
	var src = errElm.getElementsByTagName('sourcetext').item(0).firstChild.nodeValue;

	return new XmlLoaderError(reason, url, pos[0], pos[1], src);
}

/**
 * @static
 * @param IXMLDOMParseError perr
 * @return XmlLoaderError
 **/
XmlLoaderError.fromIXMLDOMParseError = function(perr) {
	var e = new XmlLoaderError();
	for(var p in e) { e[p]=perr[p]; }
	return e;
}
