/************************************************
**
**	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;

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;
}


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";
	
}


CEngine.prototype.setAbsPath = function( ) {
	this.m_sAbsPath = arguments[0];
}


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 = "images/toolbar/";
	var sHead = "";
	
	for( var iC = 0; iC < p_aButton.length; iC++ ) {
		if( iC > 10 ) break;
		var aTemp = p_aButton[iC].split( "_" );
		var sTaskName = aTemp[0];
		if( aTemp.length > 1 ) {
			var sCallback = aTemp[1];
			//var sImgCallback = "onclick = \"oRootEngine.doAsyncTask( '" + sTaskName + "', '" + sCallback + "' ); oRootEngine.getToolbar( );\" ";
		} else {
			//var sImgCallback = "onclick = \"oRootEngine.doSyncTask( '" + sTaskName + "', 'mainForm' );\" ";
		}
		
		var sName1 = "b_" + sTaskName + ".jpg";
		var sName2 = "b_" + sTaskName + "H.jpg";
		var sImgCallback = "onmouseover = \" this.src = '" + sPath + sName2 + "'; this.style.cursor = 'pointer';\" onmouseout = \"this.src = '" + sPath + sName1 + "';\" ";
		
		if( sHtml != "" ) sHead = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
		else sHead = "";
		
		//sHtml += sHead + "[&nbsp;<a id=\"btn_" + sTaskName + "\"  class=\"aToolbar\" href=\"#\">" + sTaskName + "</a>&nbsp;]";
		sHtml += "<input type=\"button\" id=\"btn_" + sTaskName + "\" value=\"" + sTaskName + "\" 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 sResponseType = this.sys_sResponseType;
	
	if( this.m_sSection == 'front' ) {
		var sUrl = this.m_sAbsPath + this.sys_sUrl;
	}
	else if( this.m_sSection == 'back' ) {
		var sUrl = this.m_sAbsPath + 'administrator/' + 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( );
	
	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;
	
	if( this.m_sSection == 'front' ) {
		var sUrl = this.m_sAbsPath + this.sys_sUrl;
	}
	else if( this.m_sSection == 'back' ) {
		var sUrl = this.m_sAbsPath + 'administrator/' + 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( );
	
	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;
	}
	
	oForm.submit( );
}


CEngine.prototype.doQueryTask = function( ) {
	
	var p_sFile = this.sys_sQueryUrl + '?';
	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;
	}
	
	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.enableChangeAppPath = function( bEnabled ) {
	this.m_bEnableChangeAppPath = bEnabled;	
}


CEngine.prototype.changeAppPath = function( ) {
	var oDiv = document.getElementById( "appPathDiv" );
	var sHtml = "<img src=\"images/menubar/comp.png\" title=\"Option\" />&nbsp;[&nbsp;<span class=\"appPathOption\">" + this.sys_sOption + "</span>&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
	sHtml += "<img src=\"images/menubar/act.png\" title=\"Activity\" />&nbsp;[&nbsp;<span class=\"appPathAct\">" + this.sys_sAct + "</span>&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
	sHtml += "<img src=\"images/menubar/task.png\" title=\"Task\" />&nbsp;[&nbsp;<span class=\"appPathTask\">" + this.sys_sTask + "</span>&nbsp;]";
	oDiv.innerHTML = sHtml;	
}


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;
	}
}