// ========================================================================
// bh_jsonxml.js
// ほとんど単体では使い物にならない（笑）スクリプト
// 
// 2007/03/22	bluehawk作成
// Copyright Bluehawk@Team.InfinityBird(Project IDGATE(R)).All rights reserved.
// 
// ========================================================================
function formclear(formdata,formLabel) {
	formdata[formLabel].value="";
}
function xml2json(formdata) {
	if ( formdata.xmlData.value == "" ) return "";

	var xmlParser = new XML.ObjTree();
	var treeObject = xmlParser.parseXML( formdata.xmlData.value );

	var tagnamearray = new Array();
	var arraylist = new Array();
	var tagnamearray = tagNameList(treeObject);
	for( var ii=0; ii<tagnamearray.length; ii++ ) {
		if (tagnamearray[ii].match(/\_array$/i)) {
			arraylist.push(tagnamearray[ii]);
		}
	}

	if ( arraylist.length > 0 ){
		xmlParser.force_array = arraylist;
		treeObject = xmlParser.parseXML( formdata.xmlData.value );
	}

	var dumper = new JKL.Dumper();
	formdata.jsonData.value = dumper.dump( treeObject );
}
function json2xml(formdata) {
	if ( formdata.jsonData.value == "" ) return "";

	var treeObject = eval("("+formdata.jsonData.value+")");

	var xmlParser = new XML.ObjTree();
	var xmlSrc = xmlParser.writeXML( treeObject );

	if( formdata.chk_xmlindent.checked ) xmlSrc=xmlIndent(xmlSrc);
	formdata.xmlData.value = xmlSrc;
}
function jsondisp(formdata) {
	if ( formdata.jsonData.value == "" ) return "";

	var treeObject = eval("("+formdata.jsonData.value+")");
	var dbgobj = new DebuggableObject( treeObject );

	dbgobj.render(document.getElementById('output'));
}

function xmlIndent(data) {
	var indentStr = '  ';
	var indentNum = -1;
	var tagCheckList = new Array();
	var srcListArray = new Array();
	srcListArray = data.split("\n");

	for(var ii=0;ii<srcListArray.length; ii++){
		if( srcListArray[ii]=="" ) continue;

		if( /<([\w\-_]+).*?>.*?<\/\1>/.exec(srcListArray[ii]) ){
			indentNum++;
		}else if( /<([\w\-_]+).*?>/.exec(srcListArray[ii]) ){
			indentNum++;
			tagCheckList.push(RegExp.$1);
		}

		srcListArray[ii] = indentStr.x(indentNum) +srcListArray[ii];

		if( /<\/([\w\-_]+)>/.exec(srcListArray[ii]) ){
			if( RegExp.$1 == tagCheckList[tagCheckList.length-1] ){
				tagCheckList.pop();
			}
			indentNum--;
		}
	}
	return srcListArray.join("\n");
}
String.prototype.x = function(n){
	if(n<1) return "";
	for(var i=0,tmp=[];i<n;tmp[i++]=this);
	return tmp.join("");
}
function tagNameList( object ){
	var tagnamehash = {};

	if ( typeof(object) == "undefined" || object == null ) return "";

	tagNameParse( null, object, tagnamehash );

	if (!tagnamehash.hasOwnProperty) {
		tagnamehash.prototype.hasOwnProperty = function(it) {
			return (this[it] && !this.constructor.prototype[it]);
		}
	}
	var tagnamearray = new Array();
	for( var key in tagnamehash) {
		if ( ! tagnamehash.hasOwnProperty(key) ) continue;
		tagnamearray.push(key);
	}
	return tagnamearray;
}
function tagNameParse( name, object, tagnamehash ){
	if (!object.hasOwnProperty) {
		object.prototype.hasOwnProperty = function(it) {
			return (this[it] && !this.constructor.prototype[it]);
		}
	}
	for( var key in object ) {
		tagnamehash[key] = key;

		if ( ! object.hasOwnProperty(key) ) continue;
		var val = object[key];
		if ( typeof(val) == "object" && val.constructor == Array ) {
			tagNameParseArray( key, val, tagnamehash );
		} else if ( typeof(val) == "object" ) {
			tagNameParse( key, val, tagnamehash );
		}
	}
	return;
}
function tagNameParseArray( key, array, tagnamehash ){
	for( var i=0; i<array.length; i++ ) {
		tagnamehash[key] = key;

		var val = array[i];
		if ( typeof(val) == "object" && val.constructor == Array ) {
			tagNameParseArray( key, val, tagnamehash );
		} else if ( typeof(val) == "object" ) {
			tagNameParse( key, val, tagnamehash );
		}
	}
	return;
}
