/**************************************************************************************
Copyright 20005- Phi Tran
This have been released under the GNU General Public Licence (GNU GPL)
The codes are provided without any liabilty occur on my part either expressed of implied
***************************************************************************************/

function NewElement()
{
	this.type = "element";
	this.name = new String();
	this.attributes = new Array();
	this.contents = new Array();
	this.uid = _Xparse_count++;
	_Xparse_index[this.uid]=this;
};

function NewCarData()
{
	this.type = "chardata";
	this.value = new String();
};

function NewPI()
{
	this.type = "pi";
	this.value = new String();
};

function NewComment()
{
	this.type = "comment";
	this.value = new String();
};


function _frag()
{
	this.str = new String();
	this.ary = new Array();
	this.end = new String();
};


var _Xparse_count = 0;
var _Xparse_index = new Array();

function Xparse(src)
{
	var frag = new _frag();
	

	frag.str = _prolog(src);


	var root = new NewElement();
	root.name="ROOT";


	frag = _compile(frag);

	root.contents = frag.ary;
	root.index = _Xparse_index;
	_Xparse_index = new Array();
	return root;
}


function _compile(frag)
{

	while(1)
	{

	
		if(frag.str.length == 0)
		{
		
			return frag;
		}

		var TagStart = frag.str.indexOf("<");

		if(TagStart != 0)
		{

			var thisary = frag.ary.length;
			frag.ary[thisary] = new NewCarData();
			if(TagStart == -1)
			{
				frag.ary[thisary].value = _entity(frag.str);
				frag.str = "";
			}
			else
			{
				frag.ary[thisary].value = _entity(frag.str.substring(0,TagStart));
				frag.str = frag.str.substring(TagStart,frag.str.length);
			}
		}
		else
		{

			if(frag.str.substring(1,2) == "?")
			{
				frag = _tag_pi(frag);
			}
			else
			{
				if(frag.str.substring(1,4) == "!--")
				{
					frag = _tag_comment(frag);
				}
				else
				{
					if(frag.str.substring(1,9) == "![CDATA[")
					{
						frag = _tag_cdata(frag);
					}
					else
					{
						if(frag.str.substring(1,frag.end.length + 3) == "/" + frag.end + ">" || _strip(frag.str.substring(1,frag.end.length + 3)) == "/" + frag.end)
						{
							frag.str = frag.str.substring(frag.end.length + 3,frag.str.length);
							frag.end = "";
							return frag;
						}
						else
						{
							frag = _tag_element(frag);
						}
					}
				}
			}

		}
	}
	
	return "";
};


function _tag_element(frag)
{

	var close = frag.str.indexOf(">");
	var empty = (frag.str.substring(close - 1,close) == "/");
	if(empty)
	{
		close -= 1;
	}
//	alert(frag.str.substring(1,close));
	var starttag = _normalize(frag.str.substring(1,close));
	
	var nextspace = starttag.indexOf(" ");
	var attribs = new String();
	var name = new String();
	if(nextspace != -1)
	{
		name = starttag.substring(0,nextspace);
		attribs = starttag.substring(nextspace + 1,starttag.length);
	}
	else
	{
		name = starttag;
	}

	var thisary = frag.ary.length;
	frag.ary[thisary] = new NewElement();
	frag.ary[thisary].name = _strip(name);
		
	if(attribs.length > 0)
	{
		frag.ary[thisary].attributes = _attribution(attribs,frag.ary[thisary].name);
	}
	if(!empty)
	{
		var contents = new _frag();
		contents.str = frag.str.substring(close + 1,frag.str.length);
		contents.end = name;
		contents = _compile(contents);
		frag.ary[thisary].contents = contents.ary;
		frag.str = contents.str;
	}
	else
	{
		//alert(frag.str);
		frag.str = frag.str.substring(close + 2,frag.str.length);
		
	}
	return frag;
};

function _tag_pi(frag)
{
	var close = frag.str.indexOf("?>");
	var val = frag.str.substring(2,close);
	var thisary = frag.ary.length;
	frag.ary[thisary] = new NewPI();
	frag.ary[thisary].value = val;
	frag.str = frag.str.substring(close + 2,frag.str.length);
	return frag;
};

function _tag_comment(frag)
{
	var close = frag.str.indexOf("-->");
	var val = frag.str.substring(4,close);
	var thisary = frag.ary.length;
	frag.ary[thisary] = new NewComment();
	frag.ary[thisary].value = val;
	frag.str = frag.str.substring(close + 3,frag.str.length);
	return frag;
};

function _tag_cdata(frag)
{
	var close = frag.str.indexOf("]]>");
	var val = frag.str.substring(9,close);
	var thisary = frag.ary.length;
	frag.ary[thisary] = new NewCarData();
	frag.ary[thisary].value = val;
	frag.str = frag.str.substring(close + 3,frag.str.length);
	return frag;
};
function _attribution(str,working_element)
{
	var all = new Array();
	var ct=0;
	while(1)
	{
		var eq = str.indexOf("=");
		if(str.length == 0 || eq == -1)
		{
			return all;
		}

		var id1 = str.indexOf("\'");
		var id2 = str.indexOf("\"");
		var ids = new Number();
		var id = new String();
		if((id1 < id2 && id1 != -1) || id2 == -1)
		{
			ids = id1;
			id = "\'";
		}
		if((id2 < id1 || id1 == -1) && id2 != -1)
		{
			ids = id2;
			id = "\"";
		}
		var nextid = str.indexOf(id,ids + 1);
		var val = str.substring(ids + 1,nextid);
		var name = _strip(str.substring(0,eq));
		all[name]=_entity(val);
		str = str.substring(nextid + 1,str.length);
		if(name=="style")
			{
			var x=_entity(val);
			var y= new Array();
			var y2= new Array();
			var y3= new Array();
			y=x.split(";");
			for(m=0;m<y.length;m++)
				{
				if(y[m].length==0) continue;
				y2=y[m].split(":");
				if(y2.length >1)
					{
					y2[0]=trim(y2[0]);
					y2[1]=trim(y2[1]);
					y3[y2[0]]=y2[1];
					var ff=y2[0];
					ff=ff;
					}
				}
			ct--;
			all[name]=y3;
			}
		if(working_element=="path" && name=="d")
			{
			var x=_entity(val);
			var array_count=-1;
			var array_count2=0;
			x=x.replace(/,  ,/g,", ,"); 
			x=x.replace(/,,/g,", ,");
			x=x.replace(/, ,/g,", 0,");
			x=x.replace(/,/g," ");
			x=x.replace(/-/g," -"); // replace "-" by space
			
			x=x.replace(/A/g," A "); // replace "-" by space
			x=x.replace(/a/g," a "); // replace "-" by space
			
			x=x.replace(/C/g," C "); // replace "-" by space
			x=x.replace(/c/g," c "); // replace "-" by space
			
			x=x.replace(/H/g," H "); // replace "-" by space
			x=x.replace(/h/g," h "); // replace "-" by space
			
			x=x.replace(/L/g," L "); // replace "-" by space
			x=x.replace(/l/g," l "); // replace "-" by space
			
			
			x=x.replace(/V/g," V "); // replace "-" by space
			x=x.replace(/v/g," v "); // replace "-" by space
			
			
			x=x.replace(/S/g," S "); // replace "-" by space
			x=x.replace(/s/g," s "); // replace "-" by space
			
			x=x.replace(/Z/g," Z "); // replace "-" by space
			x=x.replace(/z/g," z "); // replace "-" by space
			
			x=x.replace(/T/g," T "); // replace "-" by space
			x=x.replace(/t/g," t "); // replace "-" by space
			
			x=x.replace(/Q/g," Q "); // replace "-" by space
			x=x.replace(/q/g," q "); // replace "-" by space
			
			x=x.replace(/M/g," M "); // replace "-" by space
			x=x.replace(/m/g," m "); // replace "-" by space
			x=x.replace(/,  ,/g,", ,"); 
			var y= new Array();
			var y2= new Array();
			y=x.split(" ");
			for(var m=0;m<y.length ;m++)
				{
				if(y[m].length <=0) continue;
				x=y[m].replace(/ /g,"");
				switch(x)
					{
					case "A":case "a":
					case "C":case "c":
					case "H":case "h":
					case "L":case "l":
					case "V":case "v":
					case "S":case "s":
					case "Z":case "z":
					case "T":case "t":
					case "Q":case "q":
					case "M":case "m":
						array_count++;
						y2[array_count]=new Array();
						y2[array_count][0]=x;
						array_count2=1;
						break;
					default:
						var cj= new Array();
						//cj=x.split(".")
						//if(cj.length >2)
						//	{
						//	alert("Svg Wrong---" + x);
						//	x=x;
						//	}
						if(array_count<0 || isNaN(x))
							alert("phi1--" + x);
						else
							{
							y2[array_count][array_count2++]=Number(x);
							}
					}
				}
			all[name]=y2;
			continue;
			}
		
		
		
	}
	alert("phi2--"+all.length );
	return "";
	
}
function _prolog(str)
{
	var A = new Array();

	A = str.split("\r\n");
	str = A.join("\n");
	A = str.split("\r");
	str = A.join("\n");

	var start = str.indexOf("<");
	if(str.substring(start,start + 3) == "<?x" || str.substring(start,start + 3) == "<?X" )
	{
		var close = str.indexOf("?>");
		str = str.substring(close + 2,str.length);
	}
	var start = str.indexOf("<!DOCTYPE");
	if(start != -1)
	{
		var close = str.indexOf(">",start) + 1;
		var dp = str.indexOf("[",start);
		if(dp < close && dp != -1)
		{
			close = str.indexOf("]>",start) + 2;
		}
		str = str.substring(close,str.length);
	}
	return str;
}

function _strip(str)
{
	var A = new Array();

	A = str.split("\n");
	str = A.join("");
	A = str.split(" ");
	str = A.join("");
	A = str.split("\t");
	str = A.join("");

	return str;
}

function _normalize(str)
{
	var A = new Array();

	A = str.split("\n");
	str = A.join(" ");
	A = str.split("\t");
	str = A.join(" ");

	return str;
}
function _entity(str)
{
	var A = new Array();

	A = str.split("&lt;");
	str = A.join("<");
	A = str.split("&gt;");
	str = A.join(">");
	A = str.split("&quot;");
	str = A.join("\"");
	A = str.split("&apos;");
	str = A.join("\'");
	A = str.split("&amp;");
	str = A.join("&");

	return str;
}
function trim(str)
{

if(str.length==0) return(" ");
var A = new Array();
A = str.split(" ");
var x;
for(x=0;x<A.length;x++)
	{
	if(A[x].length)
		{
		for(y=x;y<A.length;y++)
			A[y-x]=A[y];
		A.length=A.length-x;
		break;
		}
	else
		x++;
	}
for(x=A.length-1;x>=0; x--)
	{
	if(A[x].length)
		{
		A.length=x+1;
		break;
		}
	}
if(A.length==0) return(" ");
str = A.join(" ");
return(str);
}
