//Constructor
var JRoute=function()
{
	//Field
	this.id=0;
	this.name="";
	this.type="";
	this.description="";
	this.subRoutes=new Array();
	this.images=new Array();
	this.ownerName=""; // the user who created it
	this.province=""; // the province been to 
	this.updateComment=""; // temporarily used
	
	//Method
	this.init=JRoute_init;
	this.getSubRoute=JRoute_getSubRoute;
	this.addSubRoute=JRoute_addSubRoute;
	this.removeSubRoute=JRoute_removeSubRoute;
	this.modifySubRoute=JRoute_modifySubRoute;
	this.getImage=JRoute_getImage;
	this.addImage=JRoute_addImage;
	this.removeImage=JRoute_removeImage;
	this.modifyImage=JRoute_modifyImage;
	
	this.getRange=JRoute_getRange;
	this.renderToMap=JRoute_renderToMap;
	this.renderToMapNoClear=JRoute_renderToMapNoClear;
	this.appendToMap=JRoute_appendToMap;
	this.clearEmpty=JRoute_clearEmpty;
	
	// Private methods
	this.setAttr=JRoute_setAttr;
	this.setEncodeAttr=JRoute_setEncodeAttr;
	this.getEncodeAttr=JRoute_getEncodeAttr;

	this.fromXml=JRoute_fromXml;
	this.toXml=JRoute_toXml;
	this.routeInfoToXml=JRoute_routeInfoToXml;
	//Event
	
	//Display
	this.init();	
}

function JRoute_init()
{	
}

function JRoute_getSubRoute(index)
{
	if(index>=this.subRoutes.length)
		return null;
	return this.subRoutes[index];
}

function JRoute_addSubRoute(subRoute)
{
	if(subRoute==null)
		return;
	//if(subRoute.isLine && subRoute.linePoints==null)
	//	return;
		
	this.subRoutes[this.subRoutes.length]=subRoute;
}

function JRoute_removeSubRoute(index)
{
	delete this.subRoutes[index];
}

function JRoute_modifySubRoute(index, subRoutes)
{	
	this.subRoutes[index]=subRoute;
}

function JRoute_getImage(index)
{
	if(index>=this.images.length)
		return null;
	return this.images[index];
}

function JRoute_addImage(images)
{
	this.images[this.images.length]=images;
}

function JRoute_removeImage(index)
{
	delete this.images[index];
}

function JRoute_modifyImage(index, images)
{	
	this.images[index]=images;
}

function JRoute_setAttr(dom, node, attrName, attrText)
{
	var attr = dom.createAttribute(attrName);
	attr.value = attrText;
	node.setAttributeNode(attr);
}

function JRoute_setEncodeAttr(dom,node,name,value)
{
	if(g_isNull(value) || value=="")
		return;
	
	this.setAttr(dom,node,name,encode64(value));
}

function JRoute_getEncodeAttr(node,name)
{
	var value=node.getAttribute(name);
	
	if(value!=null)
	{
		var str=decode64(value);
		//return str;
		return g_formatText(str);
	}
	return "";
}

function JRoute_routeInfoToXml()
{
	// clear the object
	var dom=new ActiveXObject("Microsoft.XMLDOM");
	var nodeRoute=dom.createElement("route");
	
	// set route attributes
	this.setEncodeAttr(dom,nodeRoute,"name",this.name);
	this.setEncodeAttr(dom,nodeRoute,"type",this.type);
	this.setEncodeAttr(dom,nodeRoute,"province",this.province);
	dom.appendChild(nodeRoute);
	return dom.xml;
}

function JRoute_toXml(dom)
{
	// clear the object
	if(this.subRoutes.length<=0)
		return "";
		
	dom.innerXml="";
	var nodeRoute=dom.createElement("route");
	
	// set route attributes
	this.setEncodeAttr(dom,nodeRoute,"name",this.name);
	this.setEncodeAttr(dom,nodeRoute,"description",this.description);
	this.setEncodeAttr(dom,nodeRoute,"type",this.type);
	this.setEncodeAttr(dom,nodeRoute,"province",this.province);
	dom.appendChild(nodeRoute);
	
	// points
	var pointSubRoute=this.subRoutes[0];
	if(!g_isNull(pointSubRoute))
	{
		var nodePoints=dom.createElement("points");
		
		this.setEncodeAttr(dom,nodePoints,"name",pointSubRoute.name);
		this.setEncodeAttr(dom,nodePoints,"description",pointSubRoute.description);
		
		for(var j=0;j<pointSubRoute.routePoints.length;j++)
		{
			var routePoint=pointSubRoute.getRoutePoint(j);
			if(!g_isNull(routePoint))
			{
				var nodePoint=dom.createElement("pt");
				var xCoord=routePoint.toXString();
				var yCoord=routePoint.toYString();
				
				this.setAttr(dom,nodePoint,"x",xCoord);
				this.setAttr(dom,nodePoint,"y",yCoord);
				this.setEncodeAttr(dom,nodePoint,"anno",routePoint.annoText);
				this.setEncodeAttr(dom,nodePoint,"legend",routePoint.legendName);
				this.setEncodeAttr(dom,nodePoint,"legendimg",routePoint.legendImg);
				this.setAttr(dom,nodePoint,"clr",routePoint.color);
				this.setAttr(dom,nodePoint,"rad",routePoint.radius);
				this.setAttr(dom,nodePoint,"height",routePoint.height);
				this.setEncodeAttr(dom,nodePoint,"desc",routePoint.description);
				
				nodePoints.appendChild(nodePoint);
			}
		}
		nodeRoute.appendChild(nodePoints);
	}
	
	var msgPrefix="正在保存线路数据 ... "
	// loop to create create lines
	for(var i=1;i<this.subRoutes.length;i++)
	{
		window.status=msgPrefix + 
			parseInt( 100* ( parseFloat(i)/this.subRoutes.length ) ) + "%";
				
		var lineSubRoute=this.subRoutes[i];
		if(!g_isNull(lineSubRoute))
		{
			var nodeLines=dom.createElement("lines");
			
			this.setEncodeAttr(dom,nodeLines,"name",lineSubRoute.name);
			this.setEncodeAttr(dom,nodeLines,"description",lineSubRoute.description);
			
			this.setAttr(dom,nodeLines,"color",lineSubRoute.color);
			this.setAttr(dom,nodeLines,"width",lineSubRoute.width);
			if(lineSubRoute.linePoints!=null)
				this.setAttr(dom,nodeLines,"coords",lineSubRoute.linePoints.ToString());
			else
				this.setAttr(dom,nodeLines,"coords","");
			
			nodeRoute.appendChild(nodeLines);
		}
	}
	
	// images
	for(var i=0;i<this.images.length;i++)
	{
		var routeImage=this.images[i];
		if(!g_isNull(routeImage))
		{
			var nodeImage=dom.createElement("image");
			
			this.setAttr(dom,nodeImage,"serverfile",routeImage.serverFile);
			this.setAttr(dom,nodeImage,"clientfile",routeImage.clientFile);
			this.setEncodeAttr(dom,nodeImage,"title",routeImage.title);
			this.setEncodeAttr(dom,nodeImage,"description",routeImage.description);
			this.setEncodeAttr(dom,nodeImage,"pointname",routeImage.pointName);
			
			nodeRoute.appendChild(nodeImage);
		}
	}
	
	window.status="保存线路数据完毕";
	
	return dom.xml;
}

function JRoute_fromXml(dom, xml,map)
{	
	try
	{
		dom.loadXML(xml);
		// clear contents
		this.init();
		var nodeRoute=dom.documentElement;
		
		// set route attributes
		this.name=this.getEncodeAttr(nodeRoute,"name");
		this.description=this.getEncodeAttr(nodeRoute,"description");
		this.type=this.getEncodeAttr(nodeRoute,"type");
		this.province=this.getEncodeAttr(nodeRoute,"province");
		
		// load points
		var nodePointSubRoute=dom.selectNodes("route/points");
		for(var i=0;i<nodePointSubRoute.length;i++)
		{
			var nodeSubRoute=nodePointSubRoute.nextNode();
			if(!g_isNull(nodeSubRoute))
			{
				// add a subRoute
				var pointSubRoute=new JSubRoute();
				pointSubRoute.name=this.getEncodeAttr(nodeSubRoute,"name");
				pointSubRoute.description=this.getEncodeAttr(nodeSubRoute,"description");
				pointSubRoute.isLine=false;
					
				this.addSubRoute(pointSubRoute);
				// try to add routePoints
				var nodePoints=nodeSubRoute.selectNodes("pt");
				
				for(var j=0;j<nodePoints.length;j++)
				{
					var nodePoint=nodePoints.nextNode;
					if(!g_isNull(nodePoint))
					{
						var routePoint=new JRoutePoint();
						
						var xCoord=nodePoint.getAttribute("x");
						var yCoord=nodePoint.getAttribute("y");
						
						routePoint.fromString(xCoord,yCoord);
						
						var str=this.getEncodeAttr(nodePoint,"anno");
						if(!g_isNull(str))
							routePoint.annoText=str;
							
						str=this.getEncodeAttr(nodePoint,"legend");
						if(!g_isNull(str))
							routePoint.legendName=str;
							
						str=this.getEncodeAttr(nodePoint,"legendimg");
						if(!g_isNull(str))
							routePoint.legendImg=str;
							
						str=nodePoint.getAttribute("clr");
						if(!g_isNull(str))
							routePoint.color=str;
						str=nodePoint.getAttribute("rad");
						if(!g_isNull(str) && str!="")
							routePoint.radius=parseFloat(str);
						str=nodePoint.getAttribute("height");
						if(!g_isNull(str) && str!="")
							routePoint.height=parseFloat(str);
						str=this.getEncodeAttr(nodePoint,"desc");
						if(!g_isNull(str) && str!="")
							routePoint.description=str;
							
						pointSubRoute.addRoutePoint(routePoint);
					}
				}
			}
		}
		
		// load lines
		// loop to create create subRoutes
		var nodeLineSubRoutes=dom.selectNodes("route/lines");
		
		var msgPrefix="正在调入线路数据 ... "
		
		for(var i=0;i<nodeLineSubRoutes.length;i++)
		{
			window.status=msgPrefix + 
				parseInt( 100* ( parseFloat(i)/nodeLineSubRoutes.length ) ) + "%";
					
			var nodeLineSubRoute=nodeLineSubRoutes.nextNode();
			if(!g_isNull(nodeLineSubRoute))
			{
				// add a subRoute
				var lineSubRoute=new JSubRoute();
				lineSubRoute.name=this.getEncodeAttr(nodeLineSubRoute,"name");
				lineSubRoute.description=this.getEncodeAttr(nodeLineSubRoute,"description");
				lineSubRoute.isLine=true;
				
				var str;
				str=nodeLineSubRoute.getAttribute("color");
				if(!g_isNull(str))
					lineSubRoute.color=str;
				str=nodeLineSubRoute.getAttribute("width")
				if(!g_isNull(str))
					lineSubRoute.width=parseInt(str);
					
				// try to locate new data
				lineSubRoute.linePoints=g_createPointArray(map);
				
				str=nodeLineSubRoute.getAttribute("coords")
				if(!g_isNull(str))
				{
					lineSubRoute.linePoints.FromString(str);
				}
				else
				{
					// try to add routePoints from old format
					var nodeRoutePoints=nodeLineSubRoute.selectNodes("pt");
					var routePoint=new JRoutePoint();
					
					for(var j=0;j<nodeRoutePoints.length;j++)
					{
						// output long task
						if(j % 500 ==0 )
						{
							window.status=msgPrefix + 
								parseInt( 100* ( ( i +parseFloat(j)/nodeRoutePoints.length)/nodeLineSubRoutes.length ) ) + "%";
						}
						
						var nodeRoutePoint=nodeRoutePoints.nextNode;
						if(!g_isNull(nodeRoutePoint))
						{
							
							var xCoord=nodeRoutePoint.getAttribute("x");
							var yCoord=nodeRoutePoint.getAttribute("y");
							routePoint.fromString(xCoord,yCoord);
							
							var str=nodeRoutePoint.getAttribute("height");
							if(!g_isNull(str) && str!="")
								routePoint.height=parseFloat(str);
								
							lineSubRoute.linePoints.AddPoint(routePoint.getX(),routePoint.height,routePoint.getY());
						}
					}
				}

				// must be add at last				
				this.addSubRoute(lineSubRoute);
				
			
			}
		}
		
		// load images
		// loop to create create subRoutes
		var nodeImages=dom.selectNodes("route/image");
		for(var i=0;i<nodeImages.length;i++)
		{
			var nodeImage=nodeImages.nextNode();
			if(!g_isNull(nodeImage))
			{
				// add a subRoute
				var routeImage=new JSubRoute();
				
				routeImage.serverFile=nodeImage.getAttribute("serverfile");
				routeImage.clientFile=nodeImage.getAttribute("clientfile");
				
				routeImage.title=this.getEncodeAttr(nodeImage,"title");
				routeImage.description=this.getEncodeAttr(nodeImage,"description");
				routeImage.pointName=this.getEncodeAttr(nodeImage,"pointname");
				
					
				this.addImage(routeImage);
			}
		}
		
		window.status="调入线路数据完毕";
		
		return true;
	}
	catch(err)
	{
		return false;
	}
		
}

function JRoute_getRange()
{
	var range=null;
	var first=true;
	
	for(var i=0;i<this.subRoutes.length;i++)
	{
		var subRoute=this.subRoutes[i];
		if(!g_isNull(subRoute))
		{
			if(first)
			{
				range=subRoute.getRange();
			}
			else
			{
				var rc=subRoute.getRange();
				if(!g_isNull(rc))
					range=range.union(range,rc);
			}
			
			if(!g_isNull(range))
				first=false;
		}
	}	
	
	return range;
}

function JRoute_renderToMap(map)
{
	var x, y;

	map.ClearAllEntity();
	// render line fist	
	for(var j=0;j<this.subRoutes.length;j++)
	{
		var subRoute=this.getSubRoute(j);
		if(!g_isNull(subRoute) && subRoute.isLine)
		{
			subRoute.renderToMap(map);
		}
	}

	for(var j=0;j<this.subRoutes.length;j++)
	{
		var subRoute=this.getSubRoute(j);
		if(!g_isNull(subRoute) && !subRoute.isLine)
		{
			subRoute.renderToMap(map);
		}
	}
}

function JRoute_renderToMapNoClear(map)
{
	var x, y;

	// render line fist	
	for(var j=0;j<this.subRoutes.length;j++)
	{
		var subRoute=this.getSubRoute(j);
		if(!g_isNull(subRoute) && subRoute.isLine)
		{
			subRoute.renderToMap(map);
		}
	}

	for(var j=0;j<this.subRoutes.length;j++)
	{
		var subRoute=this.getSubRoute(j);
		if(!g_isNull(subRoute) && !subRoute.isLine)
		{
			subRoute.renderToMap(map);
		}
	}
	
}

function JRoute_appendToMap(map, isLine)
{
	var x, y;

	if(this.subRoutes.length<=0)
		return;
		
	if(isLine)
	{
		// only add the last one
		var subRoute=this.getSubRoute(this.subRoutes.length-1);
		if(!g_isNull(subRoute) && subRoute.isLine)
		{
			subRoute.renderToMap(map);
		}
	}
	else
	{
		// must be append point entity
		var subRoute=this.getSubRoute(0);
		if(!g_isNull(subRoute) )
		{
			subRoute.appendToMap(map);
		}
	}
}

function JRoute_clearEmpty(map)
{
	var oldSubRoutes=this.subRoutes;
	this.subRoutes=new Array();
	// render line fist	
	for(var j=0;j<oldSubRoutes.length;j++)
	{
		var subRoute=oldSubRoutes[j];
		if(!g_isNull(subRoute))
		{
			subRoute.clearEmpty();
			this.addSubRoute(subRoute);
		}
	}
}

 