/*
* vtMenu 1.0
* (c) 2008 Piotr Stepniewski
* mail: pstepniewski@gmail.com
* www:  http://vt.home.pl/
* http://creativecommons.org/licenses/LGPL/2.1/
*/

function vtMenu() {

	var obj = new Object();

	obj.method = 'GET';
	obj.containerId = null;
	obj.parameters = new Object();
	obj.structure;
	obj.layout;
	obj.layoutElementsNames = new Array( "title", "spacer", "icon", "icon_sub", "params", "item", "container" );
	obj.layoutElementsImages = new Array();
	obj.res = null;
	obj.status = null;
	obj.statusText = '';
	obj.onSuccess = null;
	obj.onError = null;
	obj.onFatalError = null;
	obj.onFinalization = null;
	obj.xmlhttp = null;


	
	/**** Get ****/
	obj.Get = function( actPoint, sDepth, sArray )
	{
		if( !sDepth && obj.isset( 'vtMenu'+obj.containerId+'GetInProgress' ) ) return;
		eval( 'vtMenu'+obj.containerId+'GetInProgress = true' );
		
		if( typeof obj.structure != 'object' ) obj.structure = eval( 'vtMenu'+obj.containerId+'structure' );
		if( typeof obj.layout != 'object' ) obj.layout = eval( 'vtMenu'+obj.containerId+'layout' );
		//alert( obj.structure );
		
		if( !actPoint )
			actPoint = "0"; //actPoint = "0,1,0";
		if( typeof actPoint == 'string' )
			actPoint = actPoint.split(",");
			
		if( typeof sArray != 'object' )
			var s = obj.structure
		else
			var s = sArray;
		
		// sDepth
		if( !sDepth )
			sDepth = 0;
		
		// mPoint - split
		var mPoint = actPoint.slice( 0, sDepth + 1 );
		//alert( mPoint );
		
		//if( sDepth == 0 )
			//document.getElementById("Test2").innerHTML += "<div>"+mPoint+"</div>";
		
		// Przetwarzaj strukture
		var htmlItems = '';
		for( var sItemNo in s )// if( typeof structure[itemNo] == 'object' )
		{
			var sItemNo, sItem, sParams, sSubItems, lSpacer;
			sItemNo = Number( sItemNo ); // Zmien na cyfre
			
			if (isNaN(sItemNo)) continue;
			
			sItem = s[sItemNo];
			sParams = sItem["params"];
			sSubItems = sItem["subitems"];
			
			// iPoint - punkt aktualnego elementu
			mPoint[ sDepth + 1 ] = sItemNo;
			
			
			// HTML - SubItems
			if( typeof sSubItems == 'object' ) if( actPoint[ sDepth+1 ] == sItemNo )
			{
				sParams['subitems'] = obj.Get( actPoint, sDepth+1, sSubItems );
			}
			else
			{
				sParams['subitems'] = '';
			}
			
			// HTML - Title (testowo)
			/*
			if( typeof sParams['title'] == 'string' )
				sParams['title'] = sDepth+"."+sItemNo+". "+sParams['title']+": "+mPoint.join(",");
			*/
			
			// Spacer
			if( !sParams['spacer_disabled'] )
			{
				if( sItemNo < s.length - 1 ){ sParams['spacer'] = obj.layout[ sDepth ]['spacer']; }
			}
			
			// Mouse
			sParams['mexpand'] = "vtMenu.MOver({ containerId : '"+obj.containerId+"', actPoint : '"+mPoint.join(",")+"' })";
			sParams['mclose'] = "vtMenu.MOut({ containerId : '"+obj.containerId+"', actPoint : '"+mPoint.join(",")+"' })";
			
			// iState
			if( sParams["unactive"] )
				var iState = "unactive";
			else if( sItemNo == actPoint[ sDepth + 1 ] )
				var iState = "selected";
			else
				var iState = "active";
			
			// HTML - Item
			var htmlItem = obj.GetLayoutElement( 'item', iState, sDepth );
			
			// sParamsKeys
			var sParamsKeys = new Array;
			for( var a in sParams ) sParamsKeys.push( a );
			
			if( sParams["icon"] ) obj.layoutElementsImages.push(sParams["icon"]);
			
			// Podmień znaczniki w elementach
			for( var a in obj.layoutElementsNames )
			{
				var layElementName = obj.layoutElementsNames[a];
				
				// Przetwarzaj element layoutu
				if( typeof sParams[layElementName] == "string" && layElementName.indexOf("_active") == -1 && layElementName.indexOf("_unactive") == -1 && layElementName.indexOf("_selected") == -1 )
				{
					var htmlElement = obj.GetLayoutElement( layElementName, iState, sDepth );
					var tagsElement = obj.GetLayoutElementTags( htmlElement );
					
					for( var b in tagsElement )
					{
						var tagName = tagsElement[b];
												
						if( tagName != layElementName )
						{
							if( sParams[tagName] ){
								var tagValue = sParams[tagName];
							}else{
								var tagValue = '';
							}
							
						    if( typeof tagName == 'string' ) {	
								var regExp = new RegExp( '__' + tagName + '__', 'g' );
   	                            htmlElement = htmlElement.replace( regExp, tagValue );
                            }                              
							//if( sDepth == 1 && sItemNo == 0 ) document.getElementById("Test2").innerHTML += "<div>"+layElementName+":"+tagName+" ["+(tagValue.length)+"]</div>";
						}
					}
					
					var regExp = new RegExp( '__'+layElementName+'__', 'g' );
					htmlItem = htmlItem.replace( regExp, htmlElement );
				}
			}
			
			var tagsItem = obj.GetLayoutElementTags( htmlItem );
			for( var b in tagsItem )
			{
				var tagName = tagsItem[b];
				
								
				if( typeof sParams[tagName] == 'string' ){
					var tagValue = sParams[tagName]
				}else
					var tagValue = '';
					
                           
                //alert(tagName + ' --> ' + tagValue);                            
                //alert(htmlElement + ' --> ' + htmlElement.replace( regExp, tagValue ));
                if( typeof tagName == 'string' ) {					
                    var regExp = new RegExp( '__'+tagName+'__', 'g' );
                    htmlItem = htmlItem.replace( regExp, tagValue );
                }					

			}
			
			// htmlItems
			htmlItems += htmlItem;
		}
		
		var htmlContainer = obj.layout[ sDepth ]["container"];
		htmlContainer = htmlContainer.replace( /__items__/g, htmlItems );
		
		// result
		if( sDepth == 0 )
		{
			if( !obj.isset( 'vtMenu'+obj.containerId+'ImageCached' ) )
			{
				var ImageCacheHTML = "<div style='display:none;'>";
				for(var i=0;i<obj.layoutElementsImages.length;i++)
				{
					var Image = obj.layoutElementsImages[i];
					if( Image.substr(0,2) != "__" )
					{
						ImageCacheHTML += "<img src=\""+Image+"\">";
					}
				}
				ImageCacheHTML += "</div>";
				//document.body.innerHTML += ImageCacheHTML;
				eval( 'vtMenu'+obj.containerId+'ImageCache = ImageCacheHTML' );
				eval( 'vtMenu'+obj.containerId+'ImageCached = true' );
			}
			document.getElementById( obj.containerId ).innerHTML = htmlContainer;
			document.getElementById( obj.containerId ).innerHTML += eval( 'vtMenu'+obj.containerId+'ImageCache' );
			eval( 'vtMenu'+obj.containerId+'GetInProgress = undefined' );
			return true;
		}
		else
		{
			return htmlContainer;
		}
	}
	
	
	
	obj.GetLayoutElement = function( elName, elState, elDepth )
	{
		//alert( elDepth+","+elName+","+elState+"\n"+obj.layout[ elDepth ][ elName+"_"+elState ] );
		if( obj.layout[ elDepth ][ elName+"_"+elState ] )
			return obj.layout[ elDepth ][ elName+"_"+elState ];
		else
			return obj.layout[ elDepth ][ elName ];
	}
	
	
	
	obj.GetLayoutElementTags = function( html )
	{
		var html = html.split('__');
		var res = new Array;
		for( var a = 1; a < html.length; a+=2 )
		{
			res.push( html[a] );
		}
		res = obj.arrayUnique( res );
		return res;
	}
	
	
	
	obj.Xml2Str = function( xmlData, noRoot ){
		var res;
		
		if( typeof xmlData == 'string' ) return xmlData;
		
		try{ /* Firefox */
			res = (new XMLSerializer()).serializeToString(xmlData);
			if( res ) return res;
		}
		catch(e){};
		
		try{ /* IE */
			res = xmlData.xml;
			if( res ) return res;
		}
		catch(e){};
		
		obj.status = 100;
		obj.statusText += 'Xml2Str error\n';
		return null;
	}
	
	
	
	/**** blankXml ****/
	obj.blankXml = function(){
		
		try //Internet Explorer
		{
			res=new ActiveXObject("Microsoft.XMLDOM");
			return res;
		}
		catch(e) {
			
			try //Firefox, Mozilla, Opera, etc.
			{
				res=document.implementation.createDocument("","",null);
				return res;
			}
			catch(e) {
				
				try{ /* ActiveX enabled browsers */;
					res = new ActiveXObject("msxml.domdocument")
					return res;
				}
				catch(e){};
		}};
		
		return new Object();
	}
	
	
	
	/**** loadXml ****/
	obj.loadXml = function( xmlFile, storeVariable, afterMethod )
	{
		obj.xmlhttp=null;
		obj.parameters["xmlhttp_storeVariable"] = storeVariable;
		obj.parameters["xmlhttp_afterMethod"] = afterMethod;
		// code for IE7, Firefox, Mozilla, etc.
		if (window.XMLHttpRequest)
		{
			obj.xmlhttp=new XMLHttpRequest();
		}
		// code for IE5, IE6
		else if (window.ActiveXObject)
		{
			obj.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (obj.xmlhttp!=null)
	  {
			obj.xmlhttp.onreadystatechange = obj.loadXml_onResponse;
			obj.xmlhttp.open("GET",xmlFile,true);
			obj.xmlhttp.send(null);
		}
		else
		{
			obj.status = 101;
			alert("Your browser does not support XMLHTTP.");
		}
	}
	
	
	
	/**** loadXml_onResponse ****/
	obj.loadXml_onResponse = function()
	{
		if(obj.xmlhttp.readyState!=4) return;
		if(obj.xmlhttp.status!=200)
		{
			alert("Problem retrieving XML data, status = "+obj.xmlhttp.status);
			return false;
		}
		eval( obj.parameters["xmlhttp_storeVariable"]+" = obj.xmlhttp.responseXML" );
		eval( obj.parameters["xmlhttp_afterMethod"] );
		return true;
	}


	
	/**** loadXml_onDone ****/
	obj.loadXml_onDone = function()
	{
		obj.layout = obj.GetLayout();
		obj.structure = obj.GetStructure();
		eval( 'vtMenu'+obj.containerId+'layout = obj.layout' )
		eval( 'vtMenu'+obj.containerId+'structure = obj.structure' )
		obj.Get();
	}
	
	
	
	/**** GetXML ****/
	obj.Initialize = function()
	{
		obj.loadXml( obj.parameters["xmlFile"], "obj.structure", "obj.loadXml_onDone()" );
		return true;
	}
	
	
	
	/**** GetLayout ****/
	obj.GetLayout = function()
	{
		var res = new Array;
		var layoutElementsNodes = obj.structure.getElementsByTagName("layout")[0].getElementsByTagName("elements");
		for( var a = 0; a < layoutElementsNodes.length; a++)
		{
			var elementsNodes = layoutElementsNodes[a];
			var levelNo = elementsNodes.getAttribute('level');
			if( typeof res[ levelNo ] != 'object' ) res[ levelNo ] = new Array;
			
			for( var b = 0; b < elementsNodes.childNodes.length; b++)
			{
				var node = elementsNodes.childNodes[b];
				var elementName = node.nodeName;
				
				// Container, Item
				if(
					obj.inArray( elementName, obj.layoutElementsNames )
					||
					elementName.indexOf( "_active" ) > 0
					||
					elementName.indexOf( "_unactive" ) > 0 
					||
					elementName.indexOf( "_selected" ) > 0 
				){
					// layoutElementsnames (jesli nie istnieje ta nazwa w tablicy, np. w przypadku elementos _active, _unactive i _selected)
					if( !obj.inArray( elementName, obj.layoutElementsNames ) )
						obj.layoutElementsNames.unshift( elementName );
					
					// Params
					if( elementName == 'params' )
					{
						if( typeof res[ levelNo ]['params'] != 'object' ) res[ levelNo ]['params'] = new Array;
						var paramsNodes = node.getElementsByTagName("object")[0].getElementsByTagName("param");
						
						for( var c = 0; c < paramsNodes.length; c++ )
						{
							var paramName = paramsNodes[c].getAttribute("name");
							var paramValue = paramsNodes[c].getAttribute("value");
							res[ levelNo ]['params'][ paramName ] = paramValue;
							//alert( paramName + ": " + res[ levelNo ]['params'][ paramName ] );
						}
					}
					// Elementy layoutu (HTML)
					else
					{
						if( elementsNodes.childNodes[b].getElementsByTagName("*").length )
						{
							res[ levelNo ][elementName] = '';
							var nodeHtml = obj.Xml2Str( node );
							obj.GetLayout_HtmlImages( nodeHtml );
							res[ levelNo ][elementName] = nodeHtml.substr( elementName.length + 2,nodeHtml.indexOf( "</"+elementName ) - ( elementName.length + 2 ) );
							//res[ levelNo ][elementName] = obj.Xml2Str( node.getElementsByTagName('*')[0] ); // Jesli w nodzie sa inne nody
						}
						else
						{
							res[ levelNo ][elementName] = elementsNodes.childNodes[b].childNodes[0].nodeValue; // Jesli node zawiera tylko tekst bez zandych tagow
						}
						//if( elementName == 'title' ) alert( res[ levelNo ][elementName] );
					}
				}
			}
		}
		//alert( obj.layoutElementsNames );
		//alert( obj.layoutElementsImages );
		return res;
	}
	
	
	obj.GetLayout_HtmlImages = function(Str)
	{
		var Result = new Array();
		
		var Pattern0 = new RegExp("url","gi");
		var Pattern1 = "url";
		Str = Str.replace( Pattern0, Pattern1 );
		
		var Pattern0 = new RegExp("src","gi");
		var Pattern1 = "src";
		Str = Str.replace( Pattern0, Pattern1 );
		
		var Pattern0 = new RegExp("url|src","gi");
		Str = Str.split(Pattern0);
		for( var i=1; i<Str.length; i++ )
		{
			var Image = "";
			if( Str[i].substr(0,1) == "(" )
			{
				Image = Str[i].substr( 1, Str[i].indexOf(")") - 1 );
			}
			if( Str[i].substr(0,1) == "=" )
			{
				Image = Str[i].substr( 2 );
				Image = Image.substr( 0, Image.indexOf("\"") );
			}
			obj.layoutElementsImages.push( Image );
		}
	}
	

	// GetStructure //
	obj.GetStructure = function( structureXml, structureLevel )
	{
		var structArray = new Array;
		
		if( !structureXml )
		{
			structureXml = obj.structure.getElementsByTagName("structure")[0];
			structureLevel = 0;
		}
		
		var structItems = structureXml.getElementsByTagName("items")[0];
		if( structItems.getAttribute("disabled") == 1 ) return; // Jesli struktura zablokowana
		structItems = structItems.getElementsByTagName("item"); // Jesli struktura odblokowana
		
		for( var itemNo = 0; itemNo < structItems.length; itemNo++)
		{
			var structItem = structItems[itemNo];
			var structItemArray = new Array;
			
			// Params
			var itemParamsArray = new Array;
			var subNodes = structItem.getElementsByTagName("*")[0];
			while( subNodes != null && typeof subNodes == 'object' )
			{
				//alert( typeof subNodes.nodeName+":"+subNodes.nodeName );
				if( obj.strCompare( "param", subNodes.nodeName ) )
				{
					var paramName = subNodes.getAttribute("name");
					var paramValue = subNodes.getAttribute("value");
					itemParamsArray[ paramName ] = paramValue;
					//alert( paramName+" = "+itemParamsArray[ paramName ] );
				}
				if( subNodes.nodeName == 'item' || subNodes.nodeName == 'items' ) break;
				else subNodes = subNodes.nextSibling;
			}
			structItemArray["params"] = itemParamsArray;
			
			// Layout - dodaj elmenty do tablicy ze structure itemem
			structItemArray["layout"] = new Array;
			for( var a in obj.layoutElementsNames )
			{
				var layoutElementName = obj.layoutElementsNames[a];
				structItemArray["layout"][layoutElementName] = obj.layout[structureLevel][layoutElementName];
			}
			
			// Layout - powiel layouty na level nizej (jesli ich tam brakuje)
			if( obj.layout[structureLevel+1] == null )
			{
				obj.layout[structureLevel+1] = new Array;
				for( var a in obj.layoutElementsNames )
				{
					var layoutElementName = obj.layoutElementsNames[a];
					if( typeof obj.layout[structureLevel+1][layoutElementName] != 'string' || typeof obj.layout[structureLevel+1][layoutElementName] != 'object' )
						obj.layout[structureLevel+1][layoutElementName] = structItemArray["layout"][layoutElementName];
				}
			}
			
			// Debug
			//document.getElementById("Test1").innerHTML += "<div style='padding-left:"+(structureLevel*20)+"px'>"+itemParamsArray["title"]+"</div>";
			
			// SubItems
			var subItems = structItem.getElementsByTagName("items");
			var subItemsTotal = 0;
			if( subNodes != null && typeof subItems[0] == 'object' ) subItemsTotal = subItems[0].getElementsByTagName("item").length;
			if( subItemsTotal > 0 )
			{
				structItemArray["subitems"] = obj.GetStructure( structItem, structureLevel + 1 );
				itemNo += subItemsTotal;
			}
			structArray.push( structItemArray );
		}
		
		return structArray;
	}
	
	
	
	/**** appendAttribute ****/
	obj.attrAppend = function( nodeData, nodeName, attrName, attrValue )
	{
		return obj.attrSet( nodeData, nodeName, attrName, attrValue, true );
	}
	
	
	
	/**** addAttributes ****/
	obj.attrSet = function( nodeData, nodeName, attrName, attrValue, append )
	{
		// Ustal numer dziecka <div>, czyli pierwszego elementu w containerze
		var elementNodes = nodeData.getElementsByTagName( nodeName );
		//while( elNo < nodeData.childNodes.length && typeof nodeData.childNodes[ elNo ] == 'object' )
		for( var elNo = 0; elNo < elementNodes.length; elNo++ )
		{
			//alert( elNo+": "+elementNodes[ elNo ].nodeName );
			if( elementNodes[ elNo ].nodeName.toLowerCase() == nodeName ){ break; }
			else if( elNo > 100 || elNo == elementNodes.length - 1 ) return nodeData;
		}
		//alert( elNo );
		
		// Nadaj identyfikator containerowi
		if( append )
		{
			attrValue = elementNodes[elNo].getAttribute( attrName )+''+attrValue;
		}
		elementNodes[elNo].setAttribute( attrName, attrValue );
		return nodeData;
	}
	
	
	
	obj.getElementId = function( elName, itemPath ){
		if( typeof itemPath == 'object' ) itemPath = itemPath.join(",");
		return 'vtMenu_'+obj.containerId+':'+itemPath;
	}
	
	
	
	/**** strCompare ****
		str0 - sstring przeszukiwany
		str1 - string poszukiwany
	*/
	obj.strCompare = function( str0, str1 ){
		var pattern = '';
		// Wildcard na poczatku
		if( str1.indexOf( "*" ) == 0 )
		{
			str1 = str1.substr( str1.indexOf( "*" ) + 1 );
		}
		// Brak poczatkowego wildcarda (szukaj od poczatku stringu)
		else
		{
			pattern += '^';
		}
		// WIldcard w ciagu (dalej niz pierwszy znak)
		if( str1.indexOf( "*" ) > 0 )
		{
			str1 = str1.substr( 0, str1.lastIndexOf( "*" ) );
			pattern += str1;
		}
		// Brak wildcarda w ciagu (szukaj do konca stringu)
		else
		{
			pattern += str1+'$';
		}
		// Stworz pattern regExp
		pattern = new RegExp(pattern,'g');
		// Zwroc wynik
		return pattern.test( str0 );
	}
	
	
	
	/**** MOut ****/
	obj.MOut = function( outPoint )
	{
		var MouseOut_tout = false;
		if( obj.isset( 'vtMenu'+obj.containerId+'MouseOut_tout' ) )
			MouseOut_tout = eval( 'vtMenu'+obj.containerId+'MouseOut_tout' );
		
		if( MouseOut_tout == false ){
			var _obj = obj;
			MouseOut_tout = window.setTimeout( _obj._MOut, 500 );
			eval( 'vtMenu'+obj.containerId+'outPoint = outPoint' );
			eval( 'vtMenu'+obj.containerId+'MouseOut_tout = MouseOut_tout' );
		}
	}
	obj._MOut = function()
	{
		var outPoint = eval( 'vtMenu'+obj.containerId+'outPoint' );
		var actPoint = eval( 'vtMenu'+obj.containerId+'actPoint' );
		
		if( actPoint == outPoint ){
			// Debug
			//document.getElementById( "Test2" ).innerHTML += "Out: "+outPoint+"<br>";
			eval( 'vtMenu'+obj.containerId+'actPoint = "0";' );
			obj.Get( "0" );
		}
	}
	
	
	
	/**** MOver ****/
	obj.MOver = function( actPoint )
	{
		if( !obj.isset( 'vtMenu'+obj.containerId+'actPointArray' ) )
			eval( 'vtMenu'+obj.containerId+'actPointArray = new Array' );
		
		// Debug
		//document.getElementById( "Test2" ).innerHTML += "Over: "+actPoint+"<br>";
			
		if( obj.isset( 'vtMenu'+obj.containerId+'MouseOut_tout' ) && eval('vtMenu'+obj.containerId+'MouseOut_tout') > 0 )
		{
			var MouseOut_tout = eval( 'vtMenu'+obj.containerId+'MouseOut_tout' );
			eval( 'vtMenu'+obj.containerId+'MouseOut_tout = false' );
			clearTimeout( MouseOut_tout );
			MouseOut_tout = undefined;
		}
		
		// Jesli ten element nie byl wczesniej wybrany (w poprzednim mOver)
		if(
			obj.isset( 'vtMenu'+obj.containerId+'actPoint' ) && actPoint != eval( 'vtMenu'+obj.containerId+'actPoint' )
			||
			!obj.isset( 'vtMenu'+obj.containerId+'actPoint' )
		)
		{
			// Pokaz dzieci (submenu)
			//alert(actPoint);
			obj.Get( actPoint );
		}
		
		// Zapisz mienne globalnie do wykorzystania w innym wcieleniu tej klasy :)
		eval( 'vtMenu'+obj.containerId+'actPoint = actPoint;' );
	}
	
	
	
	/**** isset ****/
	obj.isset = function( varname ){
		return( typeof( window[varname] ) != 'undefined' );
	}
	
	
	
	/**** inArray ****/
	obj.inArray = function( val, arr )
	{
		for(var i in arr){if(arr[i] == val){return true;}}return false;
	}
	
	
	// Array.unique( strict ) - Remove duplicate values
	obj.arrayUnique = function( arr )
	{
		if( typeof arr != 'object' ) return arr;
		var a = new Array, i, l = arr.length;
		try{
			for( i=0; i<l; i++ )
			{
				//if( a.indexOf( arr[i] ) < 0 )
				if( a.join(",").indexOf( arr[i] ) < 0 )
				{
					a.push( arr[i] );
				}
			}
			return a;
		}
		catch (e){ alert( arr.length ) }
	};
	
	
	
	/**** run ****/
	obj.run = function(){
		
		if
		(obj.method == "Initialize" )
			obj.res = obj.Initialize();
		else if
		(obj.method == "Get" )
			obj.res = obj.Get( obj.parameters['actPoint'] );
		else if
		(obj.method == "MOver" )
			obj.res = obj.MOver( obj.parameters['actPoint'] );
		else if
		(obj.method == "MOut" )
			obj.res = obj.MOut( obj.parameters['actPoint'] );
		else
			obj.status = 10000;
		
		if
		( obj.status == null )
			obj.raiseEvent("Success", obj);
		else
			obj.raiseEvent("Error", obj);
	};



	/**** handleArguments ****/
	obj.handleArguments = function(args){
		for (a in args){
			if (typeof obj[a] == "undefined")
				obj.parameters[a] = args[a]; else {
				if (a != "parameters" && a != "headers")
					obj[a] = args[a]; else
					for (b in args[a])
						obj[a][b] = args[a][b];
			}
		}
		//obj.method = obj.method.toUpperCase();
	};



	/**** raiseEvent ****/
	obj.raiseEvent = function(name) {
			var args = [];
			for (var i = 1; i < arguments.length; i++)
					args.push(arguments[i]);
			if (typeof obj["on" + name] == "function")
					obj["on" + name].apply(null, args);
			if (name == "FatalError")
					obj.raiseEvent("Finalization", obj);
	};



	/**** return ****/
	return obj;
};


/**** Initialize ****/
vtMenu.Initialize = function(args){
	return vtMenu.handleRequest( "Initialize", args );
};


/**** Get ****/
vtMenu.Get = function(args){
	return vtMenu.handleRequest( "Get", args );
};


/**** mOut ****/
vtMenu.MOut = function(args){
	return vtMenu.handleRequest( "MOut", args );
}


/**** mOver ****/
vtMenu.MOver = function(args){
	return vtMenu.handleRequest( "MOver", args );
}


/**** handleRequest ****/
vtMenu.handleRequest = function(requestType, args){
	if (typeof args == "undefined" || args == null)
		return -1;
	var request = new vtMenu();
	window.vtmenu_obj = request;
	request.method = requestType;
	request.handleArguments(args);
	return request.run();
};










