/************************************************
**
**	CEngine class definition.
**	Developed by FunnyFox Group -FFG Co Ltd-.
**
************************************************/



CEngine.s_iConnNum = 0;

CEngine.prototype.sys_sOption;
CEngine.prototype.sys_sAct;
CEngine.prototype.sys_sTask;

CEngine.prototype.sys_sPrevOption;
CEngine.prototype.sys_sPrevAct;
CEngine.prototype.sys_sPrevTask;

CEngine.prototype.sys_sUrl;
CEngine.prototype.sys_sMethod;
CEngine.prototype.sys_sResponseType; // text | xml

CEngine.prototype.sys_sQueryUrl;

CEngine.prototype.m_aConn;
CEngine.prototype.m_oParam;

CEngine.prototype.m_bEnableChangeAppPath
CEngine.prototype.m_oToolbarObject;

CEngine.prototype.m_sSection;

CEngine.prototype.m_sIncPath;
CEngine.prototype.m_sAbsPath;

CEngine.prototype.m_sIncPath;
CEngine.prototype.m_sSitePath;
CEngine.prototype.m_sAbsPath;

CEngine.prototype.m_sCompPath;
CEngine.prototype.m_sCompClassPath;
CEngine.prototype.m_sAbsCompPath;
CEngine.prototype.m_sAbsCompClassPath;


function CEngine( ) {
	this.sys_sOption = arguments[0];
	this.sys_sAct = arguments[1];
	this.sys_sTask = arguments[2];
	
	this.sys_sPrevOption = arguments[0];
	this.sys_sPrevAct = arguments[1];
	this.sys_sPrevTask = arguments[2];
	
	this.m_sSection = arguments[3];
	this.m_sIncPath = arguments[4];
	
	this.sys_sUrl = "index.php";
	this.sys_sMethod = "POST";
	this.sys_sResponseType = "text";
	
	this.sys_sQueryUrl = "index.php";
	
	this.m_aConn = new Array( );
	this.m_oParam = new Object( );
	
	this.m_bEnableChangeAppPath = true;
	
	this.setCompPath();
}


CEngine.prototype.setSysInfo = function( ) {
	
	this.sys_sPrevOption = this.sys_sOption;
	this.sys_sPrevAct = this.sys_sAct;
	this.sys_sPrevTask = this.sys_sTask;
	
	this.sys_sOption = arguments[0];
	this.sys_sAct = arguments[1];
	this.sys_sTask = arguments[2];
	
	this.sys_sUrl = "index.php";
	this.sys_sMethod = "POST";
	this.sys_sResponseType = "text";
	
	this.sys_sQueryUrl = "index.php";
	
	this.setCompPath();
	
}


CEngine.prototype.setSitePath = function( ) {
	this.m_sSitePath = arguments[0];
	if( this.m_sSection == 'front' ) {
		this.m_sAbsPath = this.m_sSitePath;
	}
	else {
		this.m_sAbsPath = this.m_sSitePath + 'administrator/';	
	}
	
	this.setCompPath();
}


CEngine.prototype.setCompPath = function( ) {
	this.m_sCompPath = this.m_sIncPath + 'components/comp_' + this.sys_sOption + '/';
	this.m_sCompClassPath = this.m_sCompPath + '/classes/';
	
	this.m_sAbsCompPath = this.m_sSitePath + 'components/comp_' + this.sys_sOption + '/';
	this.m_sAbsCompClassPath = this.m_sAbsCompPath + '/classes/';
}


CEngine.prototype.setQueryUrl = function( ) { 
	this.sys_sQueryUrl = arguments[0];
}


CEngine.prototype.setUrl = function( ) { 
	this.sys_sUrl = arguments[0];
}


CEngine.prototype.setOption = function( ) { 
	this.sys_sOption = arguments[0];
}


CEngine.prototype.setAct = function( ) { 
	this.sys_sAct = arguments[0];
}


CEngine.prototype.setTask = function( ) { 
	this.sys_sPrevTask = this.sys_sTask;
	this.sys_sTask = arguments[0];
}


CEngine.prototype.setResponseType = function( ) { 
	this.sys_sResponseType = arguments[0];
}


CEngine.prototype.setParam = function( p_oObject ) {
	this.m_oParam = p_oObject;
}


CEngine.prototype.setToolbar = function( p_oToolbarObject ) {
	this.m_oToolbarObject = p_oToolbarObject;
	loadToolbar( "" );
	this.getToolbar( );
}


CEngine.prototype.getToolbar = function( ) {
	if( this.m_oToolbarObject && this.m_oToolbarObject.m_aProp ) {
		var aTask = this.m_oToolbarObject.m_aProp;
		for( var iC = 0; iC < aTask.length; iC += 2 ) {
			if( this.sys_sTask == aTask[iC] ) {
				this.drawToolbar( aTask[iC + 1] );
				break;
			}	
		}
		
	} else {
		loadToolbar( "" );
	}
}


CEngine.prototype.drawToolbar = function( p_aButton ) {
	var sHtml = "";
	var sPath = this.m_sAbsPath + "images/toolbar/";
	var sHead = "";
	
	for( var iC = 0; iC < p_aButton.length; iC++ ) {
		if( iC > 5 ) break;
		var aTemp = p_aButton[iC];
		var sTaskTitle = aTemp[0];
		var sTaskName = aTemp[1];
		if( aTemp.length > 1 ) {
			var sCallback = aTemp[1];
		} 
		
		if( sHtml != "" ) sHead = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
		else sHead = "";
		
		sHtml += "<input type=\"button\" id=\"btn_" + sTaskName + "\" value=\"" + sTaskTitle + "\" class=\"btnToolbar\" />&nbsp;&nbsp;";
	}
	
	loadToolbar( sHtml );
}


CEngine.prototype.doAsyncTask = function( ) {
	var oCore = new Object( );
	
	switch( arguments.length  ) {
		case 2:
			p_oCore = arguments[0];
			p_sCallback = arguments[1];
			
			if( p_oCore instanceof Object ) {
				
				if( p_oCore.sys_sOption ) {
					oCore.sys_sOption = p_oCore.sys_sOption;
					this.sys_sPrevOption = this.sys_sOption;
					this.sys_sOption = p_oCore.sys_sOption;
				}
				else oCore.sys_sOption = this.sys_sOption;
				
				if( p_oCore.sys_sAct ) {
					oCore.sys_sAct = p_oCore.sys_sAct;
					this.sys_sPrevAct = this.sys_sAct;
					this.sys_sAct = p_oCore.sys_sAct;
				}
				else oCore.sys_sAct = this.sys_sAct;
				
				if( p_oCore.sys_sTask ) {
					oCore.sys_sTask = p_oCore.sys_sTask;
					this.sys_sPrevTask = this.sys_sTask;
					this.sys_sTask = p_oCore.sys_sTask;
				}
				else {
					oCore.sys_sTask = this.sys_sTask;
				}	
				
			} else {
				oCore.sys_sOption = this.sys_sOption;
				oCore.sys_sAct = this.sys_sAct;
				oCore.sys_sTask = p_oCore;
				this.sys_sPrevTask = this.sys_sTask;
				this.sys_sTask = p_oCore;	
			}
			break;
			
		case 4:
			p_sCallback = arguments[3];
			
			oCore.sys_sOption = arguments[0];
			oCore.sys_sAct = arguments[1];
			oCore.sys_sTask = arguments[2];
			
			this.sys_sPrevOption = this.sys_sOption;
			this.sys_sPrevAct = this.sys_sAct;
			this.sys_sPrevTask = this.sys_sTask;
			
			this.sys_sOption = arguments[0];
			this.sys_sAct = arguments[1];
			this.sys_sTask = arguments[2];
			break;
	}
	
	oCore.sys_sPrevTask = this.sys_sPrevTask;
	
	var sCoreObj = JSON.stringify( oCore );
	var sParamObj = JSON.stringify( this.m_oParam );
	
	/* XmlHttpRequest */
	this.m_aConn[CEngine.s_iConnNum] = new CXmlHttpContainer( );
	var sMethod = this.sys_sMethod;
	var sUrl = this.m_sAbsPath + this.sys_sUrl;
	
	var sQuery = "bAjax=true&sResponseType=" + sResponseType + "&sCoreObj=" + sCoreObj + "&sParamObj=" + sParamObj;
	
	if( p_sCallback ) sCallback = p_sCallback;
	else sCallback = "defaultCallback";
	
	this.m_aConn[CEngine.s_iConnNum].registerCallback( "onreadystatechange", sCallback );
	this.m_aConn[CEngine.s_iConnNum].sendRequest( sMethod, sUrl, sQuery );
	
	if( this.m_bEnableChangeAppPath )
		this.changeAppPath( );
	
	this.setCompPath();
	
	CEngine.s_iConnNum++;
	
	var iIndex = CEngine.s_iConnNum - 1;
	return this.m_aConn[iIndex];
}


CEngine.prototype.doAsyncTaskImp = function( ) {
	var oCore = new Object( );
	
	switch( arguments.length  ) {
		case 2:
			p_oCore = arguments[0];
			p_sCallback = arguments[1];
			
			if( p_oCore instanceof Object ) {
				
				if( p_oCore.sys_sOption ) {
					oCore.sys_sOption = p_oCore.sys_sOption;
					this.sys_sPrevOption = this.sys_sOption;
					this.sys_sOption = p_oCore.sys_sOption;
				}
				else oCore.sys_sOption = this.sys_sOption;
				
				if( p_oCore.sys_sAct ) {
					oCore.sys_sAct = p_oCore.sys_sAct;
					this.sys_sPrevAct = this.sys_sAct;
					this.sys_sAct = p_oCore.sys_sAct;
				}
				else oCore.sys_sAct = this.sys_sAct;
				
				if( p_oCore.sys_sTask ) {
					oCore.sys_sTask = p_oCore.sys_sTask;
					this.sys_sPrevTask = this.sys_sTask;
					this.sys_sTask = p_oCore.sys_sTask;
				}
				else {
					oCore.sys_sTask = this.sys_sTask;
				}	
				
			} else {
				oCore.sys_sOption = this.sys_sOption;
				oCore.sys_sAct = this.sys_sAct;
				oCore.sys_sTask = p_oCore;
				this.sys_sPrevTask = this.sys_sTask;
				this.sys_sTask = p_oCore;	
			}
			break;
			
		case 4:
			p_sCallback = arguments[3];
			
			oCore.sys_sOption = arguments[0];
			oCore.sys_sAct = arguments[1];
			oCore.sys_sTask = arguments[2];
			
			this.sys_sPrevOption = this.sys_sOption;
			this.sys_sPrevAct = this.sys_sAct;
			this.sys_sPrevTask = this.sys_sTask;
			
			this.sys_sOption = arguments[0];
			this.sys_sAct = arguments[1];
			this.sys_sTask = arguments[2];
			break;
	}
	
	oCore.sys_sPrevTask = this.sys_sPrevTask;
	
	var sCoreObj = JSON.stringify( oCore );
	var sParamObj = JSON.stringify( this.m_oParam );
	
	/* XmlHttpRequest */
	this.m_aConn[CEngine.s_iConnNum] = new CXmlHttpContainer( );
	var sMethod = this.sys_sMethod;
	var sResponseType = this.sys_sResponseType;
	var sUrl = this.m_sAbsPath + this.sys_sUrl;
	
	var sQuery = "bAjax=true&sResponseType=" + sResponseType + "&sCoreObj=" + sCoreObj + "&sParamObj=" + sParamObj;
	
	this.m_aConn[CEngine.s_iConnNum].iOnreadystatechangeCallback( p_sCallback );
	this.m_aConn[CEngine.s_iConnNum].sendRequest( sMethod, sUrl, sQuery );
	
	if( this.m_bEnableChangeAppPath )
		this.changeAppPath( );
	
	this.setCompPath();
	
	CEngine.s_iConnNum++;
	
	var iIndex = CEngine.s_iConnNum - 1;
	return this.m_aConn[iIndex];
}


CEngine.prototype.doSyncTask = function( ) { 
	
	switch( arguments.length ) {
		case 1:
			var p_sTask = arguments[0];
			var oForm = document.getElementById( 'mainForm' );
			oForm.sys_sOption.value = this.sys_sOption;
			oForm.sys_sAct.value = this.sys_sAct;
			oForm.sys_sTask.value = p_sTask;
			break;
		case 2:
			var p_sFormId = arguments[0];
			var p_sTask = arguments[1];
			var oForm = document.getElementById( p_sFormId );
			oForm.sys_sOption.value = this.sys_sOption;
			oForm.sys_sAct.value = this.sys_sAct;
			oForm.sys_sTask.value = p_sTask;
			break;
		case 3:
			var p_sFormId = arguments[0];
			var p_sOption = arguments[1];
			var p_sTask = arguments[2];
			var oForm = document.getElementById( p_sFormId );
			oForm.sys_sOption.value = p_sOption;
			oForm.sys_sAct.value = this.sys_sAct;
			oForm.sys_sTask.value = p_sTask;
			break;
		case 4:
			var p_sFormId = arguments[0];
			var p_sOption = arguments[1];
			var p_sAct = arguments[2];
			var p_sTask = arguments[3];
			var oForm = document.getElementById( p_sFormId );
			oForm.sys_sOption.value = p_sOption;
			oForm.sys_sAct.value = p_sAct;
			oForm.sys_sTask.value = p_sTask;
			break;
	}
	
	this.setCompPath();
	
	oForm.submit( );
}


CEngine.prototype.doQueryTask = function( ) {
	
	var sUrl = this.m_sAbsPath + this.sys_sQueryUrl;
	
	var p_sFile = sUrl + '?';
	
	switch( arguments.length ) {
		case 1:
			var p_sOption = this.sys_sOption;
			var p_sAct = this.sys_sAct;
			var p_sTask = arguments[0];
			var p_sQuery = '';
			break;
		case 2:
			var p_sOption = this.sys_sOption;
			var p_sAct = this.sys_sAct;
			var p_sTask = arguments[0];
			var p_sQuery = arguments[1];
			break;
		case 3:
			var p_sOption = arguments[0];
			var p_sAct = this.sys_sAct;
			var p_sTask = arguments[1];
			var p_sQuery = arguments[2];
			break;
		case 4:
			var p_sOption = arguments[0];
			var p_sAct = arguments[1];
			var p_sTask = arguments[2];
			var p_sQuery = arguments[3];
			break;
	}
	
	this.setCompPath();
	
	if( !p_sQuery ) p_sQuery = '&' + p_sQuery;
	document.location.href = p_sFile + 'sys_sOption=' + p_sOption + '&sys_sAct=' + p_sAct + '&sys_sTask=' + p_sTask + p_sQuery;
	
}


CEngine.prototype.include = function( src ) {
	var path = this.m_sAbsCompPath + 'js/';
	
	include( path + src );
}


CEngine.prototype.enableChangeAppPath = function( bEnabled ) {
	this.m_bEnableChangeAppPath = bEnabled;	
}


CEngine.prototype.changeAppPath = function( ) {
	
}


CEngine.prototype.changeAppTitle = function( appTit ) {
		
}


CEngine.prototype.changePageTitle = function( pageTit ) {
	document.title = pageTit;
}


CEngine.prototype.clear = function( ) {
	if( this.m_aConn ) {
		for( var iC = 0; iC < this.m_aConn.length; iC++ ) {
			if( this.m_aConn[iC] ) this.m_aConn[iC].clear( );
		}
		//delete this.m_aConn;
	}
}