﻿/// XML格式常量声明（对于“暂用不上”的常量，其在Xml中对应的节点属性是取不到值的，因为服务器端并不会输出这些属性）
var TAGFIELD = "f";         //字段
var TAGCODE = "c";          //字段代码
var TAGAILAS = "t";         //字段别名（暂用不上）
var TAGDATATYPE = "dt";     //数据类型
var TAGFIELDTYPE = "ft";     //字段类型
var TAGFIELDLENGTH = "fs";     //字段长度（暂用不上）
var TAGDOTNUM = "dn";       //小数位数（暂用不上）
var TAGRESOURCE = "pr";     //系统资源（暂用不上）
var TAGRESOURCECODE = "prc";     //系统资源代码
var TAGISMULTI = "im";      //是否多值
var TAGDEFAULT = "dv";      //默认值
var TAGISREQUIRE = "ir";     //是否必填（暂用不上）
var TAGISPAUSE = "ip";      //是否停用（暂用不上）
var TAGVALUE = "v";         //字段值
var TAGVALUETITLE = "t";         //值标题

/// 数据类型
var DT_STR = "StringValue";         //字符型
var DT_INT = "IntValue";            //整型
var DT_DEC = "DecimalValue";        //小数型
var DT_BOOL = "BoolValue";         //布尔型
var DT_DATE = "DateValue";         //日期型
var DT_TEXT = "TextValue";         //大文本型

/// 字段类型
var FT_NORMAL = "Normal";           //常量 
var FT_IMAGE = "Image";             //图像
var FT_ATTA = "Attachment";         //附件
var FT_LIST = "List";               //列表
var FT_RES = "Resource";            //系统资源
var FT_SYSTEM = "System";           //固定量
var FT_REFER = "Refer";             //引用型
var FT_SCRIPT = "Script";           //脚本型
var FT_DBVAR = "DBVariant";         //数据库变量
var FT_DIMVAR = "DimenVariant";     //多维表变量

/// 其它常量
var CONVALUESPLIT = "@@";             //值控件前后缀
var CONTITLESPLIT = "$$";             //标题控件前后缀
var CONVALUEFORGESPLIT = "@_@";             //值控件前后缀(只读的伪造控件)
var CONTITLEFORGESPLIT = "$_$";             //标题控件前后缀(只读的伪造控件)

///-----------------------------------------------------------------------------
/// 渲染表单数据
function RenderForm(oXmlFormData)
{
    if (oXmlFormData != null)
    {
        //遍历当前表单数据中的所有字段        var nodes;
        if (oXmlFormData.nodeType == "9")   //如果传入的是一个XmlDocument
            nodes = oXmlFormData.documentElement.selectNodes(TAGFIELD);
        else    //传入的是一个XmlNode
            nodes = oXmlFormData.selectNodes(TAGFIELD);
            
        for(var i = 0; i < nodes.length; i++)
        {
            //当前字段数据对象
            RenderField(nodes.item(i));
        }
    }
    // 执行表单渲染后事件处理
    try{
        OnRenderComplete();
    }catch(e){}
    
}
///-----------------------------------------------------------------------------
/// 校验当前界面中的表单数据是否发生了变化(此方法暂未实现)
function CompareForm(oXmlFormData)
{
    if (oXmlFormData != null)
    {
        //遍历当前表单数据中的所有字段
        var fieldLength = oXmlFormData.selectNodes(TAGFIELD).length;
        for(var i=0;i<fieldLength;i++)
        {
            //当前字段数据对象
            var oXmlField = oXmlFormData.selectNodes(TAGFIELD).item(i);
            if (!CompareField(oXmlField))
            {
                return false;
            }
        }
    }
    return true;
}
///-----------------------------------------------------------------------------
/// 将当前界面中的表单数据全部置为空
function ClearForm(oXmlFormData)
{
    if (oXmlFormData != null)
    {
        //遍历当前表单数据中的所有字段
        var fieldLength = oXmlFormData.selectNodes(TAGFIELD).length;
        for(var i=0;i<fieldLength;i++)
        {
            //当前字段数据对象
            var oXmlField = oXmlFormData.selectNodes(TAGFIELD).item(i);
            SetFieldNull(oXmlField);
        }
    }
}
///-----------------------------------------------------------------------------
/// 根据字段的XML数据，渲染该字段的界面
/// fieldCode: 字段代码
/// fieldType: 字段类型
/// dataType: 数据类型
/// fieldInput: 是否多输入型
/// fieldValue: 字段值。当fieldInput为单输入类型时，fieldValue为option对象，当fieldInput为多输入类型时，fieldValue为select对象，
/// fieldControl：字段的界面输入对象
/// fieldResCode：系统资源代码，只有当字段为系统资源型时才有作用
function SetFieldValue(fieldCode,fieldType,dataType,fieldInput,fieldValue,fieldControl,fieldResCode)
{   
    switch(fieldType)
    {
        case FT_NORMAL:     //常量
            if (fieldInput == "True")
            {  
                //多输入
            }else
            {
                //单输入                if (dataType == DT_BOOL)    //布尔型特殊处理                {
                    fieldValue.value = fieldValue.value.toUpperCase();
                }
                SetSingleValue(fieldControl,fieldValue.value);
                
                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                if (titleControl != null)
                {
                    SetSingleValue(titleControl,fieldValue.value);
                }
            }
            break;
        case FT_IMAGE:     //图像
            if (fieldControl != null)
            {
                if (fieldControl.tagName == "INPUT" && fieldControl.type=="file")
                {
                    // 清空文件上传中的值
                    fieldControl.select();
                    document.execCommand('delete');
                    fieldControl.blur();
                }
                
    	        //处理图像字段的值
		        if (fieldValue.value == null || fieldValue.value == "")
			        fieldValue.value = "images/noimg.gif";
        			
		        // 设置值	
		        SetSingleValue(fieldControl,fieldValue.value);
        			
    	        //设置图像显示
                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                if (titleControl != null)
                {
                    SetSingleValue(titleControl,fieldValue.value);
                }
            }
            break;
        case FT_ATTA:     //附件
            if (fieldControl != null)
            {
                if (fieldControl.tagName == "INPUT" && fieldControl.type=="file")
                {
                    // 清空文件上传中的值
                    fieldControl.select();
                    document.execCommand('delete');
                    fieldControl.blur();
                }
                if (fieldControl.tagName == "A")
                {
                    fieldControl.href = fieldValue.value;
                    fieldControl.innerHTML = fieldValue.text;
                }
            }
            var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
            if (titleControl != null)
            {
                if (titleControl.tagName == "A")
                {
                    titleControl.href = fieldValue.value;
                    titleControl.innerHTML = fieldValue.text;
                }
                if (titleControl.tagName == "INPUT")
                {
                    titleControl.href = fieldValue.value;
                    
                    if(titleControl.href == null || titleControl.href == "")
                        titleControl.disabled = true;
                    else
                        titleControl.disabled = false;
                }
            }
            break;
        case FT_LIST:     //列表
            if (fieldInput == "True")
            {
                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                
                /// 多输入---------------------
                if (fieldControl != null && fieldControl.tagName == "INPUT")
                {
                    fieldControl.value = "";
                    for(var i = 0; i < fieldValue.options.length; i++)
                    {
                        if(fieldValue.options[i].selected)
                        {
                            if(fieldControl.value != "")
                                fieldControl.value += FIELDDATAOBJECTSPLITSIGN;
                                
                            fieldControl.value += fieldValue.options[i].value + FIELDDATAPROPERTYSPLITSIGN + fieldValue.options[i].innerHTML;
                        }
                    }
                }
                else
                {
                    SetMultiValue(fieldControl,GetValueList(fieldInput,fieldValue));   
                }
                
                SetMultiValue(titleControl,GetValueList(fieldInput,fieldValue));
            }
            else
            {
                /// 单输入---------------------
                
                //设置值                var strValue = fieldValue.value;            
                if (fieldControl != null)
                {
                    if (strValue.indexOf(CONVALUESPLIT) == -1 && (fieldControl.tagName == "SELECT" || fieldControl.tagName == "INPUT"))
                    {          
                        strValue += CONVALUESPLIT + fieldValue.text;
                    }
                    SetSingleValue(fieldControl,strValue);
                }

                //设置标题
                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                if(titleControl != null)
                {
                    //当titleControl为radio或checkbox时设置的是值，否则设置的是标题
                    if(fieldControl != null && fieldControl.tagName == "INPUT" && fieldControl.type == "hidden" && titleControl.length != null)
                        SetSingleValue(titleControl,fieldValue.value);
                    else
                        SetSingleValue(titleControl,fieldValue.text);
                }
            }
            break;
        case FT_RES:     //系统资源
            if (fieldInput == "True")
            {  
                //多输入                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                if (titleControl != null && titleControl.tagName == "SELECT")
                {
                    BindSelectValue(titleControl,fieldValue,fieldResCode);
                }
                
                if (fieldControl != null)
                {
                    if (fieldControl.tagName == "INPUT")
                        fieldControl.value = GetValueAndTitleList(fieldValue);
                }
                    
            }else
            {
                //单输入
                //设置系统资源的值                var strValue = fieldValue.value;
                
                if (fieldControl != null)
                {
                    if (fieldControl.tagName == "INPUT")
                    {          
                        strValue += CONVALUESPLIT + fieldValue.text;
                    }
                    SetSingleValue(fieldControl,strValue);
                }
                
                //设置系统资源的显示文本
                var titleControl = document.all(CONTITLESPLIT +fieldCode+ CONTITLESPLIT);
                SetSingleValue(titleControl,fieldValue.text);
            }
            break;
    }
}

///-----------------------------------------------------------------------------
/// 根据字段的XML数据，比较该字段的值是否发生了变化
/// fieldCode: 字段代码
/// fieldType: 字段类型
/// dataType: 数据类型
/// fieldInput: 是否多输入型
/// fieldValue: 字段值。当fieldInput为单输入类型时，fieldValue为option对象，当fieldInput为多输入类型时，fieldValue为select对象，
/// fieldControl：字段的界面输入对象
/// fieldResCode：系统资源代码，只有当字段为系统资源型时才有作用
function CompareFieldValue(fieldCode,fieldType,dataType,fieldInput,fieldValue,fieldControl,fieldResCode)
{
    return true;
}

///-----------------------------------------------------------------------------
/// 根据字段的XML数据，渲染该字段的界面
function CompareField(oXmlField)
{
    //字段基本属性
    var fieldCode = GetFieldAttribute(oXmlField,TAGCODE);
    var dataType = GetFieldAttribute(oXmlField,TAGDATATYPE);
    var fieldType = GetFieldAttribute(oXmlField,TAGFIELDTYPE);
    var fieldResCode = GetFieldAttribute(oXmlField,TAGRESOURCECODE);
    var fieldInput = GetFieldAttribute(oXmlField,TAGISMULTI);
    
    //得到装载当前字段的表单控件
    var fieldControl = document.all(CONVALUESPLIT + fieldCode + CONVALUESPLIT);
    if (fieldControl != null)
    {
        //字段值，对于单输入类型，为OPTION。对于多输入类型，为SELECT。
        var fieldValue;
        if (fieldInput == "True")
        {
            //多输入类型
            fieldValue = GetFieldValues(oXmlField);
            
        }else
        {
            //单输入类型
            fieldValue = GetFieldValue(oXmlField);
        }
        return CompareFieldValue(fieldCode,fieldType,dataType,fieldInput,fieldValue,fieldControl,fieldResCode);
    }
    return true;

}
///-----------------------------------------------------------------------------
/// 根据字段的XML数据，渲染该字段的界面
function RenderField(oXmlField)
{
    //字段基本属性
    var fieldCode = GetFieldAttribute(oXmlField,TAGCODE);
    var dataType = GetFieldAttribute(oXmlField,TAGDATATYPE);
    var fieldType = GetFieldAttribute(oXmlField,TAGFIELDTYPE);
    var fieldResCode = GetFieldAttribute(oXmlField,TAGRESOURCECODE);
    var fieldInput = GetFieldAttribute(oXmlField,TAGISMULTI);
    
    //得到装载当前字段的表单控件
    var fieldControl = document.all(CONVALUESPLIT + fieldCode + CONVALUESPLIT);
    
    //同步只读的伪造控件
    SynchForgeControl(fieldCode);
    
    //if (fieldControl != null)
    //{
    
    //字段值，对于单输入类型，为OPTION。对于多输入类型，为SELECT。
    var fieldValue;
    if (fieldInput == "True")
    {
        //多输入类型
        fieldValue = GetFieldValues(oXmlField);
        
    }else
    {
        //单输入类型
        fieldValue = GetFieldValue(oXmlField);
    }
    
    SetFieldValue(fieldCode,fieldType,dataType,fieldInput,fieldValue,fieldControl,fieldResCode);
    //}

}

///-----------------------------------------------------------------------------
/// 根据字段的XML数据，渲染该字段的界面
function SetFieldNull(oXmlField)
{
    //字段基本属性
    var fieldCode = GetFieldAttribute(oXmlField,TAGCODE);
    var dataType = GetFieldAttribute(oXmlField,TAGDATATYPE);
    var fieldType = GetFieldAttribute(oXmlField,TAGFIELDTYPE);
    var fieldResCode = GetFieldAttribute(oXmlField,TAGRESOURCECODE);
    var fieldInput = GetFieldAttribute(oXmlField,TAGISMULTI);
    
    //得到装载当前字段的表单控件
    var fieldControl = document.all(CONVALUESPLIT + fieldCode + CONVALUESPLIT);
    if (fieldControl != null)
    {
        //字段值，对于单输入类型，为OPTION。对于多输入类型，为SELECT。
        var fieldValue;
        if (fieldInput == "True")
        {
            //多输入类型
            fieldValue = document.createElement("SELECT");
            
        }else
        {
            //单输入类型
            var nullOption = document.createElement("OPTION");
	        nullOption.text= "";
	        nullOption.value= "";
	        
            fieldValue = nullOption;
        }
        SetFieldValue(fieldCode,fieldType,dataType,fieldInput,fieldValue,fieldControl,fieldResCode);
    }
    

}

///-----------------------------------------------------------------------------
/// 设置单值
function SetSingleValue(Control,Value)
{
    if (Control != null)
    {
        if (Control.tagName != null)
        {
            var tagName= Control.tagName.toUpperCase();
            if (tagName == "LABEL" ||tagName == "DIV" || tagName == "SPAN" || tagName == "TD")
            {
                if (Control.Render != null && Control.Render == 'HTML')
                {
                    Control.innerHTML = Value;
                }else
                {
	                Control.innerHTML = Value.replace(/\n/g,'<br>');
	            }
            }
            if (tagName == "INPUT" || tagName == "TEXTAREA")
            {
	            if(Control.type == "checkbox")
	            {
	                if (Value.toUpperCase() == "TRUE")
	                {
	                    Control.checked = true;
	                }else
	                {
	                    Control.checked = false;
	                }
	            }else
	            {
	                Control.value = Value;
	            }
    	        
            }
            if (tagName == "SELECT")
            {                 	
	            //SELECT控件
                SetSelectListValue(Control,CONVALUESPLIT+Value+CONVALUESPLIT);
            }  
            if (tagName == "IMG")
            {                    	
	            Control.src = Value;
            }  
        }else
        {
            if (Control.length != null && Control.length > 0)
            {   
                SetBoxListValue(Control,CONVALUESPLIT+Value+CONVALUESPLIT);
            }
        }
    }
}
///-----------------------------------------------------------------------------
/// 设置多值
function SetMultiValue(Control, Values)
{
    if (Control != null)
    {
        if (Control.tagName != null)
        {
            var tagName= Control.tagName.toUpperCase();
            if (tagName=="SELECT")
            {
                //SELECT控件
                SetSelectListValue(Control,Values);
            }
        }else
        {
            if (Control.length != null && Control.length > 0)
            {
                //Radio或CheckBox
                SetBoxListValue(Control,Values);
            }
        }
    }
}
///-----------------------------------------------------------------------------
/// 得到指定字段的值集合，返回值为SELECT
function GetFieldValues(oXmlField)
{
    var oSelect = document.createElement("SELECT");
    if (oXmlField.selectNodes(TAGVALUE).length > 0)
    {
        for(var i=0;i<oXmlField.selectNodes(TAGVALUE).length;i++)
        {
            var xmlValue = oXmlField.selectNodes(TAGVALUE).item(i);
            var optValue = document.createElement("OPTION");
            
            optValue.text = GetFieldAttribute(xmlValue,TAGVALUETITLE);
            optValue.value = xmlValue.text;
            
            oSelect.options.add(optValue);
        
        }
    }
    return oSelect;
}
///-----------------------------------------------------------------------------
/// 得到指定字段的单值，返回值为OPTION
function GetFieldValue(oXmlField)
{
    var optValue = document.createElement("OPTION");
    if (oXmlField.selectNodes(TAGVALUE).length > 0)
    {
        var xmlValue = oXmlField.selectSingleNode(TAGVALUE);
        optValue.text = GetFieldAttribute(xmlValue,TAGVALUETITLE);
        optValue.value = xmlValue.text;
    }else
    {
        optValue.text = GetFieldAttribute(oXmlField,TAGDEFAULT);
        optValue.value = GetFieldAttribute(oXmlField,TAGDEFAULT);
    }
    return optValue;
}
///-----------------------------------------------------------------------------
/// 得到指定字段的属性
function GetFieldAttribute(oXmlField,AttrID)
{
    if (oXmlField.attributes.getNamedItem(AttrID) != null)
        return oXmlField.attributes.getNamedItem(AttrID).text;
    else
        return null;
}
///-----------------------------------------------------------------------------
///设置列表型字段的Select型控件的值
function SetSelectListValue(oSel,valueList)
{
    ClearFieldOptions(oSel);
    for(var i=0;i<oSel.options.length;i++)
    {
        var oOption = oSel.options.item(i);
        var aryValue = oOption.value.split(CONVALUESPLIT);
        if (valueList.toUpperCase().search(CONVALUESPLIT + aryValue[0].toUpperCase() + CONVALUESPLIT) > -1)
        {
            oOption.selected = true;            
        }
        
    }
}
///-----------------------------------------------------------------------------
///设置列表型字段的RadioBox或CheckBox型控件的值
function SetBoxListValue(oItems,valueList)
{
    for(var i=0;i<oItems.length;i++)
    {
        var oBox = oItems(i);
        if (oBox.tagName == "INPUT")
        {
            if (oBox.type == "checkbox" || oBox.type == "radio")
            {
                var aryValue = oBox.value.split(CONVALUESPLIT);
                if (valueList.toUpperCase().search(CONVALUESPLIT + aryValue[0].toUpperCase() + CONVALUESPLIT) > -1)
                {
                    oBox.checked = true;
                    if (oBox.type == "radio")
                        break;
                }else
                {
                    oBox.checked = false;
                }
            }
        }
        
    }
}
///-----------------------------------------------------------------------------
///多输入的系统资源，填充Select型控件的值function BindSelectValue(oSel,oValueSel,resType)
{
    ClearFieldOptions(oSel);
    
    for(var i=0;i<oValueSel.options.length;i++)
    {
        var oOption = oValueSel.options.item(i);
        if (oOption.value != "" || oOption.text != "")
        {
            var newOpt = document.createElement("OPTION");
            newOpt.value = oOption.value;
            newOpt.text = oOption.text;
            if (resType != null)
                newOpt.type = resType;
            oSel.options.add(newOpt);
        }
        
    }
}
///-----------------------------------------------------------------------------
/// 得到字段的值列表，格式：value1@@title1,value2@@title2，此值可直接被server端接受并处理
/// fieldInput: 是否多输入型字段
/// fieldValue: 字段值。当fieldInput为单输入类型时，fieldValue为option对象，当fieldInput为多输入类型时，fieldValue为select对象，
function GetValueList(fieldInput,fieldValue)
{
    var strValueList = "";
    if (fieldValue != null)
    {
        if (fieldInput == "True")
        {
            //多输入类型
            strValueList = CONVALUESPLIT;
            for(var j=0;j<fieldValue.length;j++)
            {
                strValueList += fieldValue[j].value + CONVALUESPLIT;
            }
            
        }else
        {
            //单输入类型
            strValueList = CONVALUESPLIT + fieldValue.value + CONVALUESPLIT;
        }
    }
    return strValueList;
}
///-----------------------------------------------------------------------------
/// 得到多输入型字段的值与标题列表
/// fieldValue: 字段值。当fieldInput为单输入类型时，fieldValue为option对象，当fieldInput为多输入类型时，fieldValue为select对象，
function GetValueAndTitleList(fieldValue)
{
    var strValueAndTitleList = "";
    if (fieldValue != null)
    {
        for(var j=0;j<fieldValue.length;j++)
        {
            if (fieldValue[j].value != "" && fieldValue[j].text != "")
                strValueAndTitleList += fieldValue[j].value+CONVALUESPLIT+fieldValue[j].text+","
        }
    }
    if (strValueAndTitleList.length > 1)
            strValueAndTitleList = strValueAndTitleList.substr(0,strValueAndTitleList.length - 1);
    return strValueAndTitleList;
}
/******************************************************
描述：	清空指定Select列表框的所有选项
返回：	true OR false
参数：	Select对象
******************************************************/
function ClearFieldOptions(oSel){
	try{
	    if (oSel.multiple)
	    {
		    var intOptionLength = oSel.options.length;
		    for (var i = intOptionLength - 1; i >= 0; i--)
		    {
		        oSel.options.remove(i);
		    }
		}else
		{
		    oSel.selectedIndex = -1;
		}
		return true;
	}catch(e){
		return false;
	}
}


//***************************************
//同步伪造控件
//参数：
//fieldCode             字段代码
//***************************************
function SynchForgeControl(fieldCode)
{
    var valueControl = document.all(CONVALUESPLIT + fieldCode + CONVALUESPLIT);
    var forgeValueControl = document.all(CONVALUEFORGESPLIT + fieldCode + CONVALUEFORGESPLIT);

    var titleControl = document.all(CONTITLESPLIT + fieldCode + CONTITLESPLIT);
    var forgeTitleControl = document.all(CONTITLEFORGESPLIT + fieldCode + CONTITLEFORGESPLIT);

    if(forgeValueControl == null && forgeTitleControl == null)
        return;
    
    //处理值控件
    InnerSynchForgeControl(fieldCode, valueControl, forgeValueControl);
        
    //处理标题控件
    InnerSynchForgeControl(fieldCode, titleControl, forgeTitleControl);
}


//***************************************
//内部同步伪造控件
//参数：
//fieldCode             字段代码
//fullRealControl       完整的真控件
//fullForgeControl      完整的伪造控件
//***************************************
function InnerSynchForgeControl(fieldCode, fullRealControl, fullForgeControl)
{
    if(fullRealControl != null && fullForgeControl != null)
    {
        if(fullRealControl.tagName != null)
        {
            AttachSynchEvent(fullRealControl, fullRealControl, fullForgeControl);
        }
        else
        {
            //对checkbox或radio的处理
            for(var i = 0; i < fullRealControl.length; i++)
            {
                AttachSynchEvent(fullRealControl[i], fullRealControl, fullForgeControl);
            }
        }
    }
}

//***************************************
//加上同步事件(onpropertychange)
//参数：
//eventBindControl      需要绑定同步事件的控件
//fullRealControl       完整的真控件
//fullForgeControl      完整的伪造控件
//***************************************
function AttachSynchEvent(eventBindControl, fullRealControl, fullForgeControl)
{
    if(eventBindControl.isAttachSynchEvent == null || !eventBindControl.isAttachSynchEvent)
    {
        eventBindControl.attachEvent("onpropertychange", function()
        {
            CopyFullControlValue(fullRealControl, fullForgeControl);
        });
        
        //设置标志位，绑定过一次就不能再进行绑定
        eventBindControl.isAttachSynchEvent = true;
    }
}

//***************************************
//拷贝完整控件值
//参数：
//sourceControl     源控件
//targetControl     目标控件
//***************************************
function CopyFullControlValue(sourceControl, targetControl)
{        
    if(sourceControl != null && targetControl != null)
    {
        if(sourceControl.tagName != null)
        {
            switch(sourceControl.tagName.toLowerCase())
                {
                    case 'select':
                        for(var i = 0; i < sourceControl.options.length; i++)
                        {
                            CopyBaseControlValue(sourceControl.options[i], targetControl.options[i]);
                        }
                        break;
                    default:
                        CopyBaseControlValue(sourceControl, targetControl);
                        break;
                }
        }
        else
        {
            //对checkbox或radio的处理
            for(var i = 0; i < sourceControl.length; i++)
            {
                CopyBaseControlValue(sourceControl[i], targetControl[i]);
            }
        }
    }
}

//***************************************
//拷贝基础控件的值
//参数：
//sourceControl     源控件
//targetControl     目标控件
//***************************************
function CopyBaseControlValue(sourceControl, targetControl)
{
    if(sourceControl == null || targetControl == null)
	return;

    var strTagName = sourceControl.tagName.toLowerCase();

    switch(strTagName)
    {
        case 'input':   
            var strType = sourceControl.type.toLowerCase();
            if(strType == 'radio' || strType == 'checkbox')
            {
                targetControl.checked = sourceControl.checked;
            }
            else if(strType == 'image')
            {
                targetControl.src = sourceControl.src;
            }
            else if(strType == 'file')
            {
            }
            else
            {
                targetControl.value = sourceControl.value;
            }
            break;
        case 'textarea':
            targetControl.value = sourceControl.value;
            break;
        case 'option':
            targetControl.value = sourceControl.value;
            targetControl.selected = sourceControl.selected;
            break;
    }
}



//表单正文相关
//====================================================
//权限类型：不可见
var INVISIBLE_PRIVILEGETYPE = "Invisible";
//权限类型：只读
var READONLY_PRIVILEGETYPE = "Readonly";
//权限类型：读写
var READWRITE_PRIVILEGETYPE = "ReadWrite";

//表单正文信息
function FormDocument(formType, documentType, defaultView, documentLocation, formId, instance, privilegeTypeWithDocument)
{
	//表单类型
	this.formType = formType;
	//正文类型
	this.documentType = documentType;
	//默认视图
	this.defaultView = defaultView;
	//正文URl路径
	this.documentLocation = documentLocation;
	//表单标识
	this.formId = formId;
	//表单对象实例标识
	this.instance = instance;
	//正文的权限类型
	this.privilegeTypeWithDocument = privilegeTypeWithDocument;
}

//表单正文渲染器
function FormDocumentRender(formDocument, formUI, documentUI, hiddenCurrentView, uploadOfficeFilePagePath, comId)
{
    //表单正文信息
    this.formDocument = formDocument;
    //表单数据界面容器
    this.formUI = formUI;
    //表单正文界面容器
    this.documentUI = documentUI;
    //保存当前视图的隐藏域
    this.hiddenCurrentView = hiddenCurrentView;
    //UploadOfficeFile.aspx页面路径
    this.uploadOfficeFilePagePath = uploadOfficeFilePagePath;
    //部件标识
    this.comId = comId;
    
    //正文对象
    var formDocObject = null;
    //正文是否已打开
    var isOpen = false;
    
    //保存操作
    //====================================================
    var saveAction = function()
    {
        if(formDocument.formType != "OnlyForm")
        {
            switch(formDocument.documentType)
            {
                //office工具编辑
                case "Doc":
                case "Xls":
                case "Ppt":
                case "Txt":
                case "Rtf":
                    saveActionWithOfficeTool();
                    break;
                    
                //图片打开
                case "Jpg":
                case "Gif":
                case "Bmp":
                case "Png":
                    break;
                
                //播放器播放
                case "Mp3":
                case "Mp4":
                    break;
                
                //超级链接下载
                case "Pdf":
                case "Zip":
                case "Rar":
                    break;
                    
                //未知文件
                default:
                    break;
            }
        }
    }
    //该方法需要被开放
    this.saveAction = saveAction;
    
    //Office工具的保存操作
    var saveActionWithOfficeTool = function()
    {
        if(formDocObject!=null)
         {
            try
            {
                openDocObject();
                //初始化Http引擎
                formDocObject.HttpInit();
                //上传当前文档
                formDocObject.HttpAddPostCurrFile(formDocument.documentLocation, formDocument.instance + "." + formDocument.DocumentType);

                formDocObject.HttpAddPostString('Action','DocumentSave');
                //把表单ID和实例ID也传出去
                formDocObject.HttpAddPostString('PortalFormID', formDocument.formId);
                formDocObject.HttpAddPostString('InstanceID', formDocument.instance);

                //执行上传动作
                formDocObject.HttpPost(uploadOfficeFilePagePath); 
            }
            catch(e)
            {
            }
        }
    }
    //====================================================
    
    
    //动态生成OBJECT
    //====================================================
    var createDocObject = function()
    {
        if(formDocument.formType != "OnlyForm")
        {
            switch(formDocument.documentType)
            {
                //office工具编辑
                case "Doc":
                case "Xls":
                case "Ppt":
                case "Txt":
                case "Rtf":
                    var content = "<OBJECT classid='clsid:00460182-9E5E-11D5-B7C8-B8269041DD57' codebase='Common/dsoframer.ocx#version=2,2,0,8'  id='" + comId + "_formDocObject' style='LEFT: 0px; TOP: 0px; WIDTH: 100%; HEIGHT: 500px;' VIEWASTEXT><PARAM NAME='_ExtentX' VALUE='6350'><PARAM NAME='_ExtentY' VALUE='6350'><PARAM NAME='BorderColor' VALUE='-2147483632'><PARAM NAME='BackColor' VALUE='-2147483643'><PARAM NAME='ForeColor' VALUE='-2147483640'><PARAM NAME='TitlebarColor' VALUE='-2147483635'><PARAM NAME='TitlebarTextColor' VALUE='-2147483634'><PARAM NAME='BorderStyle' VALUE='0'><PARAM NAME='Titlebar' VALUE='0'><PARAM NAME='Toolbars' VALUE='-1'><PARAM NAME='Menubar' VALUE='0'></OBJECT>";
                    innerCreateDocObject(content);
                    break;
                    
                //图片打开
                case "Jpg":
                case "Gif":
                case "Bmp":
                case "Png":
                    var content = "";
                    if(formDocument.privilegeTypeWithDocument == READONLY_PRIVILEGETYPE)
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File' class='defaultbutton' name='documentFileUpload' ID='documentFileUpload' Width='220px' disabled='true'/></td></tr><tr><td><img WIDTH=320 HEIGHT=240 src='" + formDocument.documentLocation + "' /></td></tr></table>";
                    else
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File' class='defaultbutton' name='documentFileUpload' ID='documentFileUpload' Width='220px' /></td></tr><tr><td><img WIDTH=320 HEIGHT=240 src='" + formDocument.documentLocation + "' /></td></tr></table>";
                        
                    innerCreateDocObject(content);
                    break;
                
                //播放器播放
                case "Mp3":
                case "Mp4":
                    var content = "";
                    if(formDocument.privilegeTypeWithDocument == READONLY_PRIVILEGETYPE)
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton' name='documentFileUpload' ID='documentFileUpload' Width='220px' disabled='true'/></td></tr><tr><td><a href='" + formDocument.documentLocation + "' target='_blank' id = 'documentDownLoad' >下载</a></td></tr><tr><td><OBJECT ID='" + comId + "_formDocObject' WIDTH=320 HEIGHT=240 CLASSID='CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95' CODEBASE='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715' STANDBY='Loading Microsoft? Windows Media? Player components...' TYPE='application/x-oleobject'> <PARAM NAME='FileName' VALUE='" + formDocument.documentLocation + "'> <PARAM NAME='ShowControls' VALUE='true'><PARAM NAME='AutoRewind' VALUE='True'><PARAM NAME='AutoStart' VALUE='true'></OBJECT></td></tr></table>";
                    else
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton' name='documentFileUpload' ID='documentFileUpload' Width='220px' /></td></tr><tr><td><a href='" + formDocument.documentLocation + "' target='_blank' id = 'documentDownLoad' >下载</a></td></tr><tr><td><OBJECT ID='" + comId + "_formDocObject' WIDTH=320 HEIGHT=240 CLASSID='CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95' CODEBASE='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715' STANDBY='Loading Microsoft? Windows Media? Player components...' TYPE='application/x-oleobject'> <PARAM NAME='FileName' VALUE='" + formDocument.documentLocation + "'> <PARAM NAME='ShowControls' VALUE='true'><PARAM NAME='AutoRewind' VALUE='True'><PARAM NAME='AutoStart' VALUE='true'></OBJECT></td></tr></table>";
                        
                    innerCreateDocObject(content);
                    break;
                
                //超级链接下载
                case "Pdf":
                case "Zip":
                case "Rar":
                    var content = "";
                    if(formDocument.privilegeTypeWithDocument == READONLY_PRIVILEGETYPE)
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton'  name='documentFileUpload' ID='documentFileUpload' Width='220px' disabled='true'/></td></tr><tr><td><a href='" + formDocument.documentLocation + "'>下载</a></td></tr></table>";
                    else
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton'  name='documentFileUpload' ID='documentFileUpload' Width='220px' /></td></tr><tr><td><a href='" + formDocument.documentLocation + "'>下载</a></td></tr></table>";
                    innerCreateDocObject(content);
                    break;
                
                //未知文件
                default:
                    var content = "";
                    if(formDocument.privilegeTypeWithDocument == READONLY_PRIVILEGETYPE)
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton'  name='documentFileUpload' ID='documentFileUpload' Width='220px' disabled='true'/></td></tr><tr><td><a href='" + formDocument.documentLocation + "'>下载</a></td></tr></table>";
                    else
                        content = "<table><tr width='100%'><td>新文件上传：<input type='File'  class='defaultbutton'  name='documentFileUpload' ID='documentFileUpload' Width='220px' /></td></tr><tr><td><a href='" + formDocument.documentLocation + "'>下载</a></td></tr></table>";
                    innerCreateDocObject(content);
                    break;
            }
        }
    }
    
    var innerCreateDocObject = function(content)
    {
        if(formDocObject==null)
        {
            var oSpan = document.createElement('span');
            documentUI.appendChild(oSpan);
            oSpan.innerHTML = content;
            formDocObject = document.all(comId + '_formDocObject');         
        }
    }
    //====================================================
    
    
    //显示文档对象
    //====================================================
    var openDocObject = function()
    {
        if(formDocument.formType != "OnlyForm")
        {
            switch(formDocument.documentType)
            {
                //office工具编辑
                case "Doc":
                case "Xls":
                case "Ppt":
                case "Txt":
                case "Rtf":
                    openDocObjectWithOfficeTool();
                    break;
                    
                //图片打开
                case "Jpg":
                case "Gif":
                case "Bmp":
                case "Png":
                    break;
                
                //播放器播放
                case "Mp3":
                case "Mp4":
                    break;
                
                //超级链接下载
                case "Pdf":
                case "Zip":
                case "Rar":
                    break;
                    
                //未知文件
                default:
                    break;
            }
        }
    }
    
    //打开Office工具的文档对象
    var openDocObjectWithOfficeTool = function()
    {
        if(!isOpen)
        {
            //打开文件
            switch(formDocument.documentType)
            {
                //office工具编辑
                case "Doc":
                    formDocObject.Open(formDocument.documentLocation, false, "Word.Document");
                    break;
                case "Xls":
                    formDocObject.Open(formDocument.documentLocation, false, "Excel.Sheet");
                    break;
                case "Ppt":
                    formDocObject.Open(formDocument.documentLocation, false, "PowerPoint.Show");
                break;
//                case "Prj"://因为客户端很可能没装这两个文件，所以暂时屏蔽
//                    formDocObject.Open(formDocument.documentLocation, false, "MSProject.Projec");
//                break;
//                case "Viso":
//                    formDocObject.Open(formDocument.documentLocation, false, "Visio.Drawing");
//                break;
                default:
                    formDocObject.Open(formDocument.documentLocation, false);
                    break;
            }
            isOpen = true;
            
            //屏蔽“保存”按钮
            formDocObject.EnableFileCommand(3)=false;
            //屏蔽“另存为”按钮
	        formDocObject.EnableFileCommand(4)=false;
	        
            //正文只读则对文档设置保护
            if(formDocument.privilegeTypeWithDocument == READONLY_PRIVILEGETYPE)
                formDocObject.ProtectDoc(1,1,"");
        }
    }
    //====================================================
    
    
    
    //显示表单数据或表单正文
    //====================================================
    var showFormDoc = function(isShowForm, isShowDoc)
    {
        if(isShowForm)
        {
            formUI.style.display='';
            hiddenCurrentView.value = 'FormView';
        }
        else
        {
            formUI.style.display='none';
        }
        if(isShowDoc)
        {
            openDocObject();
            documentUI.style.display='';
            hiddenCurrentView.value = 'DocumentView';
        }
        else
        {
            documentUI.style.display='none';
        }
    }
    //该方法需要开放
    this.showFormDoc = showFormDoc;
    //====================================================
    
    
    //初始化表单正文
    //====================================================
    var initFormDoc = function()
    {
        if(hiddenCurrentView.value != '')
        {
            //回抛后对象丢失了,重新建过
            createDocObject();
            
            //保留回抛前的状态
            if(hiddenCurrentView.value=='FormView')
               showFormDoc(true,false);
            else if(hiddenCurrentView.value=='DocumentView')
               showFormDoc(false,true);
            else
                showFormDoc(false,false);
        }
        else
        {
            showFormDoc(false,false);
        }
    }
    //该方法需要被开放
    this.initFormDoc = initFormDoc;
    //====================================================
}
//====================================================


//同步使用radio和checkbox作界面表现的列表型字段的隐藏域值
function synchListValue(fieldCode)
{
	var titleControls = document.all(FIELDTITLESIGN + fieldCode + FIELDTITLESIGN);
	var valueControl = document.all(FIELDCODESIGN + fieldCode + FIELDCODESIGN);
	
	if(titleControls == null || valueControl == null)
		return;

	valueControl.value = "";

	for(var i = 0; i< titleControls.length; i++)
	{
		if(!titleControls[i].checked)
			continue;
		
		if(valueControl.value != "")
			valueControl.value += FIELDDATAOBJECTSPLITSIGN;

		valueControl.value += titleControls[i].value;
	}
}


//同步使用radio和checkbox作界面表现的布尔型字段的隐藏域值
function synchBoolValue(fieldCode)
{
	var valueControl = document.all(FIELDCODESIGN + fieldCode + FIELDCODESIGN);
	
	if(valueControl == null)
		return;

    if(event.srcElement != null && event.srcElement.tagName == "INPUT")
    {
        if(event.srcElement.type == "radio")
        {
            if(event.srcElement.checked)
                valueControl.value = event.srcElement.value + FIELDDATAPROPERTYSPLITSIGN + event.srcElement.valueTitle;
        }
        else if(event.srcElement.type == "checkbox")
        {
            if(event.srcElement.checked)
	            valueControl.value = event.srcElement.value + FIELDDATAPROPERTYSPLITSIGN + event.srcElement.trueTitle;
	        else
                valueControl.value = event.srcElement.falseValue + FIELDDATAPROPERTYSPLITSIGN + event.srcElement.falseTitle;
        }
    }
}
