﻿<?xml version="1.0" encoding="utf-8" ?>
<Template Title = "API Browser">
	<import-xml src = "Templates/TemplateTools.xml" id = "TemplateTools" />

		<div rid ="api_title" class="title">Available API</div>
		<div> 
			<select onchange ="${this}.ChoosePackage()" rid ="package_list">
				
			</select>
		  <select onchange ="${this}.ChoosePackage()" rid = "api_filter"><option>All</option><option>Virtual</option></select>
		</div>
		<div ___pointer_marker = "never"  acid = "wideselect" appcomp_path = "Gizmos/component.wideselect.xml" rid = "available_api">
		</div>
<!--		 
	<div class ="field">
		<div class = "field_label">
			Syntax:
		</div>
		<div class = "field_input" rid ="syntax">
			[ ... ]
		</div>
	</div>
-->
	<div class ="field">
		<div class = "field_label">
			Description:
		</div>
		<div class = "field_input" rid ="description">
			[ ... ]
		</div>
	</div>
	<!--
	<div class ="field">
		<div class = "field_label">
			Parameters:
		</div>
		<div class = "field_input" rid ="parameters">
			[ ... ]
		</div>
	</div>
-->
	<div class ="field">
		<div class = "field_label">
			Return Value:
		</div>
		<div class = "field_input" rid ="return-value">
			[ ... ]
		</div>
	</div>

	<embedded-script>
		<![CDATA[
		template_init : function(){
			this.GetAPIList().getContainer().style.height = "225px";
			this.createHandler("apiclick",0,0,1);
			this.GetAPIList().setResultHandler( this._prehandle_apiclick);
			this.RefreshPackageList();
		},
		GetAPIList : function(){
			return this.GetComponentByRID("available_api").GetWideSelect();
		},
		ChoosePackage : function(){
			var oSel = this.GetElementByRID("package_list");
			//var oFil = this.GetElementByRID("api_filter");
			var sText = oSel.options[oSel.selectedIndex].text;
			//oFil.style.display = (sText.match(/appcomp/i) ? "inline" : "none");
			this.GetAPIList().clearItems();
		  this.RefreshSelectedAPI(sText);
		},
		RefreshPackageList : function(){
			var xPack = org.cote.js.xml.getXml("/projects/engine/api/engine_api.xml");
			var oSel = this.GetElementByRID("package_list");
			oSel.options.length = 0;
			var aU = xPack.getElementsByTagName("indices")[0].getElementsByTagName("url");

			for(var i= 0; i <aU.length; i++){
				var sText = org.cote.js.xml.getInnerText(aU[i]).replace(/\.html$/i,"");
				oSel.options[i] = new Option(sText);
				if(sText.match(/appcomp/i)) oSel.selectedIndex = i;
			}
			this.ChoosePackage();
		},
		RefreshSelectedAPI : function(sPackage){
			var xPackage = org.cote.js.xml.getXml("/projects/engine/api/" + sPackage + ".xml");
			org.cote.js.xml.setInnerXHTML(this.GetElementByRID("api_title"),"API " + sPackage);
			this.UnpackApi(xPackage,"static-class");
			this.UnpackApi(xPackage,"class");
		},
		UnpackApi : function(xPackage, sType){
			var aC = xPackage.getElementsByTagName(sType);
			var oList = this.GetAPIList();
			var bVirt = (this.GetElementByRID("api_filter").style.display != "none" && this.GetElementByRID("api_filter").selectedIndex == 1 ? 1 : 0);
			for(var c = 0; c < aC.length; c++){
				var oC = aC[c];
				var sTName = org.cote.js.xml.getInnerText(oC.getElementsByTagName("name")[0]);
				oList.addItem((sType + " " + sTName).toUpperCase());
				var aM = oC.getElementsByTagName("method");
				
				for(var i = 0; i < aM.length; i++){
					 if(bVirt && "1" != aM[i].getAttribute("virtual")) continue;
					 var oD = aM[i].getElementsByTagName("description")[0];
					 var oN = aM[i].getElementsByTagName("name")[0];
					 var aP = aM[i].getElementsByTagName("param");
					 var aR = aM[i].getElementsByTagName("return-value");
					 var aB = [];
					
					var sName = org.cote.js.xml.getInnerText(oN); 
					var vData = {name: sName,params:[],desc:org.cote.js.xml.getInnerText(oD),retDesc:"No return value",retType:"void"};
					 if(aR.length){
								vData.retType = aR[0].getAttribute("type");
								vData.retDesc = org.cote.js.xml.getInnerText(aR[0]);
								aB.push(vData.retType);
						}
					 else aB.push("void");
					
					 aB.push(" " + sName + "(");
					
					 for(var p = 0; p < aP.length; p++){
						if(p > 0) aB.push(", ");
						vData.params[p] = {name:aP[p].getAttribute("name"),type:aP[p].getAttribute("type"),desc:org.cote.js.xml.getInnerText(aP[p])};
						aB.push(vData.params[p].type);
					 }
					 aB.push(")");
					 oList.addItem(aB.join(""),vData);
				}
			}
		},
		_handle_apiclick : function(sEvent,oItem){
			var sDesc = "[ ... ]";
			var sRet = sDesc;

			if(oItem && oItem.data){
				 sDesc = oItem.data.desc;
				 sRet = oItem.data.retDesc;
				 if(sRet == "void") sRet = "No return value";
			}
			org.cote.js.xml.setInnerXHTML(this.GetElementByRID("description"),sDesc);
			org.cote.js.xml.setInnerXHTML(this.GetElementByRID("return-value"),sRet);
			
		}


  ]]>
	</embedded-script>
</Template>
