﻿/*************************************************************************************
 *   
 *  Leador VRML Common JavaScript
 *
 *  (c) 2006 CopyRight Leador CO.,LTD. All Right Reserved.
 *
 *  http://www.leador.com.cn
 *   
 *  修改记录: 朱亮 2006-12-11 (创建) 提供VRML JS 通用操作
 *************************************************************************************/

/*************************************************************************************
 *  参数配置区
 *************************************************************************************/
//VRML控件ID
var World = null;
//Ajax无刷新连接符
var AjaxChar = '$';

/*************************************************************************************
 * 通用方法区
 *************************************************************************************/
//数组类
function ArrayList()
{
    this.length = 0;
    this.array = new Array();
    this.Item = function(index){return this.array[index];}
    this.Add = function(value)
    {
        this.array[this.length] = value;
        this.length++;
    }
    this.Remove = function(value)
    {
        if(this.length >= 1)
        {        
            for(var i = 0; i < this.length; i++)
            {
                if(this.array[i] == value)
                {
                    for(var j = i; j < (this.length-1); j++)
                    {this.array[j] = this.array[j+1];}
                    
                    this.length--;
                    this.array[this.length] = null;
                    this.array.length--;
                    break;
                }   
            }
        }
        else
        {
            this.length = 0;
        }
    }
    this.Insert = function(value, index)
    {
        if(index < 0){ index = 0; }
        if((this.length >= 1) && (index < this.length))
        {
            for(var i = this.length; i > index; i--)
            {this.array[i] = this.array[i-1];}
            
            this.array[index] = value;
            this.length ++;   
        }
        else
        {
            this.Add(value);
        }
    }
    this.Exist = function(value)
    {
        if(this.length > 1)
        {        
            for(var i = 0; i < this.length; i++)
            {
                if(this.array[i] == value)
                {return true;}   
            }
        }
        return false;
    }
    this.Clear = function()
    {        
        this.array.length = 0;
        this.length = 0;
    }
    
    this.GetArray = function()
    {return this.array;}
    
    this.GetLength = function()
    {return this.length;}
    
    this.Import = function(splitString, splitChar)
    {
        this.array = splitString.split(splitChar);
        this.length = this.array.length;
    }
    this.Export = function(joinChar)
    {
        var strReturn = "";
        if(this.length >= 1)
        {        
            for(var i = 0; i < this.length; i++)
            {
                strReturn += this.array[i];
                if(i < (this.length -1))
                {strReturn += joinChar;}
            }
        }
        return strReturn;       
        //return this.array.join(joinChar);
    }
}

//VRML 坐标类
function Position()
{
    this.px = 0;
    this.py = 0;
    this.pz = 0;
    //设置坐标值
    this.SetPx = function(value)
    {this.px = value;}
    this.SetPy = function(value)
    {this.py = value;}
    this.SetPz = function(value)
    {this.pz = value;}  
    //获取坐标值
    this.GetPx = function()
    {return this.px;}
    this.GetPy = function()
    {return this.py;}
    this.GetPz = function()
    {return this.pz;}
}

//VRML 方向类
function Orientation()
{
    this.ox = 0;
    this.oy = 0;
    this.oz = 0;
    this.oa = 0;  
    //设置方向值
    this.SetOx = function(value)
    {this.ox = value;}
    this.SetOy = function(value)
    {this.oy = value;}
    this.SetOz = function(value)
    {this.oz = value;}
    this.SetOa = function(value)
    {this.oa = value;}
    //获取方向值
    this.GetOx = function()
    {return this.ox;}
    this.GetOy = function()
    {return this.oy;}
    this.GetOz = function()
    {return this.oz;}
    this.GetOa = function()
    {return this.oa;}
}

//VRML 位置类
function Location()
{
    this.position = new Position();
    this.orientation = new Orientation();
    //设置坐标值
    this.SetPx = function(value)
    {this.position.SetPx(value);}
    this.SetPy = function(value)
    {this.position.SetPy(value);}
    this.SetPz = function(value)
    {this.position.SetPz(value);}
    //设置方向值
    this.SetOx = function(value)
    {this.orientation.SetOx(value);}
    this.SetOy = function(value)
    {this.orientation.SetOy(value);}
    this.SetOz = function(value)
    {this.orientation.SetOz(value);}
    this.SetOa = function(value)
    {this.orientation.SetOa(value);}  
    //获取坐标值
    this.GetPx = function()
    {return this.position.GetPx();}
    this.GetPy = function()
    {return this.position.GetPy();}
    this.GetPz = function()
    {return this.position.GetPz();}
    //获取方向值
    this.GetOx = function()
    {return this.orientation.GetOx();}
    this.GetOy = function()
    {return this.orientation.GetOy();}
    this.GetOz = function()
    {return this.orientation.GetOz();}
    this.GetOa = function()
    {return this.orientation.GetOa();}
    //位置附加信息
    this.Name       = "";
    this.Guid       = "";
    this.VrmlUrl    = "";
    this.Place      = "";
    this.Floor      = "";
    this.Address    = "";
    this.Tel        = "";
    this.Fax        = "";
    this.Web        = "";
    this.LinkMan    = "";
    this.EnterTime  = "";
    this.CorpType   = "";
    this.Intro      = "";
    this.Operation  = "";
    this.Memo       = "";
    this.Fund       = "";
    this.ProduceUrl = "";
}

//VRML 标记类
function MarkUrl()
{
    this.position = new Position();  
    //设置坐标值
    this.SetPx = function(value)
    {this.position.SetPx(value);}
    this.SetPy = function(value)
    {this.position.SetPy(value);}
    this.SetPz = function(value)
    {this.position.SetPz(value);}    
    //获取坐标值
    this.GetPx = function()
    {return this.position.GetPx();}
    this.GetPy = function()
    {return this.position.GetPy();}
    this.GetPz = function()
    {return this.position.GetPz();}
    //标记附加信息 
    this.Name      = "";
    this.Guid      = "";
    this.Target    = "";
    this.Url       = "";  
}


//初始化
function Init(SceneID)
{
    World = SceneID;
}

//根据VRML全局临近传感节点获取当前坐标及方向
function GetLocationByPS(proximitySensorNode)
{
    var Engine = World.Engine;   
    var curLocation = new Location();
    curLocation.SetPx(Engine.Nodes(proximitySensorNode).Fields('position_changed').x); 
    curLocation.SetPy(Engine.Nodes(proximitySensorNode).Fields('position_changed').y); 
    curLocation.SetPz(Engine.Nodes(proximitySensorNode).Fields('position_changed').z); 
    curLocation.SetOx(Engine.Nodes(proximitySensorNode).Fields('orientation_changed').x); 
    curLocation.SetOy(Engine.Nodes(proximitySensorNode).Fields('orientation_changed').y); 
    curLocation.SetOz(Engine.Nodes(proximitySensorNode).Fields('orientation_changed').z); 
    curLocation.SetOa(Engine.Nodes(proximitySensorNode).Fields('orientation_changed').Angle);
    //暂时如此取值
    curLocation.Place      = "外部";
    curLocation.Floor      = "01楼";
    curLocation.Web        = "http://";
    curLocation.ProduceUrl = "http://";
    return curLocation;
}

//设置视点的位置
function SetViewPosition(cam,position)
{
    var Engine = World.Engine;   
    Engine.Nodes(cam).Fields("position").x = position.px;
    Engine.Nodes(cam).Fields("position").y = position.py;
    Engine.Nodes(cam).Fields("position").z = position.pz;
}

//设置视点的方向
function SetViewOrientation(cam,orientation)
{
    var Engine = World.Engine;   
    Engine.Nodes(cam).Fields("orientation").x = orientation.ox;
    Engine.Nodes(cam).Fields("orientation").y = orientation.oy;
    Engine.Nodes(cam).Fields("orientation").z = orientation.oz;
    Engine.Nodes(cam).Fields("orientation").Angle = orientation.oa;
}

//激活视点
function SetVP(cam)
{
    var Engine = World.Engine;   
    Engine.Nodes(cam).Fields("set_bind") = true
}

//获取当前Vrml的Url
function GetCurrentVrmlUrl()
{
    return World.browser.SRC;
}

//设置当前Vrml的Url
function SetCurrentVrmlUrl(VrmlUrl) 
{
    World.browser.SRC = VrmlUrl;
}

//设置当前Vrml的Url
function GetControlState() 
{
    return World.browser.ReadyState;
}

//通过连接增加Vrml模型
function AddVrmlByUrl(url) 
{
    World.Engine.CreateVrmlFromUrl(url, OnComplete);
}

//添加模型回调事件    
function OnComplete(url, nodes, protos, error)
{
    World.Engine.RootNodes.Add( nodes );
}

//添加模型回调事件    
function SetFocus()
{
    World.focus();
}
    
//无刷新请求
function AjaxRequestPost(requestUrl,Param,receiveFuntion)
{
    var url = requestUrl;
    var pars = Param + '&randnum=' + Math.random();
    var myAjax = new Ajax.Request(
                url,
                {method: 'get', parameters: pars, onFailure: reportError, onComplete: receiveFuntion}
                );
}

//无刷新更新
function AjaxUpdaterPost(requestUrl,Param,receiveElement)
{
    var url = requestUrl;
    var pars = Param + '&randnum=' + Math.random();
    var myAjax = new Ajax.Updater(
                {success: receiveElement},
                url,
                {method: 'get', parameters: pars, onFailure: reportError,evalScripts: true}
                );
}

//无刷新错误提示
function reportError(request)
{
    //alert('sorry 出现错误,请和管理员联系!');
}

//获取xmldoc对象
function CreateXMLDom()
{
    if (window.ActiveXObject)
    { 
        var xmldoc　=　new ActiveXObject("Microsoft.XMLDOM");
    }
    else
    { 
        if (document.implementation && document.implementation.createDocument)
        {
	        var xmldoc　=　document.implementation.createDocument("","doc",null);
        }
    }
    xmldoc.async = false;
    xmldoc.preserveWhiteSpace=true;
    return xmldoc;
}

//通过Url载入Xml
function LoadXmlByUrl(XmlUrl)
{
    var xmlDoc = CreateXMLDom();
    xmlDoc.load(XmlUrl);
    return xmlDoc;
}

//通过String载入Xml
function LoadXmlByString(XmlData)
{
    var xmlDoc = CreateXMLDom();
    xmlDoc.loadXML(XmlData);
    return xmlDoc;
}

//取出指定节点的属性
function GetDomAtt(pNode,pAttribute)
{
    try{ return pNode.attributes.getNamedItem(pAttribute).nodeValue;}
    catch(e){return false;}
}

//取出指定节点的列表
function GetXmlNodeList(xmlDoc, NodeName)
{
    var nodeList = xmlDoc.getElementsByTagName(NodeName);
    return nodeList;
}

//通过节点属性获取单一节点
function GetSingleNodeByAtt(nodeList, attName, attValue, ignoreCase, isLike)
{
    var arrNodes = GetMultiNodeByAtt(nodeList, attName, attValue, ignoreCase, isLike);
    if(arrNodes.length < 0)
        return null;
    else
        return arrNodes[0];
}

//通过节点属性获取节点集合
function GetMultiNodeByAtt(nodeList, attName, attValue, ignoreCase, isLike)
{
    var arrNodes = new Array();
    var value = attValue;
    //是否忽略大小写
    if(ignoreCase)
        value = value.toLowerCase();
        
    var length = nodeList.length;
    if(length < 1)
        return false;
        
    for(var i=0; i< length; i++)
    {
        var pNode = nodeList.item(i);
        var pValue = GetDomAtt(pNode, attName);
        if(pValue)
        {
            //是否忽略大小写
            if(ignoreCase)
                value = value.toLowerCase();
                
            //是否模糊匹配
            if(isLike)
            {
                if(pValue.indexOf(value) > -1)
                    arrNodes[arrNodes.length] = pNode;     
            }
            else
            {
                if(pValue == value)
                    arrNodes[arrNodes.length] = pNode;
            }
        }
    }
    return arrNodes;    
}

//从返回的XML中获取模型数组
function GetLocationsXmlData(LocationModelsXml)
{
    var arrayList        = new ArrayList();
    var myXmlDoc         = LoadXmlByString(LocationModelsXml);
    var myNodeList       = GetXmlNodeList(myXmlDoc ,"LocationModel");
    var myNodeListLength = myNodeList.length;
    //遍历子节点
    for (var i = 0; i < myNodeListLength; i++)
    {
        if(myNodeList.item(i))
        {
            var model = FillLocationModel(myNodeList.item(i));
            arrayList.Add(model);
        }
    }
    return arrayList;
}

//从返回的XML中获取模型数组
function GetMarkUrlXmlData(MarkUrlModelsXml)
{
    var arrayList        = new ArrayList();
    var myXmlDoc         = LoadXmlByString(MarkUrlModelsXml);
    var myNodeList       = GetXmlNodeList(myXmlDoc ,"MarkUrlModel");
    var myNodeListLength = myNodeList.length;
    //遍历子节点
    for (var i = 0; i < myNodeListLength; i++)
    {
        if(myNodeList.item(i))
        {
            var model = FillMarkUrlModel(myNodeList.item(i));
            arrayList.Add(model);
        }
    }
    return arrayList;
}

//通过XML节点填充位置模型
function FillLocationModel(Node)
{
    var curLocation = new Location();
    var textNodeLength = Node.childNodes.length;
    //遍历文本节点
    for(var i = 0; i < textNodeLength; i++)
    {
        var textNode = Node.childNodes[i];
        switch(textNode.nodeName)
        {
            case "Name":
                curLocation.Name       = textNode.text;
                break;
            case "Guid":
                curLocation.Guid       = textNode.text;
                break;
            case "VrmlUrl":
                curLocation.VrmlUrl    = textNode.text;
                break;
            case "Place":
                curLocation.Place      = textNode.text;
                break;
            case "Floor":
                curLocation.Floor      = textNode.text;
                break;
            case "Address":
                curLocation.Address    = textNode.text;
                break;
            case "Tel":
                curLocation.Tel        = textNode.text;
                break;
            case "Fax":
                curLocation.Fax        = textNode.text;
                break;
            case "Web":
                curLocation.Web        = textNode.text;
                break;
            case "LinkMan":
                curLocation.LinkMan    = textNode.text;
                break;
            case "EnterTime":
                curLocation.EnterTime  = textNode.text;
                break;
            case "CorpType":
                curLocation.CorpType   = textNode.text;
                break;
            case "Intro":
                curLocation.Intro      = textNode.text;
                break;
            case "Operation":
                curLocation.Operation  = textNode.text;
                break;
            case "Memo":
                curLocation.Memo       = textNode.text;
                break;
            case "Fund":
                curLocation.Fund       = textNode.text;
                break;
            case "ProduceUrl":
                curLocation.ProduceUrl = textNode.text;
                break;
            case "Position":
                var positionNode = textNode;
                var positionNodeLength = textNode.childNodes.length;
                for(var j = 0; j < positionNodeLength; j++)
                {
                    var positionSubNode = positionNode.childNodes[j];
                    var positionSubNodeName = positionSubNode.nodeName;
                    if(positionSubNodeName == "Px")
                    {
                        curLocation.SetPx(positionSubNode.text);
                    }
                    else if(positionSubNodeName == "Py")
                    {
                        curLocation.SetPy(positionSubNode.text);
                    }
                    else if(positionSubNodeName == "Pz")
                    {
                        curLocation.SetPz(positionSubNode.text);
                    }
                }      
                break;
            case "Orientation":
                var orientationNode = textNode;
                var orientationNodeLength = textNode.childNodes.length;
                for(var k = 0; k < orientationNodeLength; k++)
                {
                    var orientationSubNode = orientationNode.childNodes[k];
                    var orientationSubNodeName = orientationSubNode.nodeName;
                    if(orientationSubNodeName == "Ox")
                    {
                        curLocation.SetOx(orientationSubNode.text);
                    }
                    else if(orientationSubNodeName == "Oy")
                    {
                        curLocation.SetOy(orientationSubNode.text);
                    }
                    else if(orientationSubNodeName == "Oz")
                    {
                        curLocation.SetOz(orientationSubNode.text);
                    }
                    else if(orientationSubNodeName == "Oa")
                    {
                        curLocation.SetOa(orientationSubNode.text);
                    }
                } 
                break;
                
            default:
                break;
        }
    }
    //返回 LocationModel 填充模型
    return curLocation; 
}

//通过XML节点填充位置模型
function FillMarkUrlModel(subNode)
{
    var curMarkUrl = new MarkUrl();
    var textNodeLength = subNode.childNodes.length;
    //遍历文本节点
    for(var i = 0; i < textNodeLength; i++)
    {
        var textNode = subNode.childNodes[i];
        switch(textNode.nodeName)
        {
            case "Name":
                curMarkUrl.Name   = textNode.text;
                break;
            case "Guid":
                curMarkUrl.Guid   = textNode.text;
                break;
            case "Target":
                curMarkUrl.Target = textNode.text;
                break;
            case "Url":
                curMarkUrl.Url    = textNode.text;
                break;
            case "Position":
                var positionNode = textNode;
                var positionNodeLength = textNode.childNodes.length;
                for(var j = 0; j < positionNodeLength; j++)
                {
                    var positionSubNode = positionNode.childNodes[j];
                    var positionSubNodeName = positionSubNode.nodeName;
                    if(positionSubNodeName == "Px")
                    {
                        curMarkUrl.SetPx(positionSubNode.text);
                    }
                    else if(positionSubNodeName == "Py")
                    {
                        curMarkUrl.SetPy(positionSubNode.text);
                    }
                    else if(positionSubNodeName == "Pz")
                    {
                        curMarkUrl.SetPz(positionSubNode.text);
                    }
                }      
                break;
                
            default:
                break;
        }        
    }
    //返回 LocationModel 填充模型
    return curMarkUrl; 
}

//验证输入框是否为空
function isEmpty(_obj, flag)
{
    var obj  = $(_obj);
    var info = $(_obj + "Info");
    if(flag)
    {
        if(obj.value.length == 0)
        {
            showInfo(info,"×","red");
            return false;
        }
        else
        {
            showInfo(info,"√","green");
            return true;
        }
    }
    else
    {
        showInfo(info,"您的表单内容不能为空","blue");
        return false;
    }    
}

//验证邮编,内容非必填字段,如果填写则进行验证
function isNumber(_obj,flag)
{
    var obj  = $(_obj);
    var info = $(_obj + "Info");
    var reg = /^[+-]?\d+[.]?\d*$/;
    if(flag)
    {
        if(reg.test(obj.value) == false)
        {
            showInfo(info,"×","red")
            return false;
        }
        else
        {
            showInfo(info,"√", "green")
            return true;
        }
    }
    else
    {
        showInfo(info,"方位值为整数或浮点数","blue")
    }
}

//显示信息
function showInfo(_info, msg, color)
{
    var info = _info;
    info.innerHTML = msg;
    info.style.color=color;
}

//JS获取当前WEB路径
function GetVirtualPath()
{
    var arrParam = new Array();
    var currentUrl = document.URL;
    var requestUrl = currentUrl.split('?');
    var weburl = requestUrl[0];
    weburl = weburl.toLowerCase();
    weburl = weburl.replace("http://","");
    var paramUrl = weburl.split('/');
    var length = paramUrl.length;
    
    var virtualPath = "http://";
    if(length > 0)
    {
        for(var i = 0; i < (length - 1); i++)
        {
            virtualPath += paramUrl[i];            
            virtualPath += "/";
        }
    }
    return virtualPath;
}

//JS获取链接参数
function GetRequestParam()
{
    var arrParam = new Array();
    var currentUrl = document.URL;
    var requestUrl = currentUrl.split('?');
    if(requestUrl[1])
    {
        var paramUrl = requestUrl[1].split('&');
        var length = paramUrl.length;
        for(var i = 0; i < length; i++)
        {
            var param = paramUrl[i].split('=');
            arrParam[param[0]] = param[1];
        }
    }
    return arrParam;
}

//从返回的XML中获取模型数组
function GetXmlTemplete(XmlUrl,TempleteName)
{
    var myXmlDoc      = LoadXmlByUrl(XmlUrl);
    var rootNode      = myXmlDoc.documentElement;
    var subNodeLength = rootNode.childNodes.length;
    for (var i = 0; i < subNodeLength; i++)
    {
        var subNode = rootNode.childNodes[i];
        if(subNode.nodeName == TempleteName)
        {
            return subNode.text;
        }
    }
}

//操作单一位置节点
function OPSingleLocation(LocationXml)
{   
    var myXmlDoc = LoadXmlByString(LocationXml);
    var rootNode = myXmlDoc.documentElement;
    if(rootNode.nodeName == "Location")
    {
      return FillLocationModel(rootNode);
    }
    return null;
}
