/******************************************************************************
 *
 *                   INDIGEN SOLUTIONS CODE PROPERTY
 *       The present javascript code is property of Indigen Solutions. This 
 *     code can only be used inside Internet/Intranet web sites located on 
 *  *web servers*, as the outcome of a licensed Indigen Solutions application 
 *  only. Any unauthorized use, reverse-engineering, alteration, transmission, 
 * transformation, facsimile, or copying of any means (electronic or not) is 
 *     strictly prohibited and will be prosecuted. Removal of the present 
 *              copyright notice is strictly prohibited
 *         Copyright (c) 2004 Indigen Solutions. All Rights Reserved.
 *
 * RCS Id                       $Id: serializer.js,v 1.4 2005/07/04 12:26:08 jerome Exp $
 * 
 ******************************************************************************/

var attributes=["id","name","src","title","content","http-equiv","href","type","rel","nowrap","rowspan","colspan","rows","cols","onclick"];
var styles=[
{ name: "width", prop: "width" },
{ name: "height", prop: "height" },
{ name: "border", prop: "border" },
{ name: "top", prop: "top" },
{ name: "left", prop: "left" },
{ name: "color", prop: "color" },
{ name: "position", prop: "position" },
{ name: "vertical-align", prop: "verticalAlign" },
{ name: "background-color", prop: "backgroundColor" },
{ name: "background-image", prop: "backgroundImage" }
];

var singleTags={
	"input": 1,
	"br": 1
}

function serializeHTML(node,indent) {
	if(node.nodeType==3) {
		var text=node.nodeValue;
		return text;
	}
	
    if(node.getAttribute("title")=="dispose")
        return "";

	var html=indent;

	var nodeName=node.nodeName.toLowerCase();

	html+="<"+node.nodeName;
	if(node.className!=null && node.className!="")
		html+=" class=\""+node.className+"\"";
	for(var i=0;i<attributes.length;i++) {
		var attrv=node.getAttribute(attributes[i]);
		if(attrv!=null && attrv!="")
			html+=" "+attributes[i]+"=\""+attrv+"\"";
	}
	var style="";
	for(var i=0;i<styles.length;i++) {
		var name=styles[i].name;
		var prop=styles[i].prop;
		var val=node.style[prop].replace(/"/g,"'");
		if(val!=null && val!='')
			style+=name+":"+val+"; ";
	}
	if(style!="")
		html+=" style=\""+style+"\"";
	if(node.nodeName.toLowerCase()=="input" && node.type!="hidden") {
		if(node.value!=null && node.value!="")
			html+=" value=\""+node.value+"\"";
		if(node.checked==true)
			html+=" checked=\"on\"";
	}
	if(node.nodeName.toLowerCase()=="textarea") {
    }
    
	if(singleTags[node.nodeName.toLowerCase()]!=null)
		html+="/>\n";
	else {
		html+=">\n";
		if(node.nodeName.toLowerCase()=="textarea") {
			if(node.value!=null)
				html+=node.value;
		}

		if(node.nodeType==1) {
			var node0=node.firstChild;
			while(node0!=null) {
				html+=serializeHTML(node0,indent+"  ");
				node0=node0.nextSibling;
			}
		}
	
		html+=indent+"</"+node.nodeName+">\n";
	}
	return html;
}

function serializeHTMLForDisplay(node,indent) {
	if(node.nodeType==3) {
		var text=node.nodeValue;
		return text;
	}
	
    if(node.getAttribute("title")=="dispose")
        return "";

	var html=indent;

	var nodeName=node.nodeName.toLowerCase();

	html+="&lt;"+node.nodeName;
	if(node.className!=null && node.className!="")
		html+=" class=\""+node.className+"\"";
	for(var i=0;i<attributes.length;i++) {
		var attrv=node.getAttribute(attributes[i]);
		if(attrv!=null && attrv!="")
			html+=" "+attributes[i]+"=\""+attrv+"\"";
	}
	var style="";
	for(var i=0;i<styles.length;i++) {
		var name=styles[i].name;
		var prop=styles[i].prop;
		var val=node.style[prop].replace(/"/g,"'");
		if(val!=null && val!='')
			style+=name+":"+val+"; ";
	}
	if(style!="")
		html+=" style=\""+style+"\"";
	if(node.nodeName.toLowerCase()=="input" && node.type!="hidden") {
		if(node.value!=null && node.value!="")
			html+=" value=\""+node.value+"\"";
		if(node.checked==true)
			html+=" checked=\"on\"";
	}
	if(node.nodeName.toLowerCase()=="textarea") {
    }
    
    var shouldIndent=true;
	if(singleTags[node.nodeName.toLowerCase()]!=null)
		html+="/&gt;<br/>";
	else {
		html+="&gt;";
		if(node.childNodes.length==1 && node.firstChild.nodeType==3) {
			shouldIndent=false;
		} else {
			html+="<br/>";
		}
		if(node.nodeName.toLowerCase()=="textarea") {
			if(node.value!=null)
				html+=node.value;
		}

		if(node.nodeType==1) {
			var node0=node.firstChild;
			while(node0!=null) {
				html+=serializeHTMLForDisplay(node0,indent+"&nbsp;&nbsp;");
				node0=node0.nextSibling;
			}
		}
		if(shouldIndent)
			html+=indent;
		html+="&lt;/"+node.nodeName+"&gt;<br/>";
	}
	return html;
}

function serializeJS(data, indent) {
	if(serializeJS.arguments.length<2)
		indent = "";
	var str = "";
	if(data == null) {
		return null;
	} else if(data instanceof Array) {
		str+="[\n";
		var first=true;
		for(var i=0; i<data.length; i++) {
			if(first) {
				first=false;
			} else {
				str+=",\n";
			}
			str+=indent+" "+serializeJS(data[i],indent+"  ");
		}
		str+="\n"+indent+"]";
	} else	if(typeof data == "object") {
		str+="{\n";
		var first=true;
		for(var k in data) {
			if(first) {
				first=false;
			} else {
				str+=",\n";
			}
			str+=indent+" '"+k+"': ";
			str+=serializeJS(data[k],indent+"  ");
		}
		str+="\n"+indent+"}";
	} else if(typeof data == 'string') {
		data = data.replace(/\n/g,"\\n");
		data = data.replace(/\r/g,"\\r");
		data = data.replace(/'/g,"\\'");		
		data = data.replace(/\\/g,"\\\\");		
		str="'"+data+"'";
	} else if(typeof data == 'number') {
		str=data;
	} else if(typeof data == 'boolean') {
		str=data;
	} else {
		str = indent+"/* type "+(typeof data)+" */";
	}
	return str;
}

