/*
JavaScript Proxy Data Object
<?xml version='1.0' encoding='Big5'?>


*/

// ProxyDataObject
function DDO() {
    
    this.xmlDoc = null;
    this.xmlHttp = null;
    
    this.debugMode = false;
    
    var ndRoot = null;
    
    var strXmlTemplate = "";
    strXmlTemplate += "<?xml version='1.0' encoding='Big5'?>";
    strXmlTemplate += "<Root>";
    strXmlTemplate += "<Bean/>";
    strXmlTemplate += "<Data/>";
	strXmlTemplate += "<progId/>";
	strXmlTemplate += "<authUser/>";
    strXmlTemplate += "</Root>";
    
    
    this.init = function() {
        this.xmlDoc = strToXmlObj(strXmlTemplate);
        this.xmlHttp = getXmlHttp();
        
        ndRoot = this.xmlDoc.selectSingleNode("//Root");
    };
    
    this.setAction = function () {
    	this.xmlDoc.selectSingleNode("//Root/Bean").text = arguments[0];
    };
        
    this.setExecuteScript = function() {
    
    	var valueObjName = arguments[0];
    	var strScript = arguments[1];
    	
    	var ndValueObj = null;
    	var ndExecuteScript = null;
    	
    	if ( !this.xmlDoc.selectSingleNode("//Root/Data/" + valueObjName) ) {
    		ndValueObj = this.xmlDoc.createElement(valueObjName);
    		this.xmlDoc.selectSingleNode("//Root/Data").appendChild(ndValueObj);
    	} else {
    		ndValueObj = this.xmlDoc.selectSingleNode("//Root/Data/" + valueObjName);
    	}

    	if ( !ndValueObj.selectSingleNode("ExecuteScript") ) {
    		ndExecuteScript = this.xmlDoc.createElement("ExecuteScript");
    		ndValueObj.appendChild(ndExecuteScript);
    	} else {
    		ndExecuteScript = ndValueObj.selectSingleNode("ExecuteScript");
    	}
    	ndExecuteScript.text = arguments[1];    	

 	
    	
    };
    
    this.setValueObj = function() {
    	
    	var valueObjName = arguments[0];
    	
    	var ndValueObj = null;
    	
    	if ( !this.xmlDoc.selectSingleNode("//Root/Data/" + valueObjName) ) {
    		ndValueObj = this.xmlDoc.createElement(valueObjName);
    		this.xmlDoc.selectSingleNode("//Root/Data").appendChild(ndValueObj);
    	}
    	
    
    };
    
    this.setProgId = function() {
    	var progId = arguments[0];
    	
    	var ndValueObj = null;
    	
    	if ( !this.xmlDoc.selectSingleNode("//Root/progId") ) {
    		ndValueObj = this.xmlDoc.createElement("progId");
    		this.xmlDoc.selectSingleNode("//Root").appendChild(ndValueObj);
    	}
    	this.xmlDoc.selectSingleNode("//Root/progId").text = progId;
    };

    this.setAuthUser = function() {
    	var AuthUser = arguments[0];
    	
    	var ndValueObj = null;
    	
    	if ( !this.xmlDoc.selectSingleNode("//Root/authUser") ) {
    		ndValueObj = this.xmlDoc.createElement("authUser");
    		this.xmlDoc.selectSingleNode("//Root").appendChild(ndValueObj);
    	}
    	this.xmlDoc.selectSingleNode("//Root/authUser").text = AuthUser;
    };

	this.setDebug = function () {
		this.debugMode = arguments[0];
	}
    
    this.asXml = function () {
    	return this.xmlDoc.xml.replaceAll("><", ">\n<");
    }
    
    this.send = function () {
    
    	var strRtnXml = "";
    	
    	if ( this.debugMode == true) {
    		alert(this.xmlDoc.xml);
		}
		
		var urlIndex = 0;
		if (self.location.pathname.substring(0,1)=="/") {
			urlIndex = 1;
		}
		
		//var urlIndex = 1;

    	this.xmlHttp.Open("POST", "/" + self.location.pathname.split("/")[urlIndex] + "/Servlet/Controller.do", false);
    	this.xmlHttp.setRequestHeader("Content-Type", "text/xml;charset=big5");
    	this.xmlHttp.send(this.xmlDoc);
    	
    	//alert(this.xmlHttp.responseXML.xml);
    	
    	return this.xmlHttp.responseXML;
    			
	};
    
	// 2005-09-17 ????
	// ?? Row ? DDO ???? ValueObj ?
	this.appendRow = function() {
	
        var valueObjName = arguments[0];
        var oRow = arguments[1];
        //var fieldElements = arguments[1];
        
        //var fieldAry = fieldElements.elements;
        var fieldAry = oRow.fields;
        
        var ndValueObj = null;
        var ndRow = null;
        var ndField = null;
        
        var strFieldName = "";
        var strFieldValue = "";
        var strFieldType = "";
        
        var iCounter = 0;
        
        if ( !this.xmlDoc.selectSingleNode("//Root/Data/" + valueObjName) ) {
        	ndValueObj = this.xmlDoc.createElement(valueObjName);
        	this.xmlDoc.selectSingleNode("//Root/Data").appendChild(ndValueObj);
        }
        
        ndValueObj = ndRoot.selectSingleNode("Data/" + valueObjName);
        
        ndRow = this.xmlDoc.createElement("Row");
        
        for (iCounter = 0; iCounter < fieldAry.length; iCounter++) {
            strFieldName = fieldAry[iCounter][0];
            strFieldValue = fieldAry[iCounter][1];
            strFieldType = fieldAry[iCounter][2];
            
            if ( strFieldName == "Query" ) {
            	ndField = this.xmlDoc.createElement("Query");
            	ndField.text = strFieldValue;	
            } else if ( strFieldName == "pageIndex" ) { 
            	ndField = this.xmlDoc.createElement("pageIndex");
            	ndField.text = strFieldValue;          
            } else if ( strFieldName == "parm" ) {
            	ndField = this.xmlDoc.createElement("parm");
            	if (strFieldType != "") {
            		ndField.setAttribute("type", strFieldType);
            	}
            	ndField.text = strFieldValue;
            } else {
            	ndField = this.xmlDoc.createElement("field");
            	ndField.setAttribute("name", strFieldName);
            	if (strFieldType != "") {
            		ndField.setAttribute("type", strFieldType);
            	}
            	ndField.text = strFieldValue;
            }
            
            ndRow.appendChild(ndField);
        }
        
        ndValueObj.appendChild(ndRow);  
        ndRow.setAttribute("index", ndValueObj.selectNodes("Row").length);  
 
	};    
    
}

// xml Row Object
function Row() {

	this.fields = new Array();
	
	// ??????
	this.appendField = function() {
		this.fields[this.fields.length] = new Array(arguments[0], arguments[1], arguments[2]);
	};
	
	// ????????
	this.appendFField = function() {
	
		var oForm = arguments[0];
		var strFieldName = arguments[1];
		var strFieldValue = "";
		var orgDataType = "";
		var javaType = "";
		var oField = null;

		oField = oForm.elements(strFieldName);
		
		if ( oField.tagName ) {

			if ( oField.tagName.toLowerCase() != "button" ) {
			
				if ( oField.tagName.toLowerCase() == "input") {
					if ( oField.type.toLowerCase() != "button" && oField.type.toLowerCase() != "submit" && oField.type.toLowerCase() != "reset" ) {
						orgDataType = getDataType( oField );
						strFieldValue = oField.value;
						
					}
				} else {
					orgDataType = getDataType( oField );
					strFieldValue = oField.value;
				
				}
			
			}

			
		} else {
			orgDataType = getDataType(oField[0]);
			strFieldValue = "";
			for ( i = 0; i < oField.length; i++ ) {
				if ( oField[0].type.toLowerCase() == "checkbox" || oField[0].type.toLowerCase() == "radio" ) {
					if ( oField[i].checked == true ) {
						if ( strFieldValue != "" ) {
							strFieldValue += ",";
						} 					
						strFieldValue += oField[i].value;
					}
				} else {
					if ( strFieldValue != "" ) {
						strFieldValue += ",";
					}
					strFieldValue += oField[i].value;
				}
			}	
			
		}
		
		if ( orgDataType != "" ) {
			javaType = getJavaType(orgDataType);
    		this.fields[this.fields.length] = new Array(strFieldName, strFieldValue, javaType);
 		}


	}
	
    
    this.appendForm = function() {
    	var formObj = arguments[0];
    	var expFieldList = arguments[1];
    	var i = 0;
    	var j = 0;
    	var bFlag = true;
    	var fieldName = "";
    	var nameList = getFieldNameList(formObj);
    	var expList = new Array();
    	
    	if ( expFieldList != "" ) {
    		expList = expFieldList.split(",");
    	}
    	
		for ( i = 0; i < nameList.length; i++ ) {
			fieldName = nameList[i];
			bFlag = true;
			for ( j = 0; j < expList.length; j++ ) {
				if ( expList[j].trim() == fieldName ) {
					bFlag = false;
				}
			}
			if ( bFlag == true ) {			
				this.appendFField(formObj, fieldName);
			}
		}

    };
    
    this.setQuery = function() {
    	this.fields[this.fields.length] = new Array("Query", arguments[0], "");
    };
    
    this.setPageIndex = function() {
    	this.fields[this.fields.length] = new Array("pageIndex", arguments[0], "");
    };
    
	// ??????
	this.appendParm = function() {
		this.fields[this.fields.length] = new Array("parm", arguments[0], arguments[1]);
	};
	
    this.appendFParm = function() {
    
    	var oForm = arguments[0];
    	var strFieldName = arguments[1];
    	var strFieldValue = "";
		var orgDataType = "";
		var javaType = "";
		var i = 0;
    	
    	if ( oForm.elements[strFieldName].length > 1 ) {
    	
    		orgDataType = getDataType(oForm.elements[strFieldName][0]);
    		if ( oForm.elements[strFieldName][0].type.toLowerCase() == "checkbox" || oForm.elements[strFieldName][0].type.toLowerCase() == "radio" ) {
    			for ( i = 0; i < oForm.elements[strFieldName].length; i++ ) {
    				if ( oForm.elements[strFieldName][i].checked == true ) {
    					if ( strFieldValue == "" ) {
    						strFieldValue = oForm.elements[strFieldName][i].value;
    					} else {
    						strFieldValue += "," + oForm.elements[strFieldName][i].value;
    					}
    				}
    			}
    			
    		} else {
    			for ( i = 0; i < oForm.elements[strFieldName].length; i++ ) {
					if ( strFieldValue == "" ) {
						strFieldValue = oForm.elements[strFieldName][i].value;
					} else {
						strFieldValue += "," + oForm.elements[strFieldName][i].value;
					}
    			}
    		}
    		
    	} else {

    		orgDataType = getDataType(oForm.elements[strFieldName]);
    		strFieldValue = oForm.elements[strFieldName].value;
    		
    	}
    	

    	javaType = getJavaType(orgDataType);
    	
    	this.fields[this.fields.length] = new Array("parm", strFieldValue, javaType);
    	
    	
    };	
	
	// ?? Row Obj ??
	this.clear = function() {
		this.fields = new Array();
	}

}


function getJavaType(dataType) {

		switch ( dataType ) {
			// ?r??
			case "string" :
				javaType = "java.lang.String";
				break;
                    
			// float
			case "float" :
				javaType = "java.lang.Float";
				break;    
                    
			// double
			case "double" :
				javaType = "java.lang.Double";
				break;    
                
			// Integer
			case "int":
				javaType = "java.lang.Integer";
				break;   
                
			// Long
			case "long" :
				javaType = "java.lang.Long";
				break;          

			// Big Decimal	       
			case "bdec" :
				javaType = "java.math.BigDecimal";
				break;
				
			// ?r??
			case "char":
				javaType = "java.lang.Character";
				break;
                
			// 日期
			case "date":
				javaType = "java.util.Date";
				break;

			//日期字串格式
			case "datestr":
				javaType = "java.lang.String";
				break; 
							                    
			// ????
			case "time":
  				javaType = "";
				break;
                
			// TimeStamp
			case "timestamp":
			case "ts":
				javaType = "java.util.Date";
				break;
                    
			case "idno":
			case "uidno":
			case "invoiceno":
			case "digit":
			case "allno":
			case "idandinvoice":
			//數字 但 datatype 為 string
			case "bdecstr":
			case "intstr":
			case "longstr":						
				javaType = "java.lang.String";
				break;    
    	
   	}
    	
    	return javaType;
    	
}

function getDataType(oField) {

	var orgDataType = "";
	var re = /^[a-zA-Z]+\([0-9,\s]+\)$/g;
	
	if ( re.test(oField.getAttribute("dataType").toLowerCase()) ) {
		orgDataType = oField.getAttribute("dataType").toLowerCase().substring(0, oField.getAttribute("dataType").toLowerCase().indexOf("(")).toLowerCase();;
	} else {
		orgDataType = oField.getAttribute("dataType").toLowerCase();
	}

	return orgDataType;

}
// Xml ???@????


// get initialized DDO Object
function getddo(strAction) {

	var ddo = new DDO();
	ddo.init();
	if ( strAction != "" ) {
		if ( strAction.toLowerCase() == "execute" ) {
			ddo.setAction("CommonAction.Execute");
		}		
		if ( strAction.toLowerCase() == "query" ) {
			ddo.setAction("CommonAction.Query");
		}
		if ( strAction.toLowerCase() == "insert" ) {
			ddo.setAction("CommonAction.Insert");
		}		
		if ( strAction.toLowerCase() == "update" ) {
			ddo.setAction("CommonAction.Update");
		}
		if ( strAction.toLowerCase() == "delete" ) {
			ddo.setAction("CommonAction.Delete");
		}	
	}
	return ddo;
}

// get initialized Row Object
function getrow(strQuery) {

	var row = new Row();
	
	if ( strQuery != "" ) {
		row.setQuery(strQuery);
	}
	
	return row;
	
}