//管理js文件 获取modeldata.js 判断是否有特殊的字段，如果有就先加载SpecialScene.js 里面有对特殊场景处理的代码 否则就直接加载main
var Manage = function(){
    this.weixinURL = "https://res.wx.qq.com/open/js/jweixin-1.2.0.js",
    this.time = "?"+new Date().getTime();
    this.loadAudio();
    this.loadWeixin();
}
//动态加载js文件
Manage.prototype.LoadJs = function(_files, succes){
	/* 已加载文件缓存列表,用于判断文件是否已加载过，若已加载则不再次加载*/
	var classcodes = [];
	var FileArray = [];
    if (typeof _files === "object") {
        FileArray = _files;
    } else {
        /*如果文件列表是字符串，则用,切分成数组*/
        if (typeof _files === "string") {
            FileArray = _files.split(",");
        }
    }
    if (FileArray != null && FileArray.length > 0) {
        var LoadedCount = 0;
        for (var i = 0; i < FileArray.length; i++) {
            loadFile(FileArray[i], function() {
                LoadedCount++;
                if (LoadedCount == FileArray.length) {
                	try {
                		succes();
                	}
                    catch(err) {
					    console.log("err: 您未定义回调");
					}
                }
            })
        }
    }
    /*加载JS文件,url:文件路径,success:加载成功回调函数*/
    function loadFile(url, success) {
        if (!FileIsExt(classcodes, url)) {
            var _ThisType = GetFileType(url);
            var ThisType = _ThisType.indexOf("?") == -1 ? _ThisType  :  _ThisType.substring(0,_ThisType.indexOf("?"));
            var fileObj = null;
            if (ThisType == ".js") {
                fileObj = document.createElement('script');
                fileObj.src = url;
            } else if (ThisType == ".css") {
                fileObj = document.createElement('link');
                fileObj.href = url;
                fileObj.type = "text/css";
                fileObj.rel = "stylesheet";
            } else if (ThisType == ".less") {
                fileObj = document.createElement('link');
                fileObj.href = url;
                fileObj.type = "text/css";
                fileObj.rel = "stylesheet/less";
            }
            success = success || function() {};
            fileObj.onload = fileObj.onreadystatechange = function() {
                if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
                    success();
                    classcodes.push(url)
                }
            }
            document.getElementsByTagName('head')[0].appendChild(fileObj);
        } else {
            success();
        }
    }
    /*获取文件类型,后缀名，小写*/
    function GetFileType(url) {
        if (url != null && url.length > 0) {
            return url.substr(url.lastIndexOf(".")).toLowerCase();
        }
        return "";
    }
    /*文件是否已加载*/
    function FileIsExt(FileArray, _url) {
        if (FileArray != null && FileArray.length > 0) {
            var len = FileArray.length;
            for (var i = 0; i < len; i++) {
                if (FileArray[i] == _url) {
                    return true;
                }
            }
        }
        return false;
    }
	
};

//获取页面url后面的参数
Manage.prototype.number = function(variable) {
	var query = window.location.search.substring(1);
   	var vars = query.split("&");
   	for (var i=0;i<vars.length;i++) {
           	var pair = vars[i].split("=");
           	if(pair[0] == variable){return pair[1];}
   	}
   	return(false);
};

Manage.prototype.loadWeixin = function() {
    var that = this;
    this.LoadJs(that.weixinURL+that.time,function(){ });

}

Manage.prototype.loadAudio = function() { //相关：g_tourAudio \  g_playAudio
    g_bgAudio = new Audio;
    g_bgAudio.loop = true;
    g_bgAudio.autoplay = true;
    g_bgAudio.id = "bgaudio";
    
    //https://www.cnblogs.com/interdrp/p/4211883.html   部分资料
    g_bgAudio.load();	// iOS 9   还需要额外的 load 一下, 否则直接 play 无效
    var play = function(){
        //if(window.tourAudioSta) return;
         
        if(this.bgmShouldPlay){
            this.switchBgmState(true)
        }
        
        document.removeEventListener("touchstart",play);
        document.removeEventListener("click",play);
        $('#player')[0].removeEventListener("touchstart", play);
    }.bind(this);
    
    g_bgAudio.oncanplay = ()=>{ 
        this.switchBgmState(true)
    }
    document.addEventListener("WeixinJSBridgeReady", ()=> {
        this.switchBgmState(true)
    }, false);
    
    document.addEventListener("touchstart", play);//ios需要加个事件才能播放 不能自动播放；如果还有浏览器不行，换成别的交互事件
    document.addEventListener("click", play);
     $('#player')[0].addEventListener("touchstart", play);
    g_bgAudio.addEventListener('ended', ()=>{ 
        this.switchBgmState(true)
    }); 
    
    
    
    $("#volume").find("a").on("click", ()=> { 
         
        if($("#volume img")[0].src.indexOf("btn_on.png")>-1)
        { 
            this.switchBgmState(true); 
        }
        else if($("#volume img")[0].src.indexOf("btn_off.png")>-1)
        {
            this.switchBgmState(false);    
        }
    }) 

    
    
}   
Manage.prototype.switchBgmState = function(state){
    if(!g_bgAudio || !g_bgAudio.src) return;
    this.bgmShouldPlay = state
    
    var played = function(){
        console.log('begin play bgm');
        g_play = 1; 
        g_playAudio = g_bgAudio;
        $("#volume a img").attr("src", "./images/Volume btn_off.png")
        $("#volume").attr("title", "关闭声音");
        g_tourAudio && g_tourAudio.pause()
    }
    var paused = function(){ 
        g_play = 0;
        g_playAudio == g_bgAudio && (g_playAudio =  null)
        $("#volume a img").attr("src", "./images/Volume btn_on.png")
        $("#volume").attr("title", "打开声音");
    }
    
    if(state ){
        g_bgAudio.play(); 
        if(g_bgAudio.paused){
            paused()
        }else{
            played()
            return true
        }            
    }else{
        g_bgAudio.pause();
        paused()
    } 
    
    
    g_bgAudio.pauseByHot = false
    g_bgAudio.pauseByTour = false
}    
    
 

 


 


Manage.prototype.weixinShare = function() {
    console.log("weixinShare")
    $.ajax({    
        url:'https://www.4dage.com/wechat/jssdk/', 
        type: "post",
        data : {
            'url' : location.href.split('#')[0]
        }, 
        dataType:"jsonp",     
        jsonpCallback:"success_jsonp",         
        success:function(data,textStatus){
            console.log("weixinShare success")
            console.log(data.appId)
            
            wx.config({
                // debug : true,
                appId : data.appId,
                timestamp : data.timestamp,
                nonceStr : data.nonceStr,
                signature : data.signature,
                jsApiList : [ 'checkJsApi', 'onMenuShareTimeline',
                        'onMenuShareAppMessage', 'onMenuShareQQ',
                        'onMenuShareWeibo', 'hideMenuItems',
                        'showMenuItems', 'hideAllNonBaseMenuItem',
                        'showAllNonBaseMenuItem', 'translateVoice',
                        'startRecord', 'stopRecord', 'onRecordEnd',
                        'playVoice', 'pauseVoice', 'stopVoice',
                        'uploadVoice', 'downloadVoice', 'chooseImage',
                        'previewImage', 'uploadImage', 'downloadImage',
                        'getNetworkType', 'openLocation', 'getLocation',
                        'hideOptionMenu', 'showOptionMenu', 'closeWindow',
                        'scanQRCode', 'chooseWXPay',
                        'openProductSpecificView', 'addCard', 'chooseCard',
                        'openCard' ]
            });
        },    
        error:function(XMLHttpRequest,textStatus,errorThrown){    
            console.log("jsonp.error:"+textStatus);    
        }    
    }); 
    
    var success_jsonp = function(json){
        console.log(json);
    };


    wx.ready(function(){ 
        // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行〿
        //对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中〿
        //分享到朋友圈 
        console.log(g_weixinObj)
        wx.onMenuShareTimeline({ 
            title: g_weixinObj.title, // 分享标题 
            link: g_weixinObj.lineLink, // 分享链接 
            imgUrl: g_weixinObj.imgUrl, // 分享图标 
            desc: g_weixinObj.desc
        }); 

        //获取“分享给朋友”按钮点击状态及自定义分享内容接叿
        wx.onMenuShareAppMessage({ 
            title: g_weixinObj.title, // 分享标题 
            desc: g_weixinObj.desc,  // 分享描述 
            link: g_weixinObj.lineLink, // 分享链接 
            imgUrl: g_weixinObj.imgUrl, // 分享图标 
            type: '', // 分享类型,music、video或link，不填默认为link 
            dataUrl: '' // 如果type是music或video，则要提供数据链接，默认为空 
        });
        
        wx.onMenuShareWeibo({
            title: g_weixinObj.title, // 分享标题
            desc: g_weixinObj.desc, // 分享描述
            link: g_weixinObj.lineLink, // 分享链接
            imgUrl: g_weixinObj.imgUrl, // 分享图标
            success: function () { 
                // 用户确认分享后执行的回调函数
            },
            cancel: function () { 
                // 用户取消分享后执行的回调函数
            }
        });

        wx.onMenuShareQZone({
            title: g_weixinObj.title, // 分享标题
            desc: g_weixinObj.desc, // 分享描述
            link: g_weixinObj.lineLink, // 分享链接
            imgUrl: g_weixinObj.imgUrl, // 分享图标
            success: function () { 
                // 用户确认分享后执行的回调函数
            },
            cancel: function () { 
                // 用户取消分享后执行的回调函数
            }
        });

        wx.onMenuShareQQ({
            title: g_weixinObj.title, // 分享标题
            desc:  g_weixinObj.desc, // 分享描述
            link: g_weixinObj.lineLink, // 分享链接
            imgUrl: g_weixinObj.imgUrl, // 分享图标
            success: function () { 
                // 用户确认分享后执行的回调函数
            },
            cancel: function () { 
                // 用户取消分享后执行的回调函数
            }
        });

        wx.error(function(res){ 
        // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名〿

        });
    });

    
}



Manage.prototype.dealURL = function(src, type){
    //music: "///super.4dage.com/data/LYW/edit/20200928_151633415.mp3"
    //"https://super.4dage.com/data/LYW/edit/20200928_165319399.jpg"]
    
   
    if(window.isLocal && settings.localPrefix!=void 0){//本地将线上的前缀替换
        var oldPrefixs = ["https://super.4dage.com/", "http://super.4dage.com/", "///super.4dage.com/"]
        for(let i=0;i<oldPrefixs.length;i++){
            if(src.includes(oldPrefixs[i])){
                return src.replace(oldPrefixs[i], settings.localPrefix)
                break;
            }
        }
        console.error("没有找到合适的本地链接")
        return src
    }else{
        //add https://
        var prefix = g_Prefix.replace('https://','').replace('http://','') 
        if(!src.includes('http:/') && !src.includes('https:/') && src.includes(prefix)){
            src = 'https://'+src
        }
        return src
    }
    
    
}


Manage.prototype.removeSrcPostMark = function(url){//去除texture.load时自动加上的'?'
    var index = url.indexOf('?')
    if(index>-1){
        return url.slice(0, index)
    }else return url 
}


Manage.prototype.showInfo = function (o) { // ({result:true, title:"发布成功"}); 
	 
	var box = $(".resultBox");
	
	var title = o.title || o || i18n.get('保存成功');
	box.children().eq(0).html(title) 
	
	
	//var time = o.time || THREE.Math.clamp((Config.lang=='en') ? title.length*50 : title.length*130 ,1300,5000);
	var time = o.time ||  THREE.Math.clamp(title.length*130 ,1300,  5000);
    o.time || console.log("showtime  " + time)
	
	//实际有一半的时间在渐变透明度
	this.showInfoTimer && clearTimeout(this.showInfoTimer) 
	box.removeClass("animate");//如果之后不久又要showinfo一个的话，先停止前面的animate
	setTimeout(function () {
		box.css(
			{
				'-webkit-animation-duration': time + 'ms',
				'animation-duration': time + 'ms'
			}
		)
        if(o.top){
            box.children().css('top', o.top + "%");
        }else{
            box.children().css('top', '' )
        }
		box.removeClass("hide");
		box.addClass("animate");
		if (o.dontInteract) {//遮挡对屏幕的操作
			box.css('pointer-events', 'auto')
		} else {
			box.css('pointer-events', 'none')
		}
		 

		this.showInfoTimer = setTimeout(function () {
			box.removeClass("animate");
			box.addClass("hide");
			this.showInfoTimer = null; 
		}.bind(this), time + 20)

	}.bind(this), 50)//这个数字太小的话后面触发的没有重新animate的效果 应该要比帧率大吧


}//like:  manage.showInfo({title:'a', top:20})



var manage = new Manage();

//公用的函数

function getQueryVariable(variable)
{
       var query = window.location.search.substring(1);
       var vars = query.split("&");
       for (var i=0;i<vars.length;i++) {
               var pair = vars[i].split("=");
               if(pair[0] == variable){return pair[1];}
       }
       return(false);
}

//隐藏公司Logo
function showLogo(){
    $("#myCompany").hide();
    $("#loaderCoBrandName").hide();
    $("#title-logo").hide();
    $(".title-container").css("justify-content","center")
}
//czj 添加随机的时间
function randomTime(){
    return new Date()
};
function matcher(data){
    if(!data || !g_version ) return data;
    delete data.model.vision_version;
    var _data = {
        files: {
            "templates": ["images/images{{number}}/{{filename}}"]
        },
        model :{
            sid :window.number,
            camera_start:
            data.model.images && data.model.images.length != 0  ? 
            {
                camera: {
                    zoom: "-1",
                    quaternion: [
                        JSON.parse(data.model.images[0].metadata).camera_quaternion.z,
                        JSON.parse(data.model.images[0].metadata).camera_quaternion.w,
                        JSON.parse(data.model.images[0].metadata).camera_quaternion.x,
                        JSON.parse(data.model.images[0].metadata).camera_quaternion.y
                    ]
                },
                pano: { uuid: JSON.parse(data.model.images[0].metadata).scan_id },
                mode: "0"
            }
            : ''
        },
        sid: window.number,
        hoticon: {
            default: "https://super.4dage.com/images/4dagePoint2.png",
            higt: "https://super.4dage.com/images/4dagePoint.png"
        },
        special: "false",
        weixinDesc: ""
    };
    $.extend(true,data,_data)
    return data;
}

function hotMatcher(data={}){
    //if(!data || !g_version) return data; 
    if(g_version) {
        data.tourAudio = data.audio || {};
    }else{
        data.tourAudio = {}
    }
    return data;
}


var GifTexDeal = {
    
    animateObjects : [], 
    animateTexs : [] ,
    addAnimation : function(texture, owner, info, id){
        /* if(this.animateObjects.find(e=> 
            e.texture == texture && !ifSame(info, e.info) 
        )) */ 
        
        var animation
        var tex = this.animateTexs.find(e=>e.texture == texture)
        if(tex){
            animation = tex
        }else{
            animation = {texture,info }
            this.animateTexs.push(animation)
            this.setRepeart(animation)
        }
        
        var object = {
            animation, //默认相同的texture对应的info是一样的, 对应一个animation
            owner,        
        }
         
        this.animateObjects.push(object)
        return object
    },
    
    
    remove : function(object){
        var index = this.animateObjects.indexOf(object) 
        if(index>-1){
            this.animateObjects.splice(index, 1)
            
            if(!this.animateObjects.find(e=>e.animation == object.animation)){
                let i = this.animateTexs.indexOf(object.animation)
                this.animateTexs.splice(i, 1)
                object.animation.texture.repeat.set(1,1) 
            }
            
            this.stop(object) 
            
        }
    },
    setRepeart : function(animation){
        animation.texture.repeat.set(1/animation.info.cellXcount, 1/animation.info.cellYcount)
    },
    start: function(object){ 
         
        if(!object || object.started )return;
        object.started = true
        if(object.animation.started)return;
        object.animation.started = true
        
        var info = object.animation.info
        var count = info.cellXcount * info.cellYcount - (info.voidCount || 0)
     
        if(count <= 1)return;
        
        transitions.start( (progress)=>{
            var index = Math.floor(count * progress);
            var indexX =  index % info.cellXcount
            var indexY =  info.cellYcount - Math.floor(index /info.cellXcount ) - 1;  //uv.offset.y是从下到上的
            object.animation.texture.offset.x = indexX / info.cellXcount;
            object.animation.texture.offset.y = indexY / info.cellYcount;
            
            //console.log(object.id + " : "+ object.texture.offset.toArray())
        } , info.duration * (-1), null,/* ()=>{//done  (-1):循环
            object.started = false
            object.texture.offset.x = 0;
            object.texture.offset.y = 0;
            this.start(object)
        }, */ 0 ,null, object.id, "gif_"+object.animation.texture.id); 

        

    },
    
    
    stop: function(object){ 
        if(!object || !object.started)return;
        object.started = false
        //只有该object对应的texture对应的所有object都停止了，才能真的停止动画:
        if(this.animateObjects.find(e=>e.animation == object.animation && e.started)) return;
        
         
        transitions.cancelById("gif_"+object.animation.texture.id);
        object.animation.texture.offset.set(0,0)
        object.animation.started = false     
        
    }
}

var CloneObject = function(copyObj, result, isSimpleCopy, extraReplace) {
    //isSimpleCopy只复制最外层
    //复制json		result的可能：普通数字或字符串、普通数组、复杂对象
    if(!copyObj)return copyObj //0 null undefined ''
    result = result || {};
    if (copyObj instanceof Array) {
        /*  if (copyObj[0]instanceof Object) {
            //不支持含有 [[Object]] 这样二级数组里面还是复杂数据的，普通和复杂的数据混合可能也不支持
            console.error("不支持含有 [[Object]] 这样二级数组里面还是复杂数据的...")
        }  
        
        return copyObj.slice(0);*/ //如果是数组，直接复制返回（排除数组内是object 
        return copyObj.map(e=>{
            if(e instanceof Object){
                return CloneObject(e)
            }else return e 
        })
       
    }else{
        if(copyObj.clone instanceof Function ){ //解决一部分
            return copyObj.clone()
        }
    }
    for (var key in copyObj) {
        if (copyObj[key] instanceof Object && !isSimpleCopy)
            result[key] = CloneObject(copyObj[key]);
        else
            result[key] = copyObj[key];
        //如果是函数类同基本数据，即复制引用
    }
    return result;
}
;
var ifSame = function(object1, object2){
    if(object1 == object2  )return true // 0 != undefined  , 0 == ''
    else if(!object1 || !object2) return false
    else if(object1.constructor != object2.constructor){
        return false
    }else if(object1 instanceof Array ) {
        if(object1.length != object2.length)return false;
        var _object2 = object2.slice(0);
        
        for(let i=0;i<object1.length;i++){ 
            var u = _object2.find(e=>ifSame(object1[i], e));
            if(u == void 0 && !_object2.includes(u) && !object1.includes(u))return false;
            else{
                let index = _object2.indexOf(u);
                _object2.splice(index,1);
            }
        }
        
        return true
    }else if(object1.equals instanceof Function ){//复杂数据仅支持这种，其他的可能卡住？
        
        return object1.equals(object2)
          
    }else if(typeof object1 == 'number' ||  typeof object1 == 'string'){
        if(isNaN(object1) && isNaN(object2))return true
        else return object1 == object2
        
    }else if(typeof object1 == "object"){
        var keys1 = Object.keys(object1)
        var keys2 = Object.keys(object2)
        if(!ifSame(keys1,keys2))return false;
        
        for(let i in object1){
            var same = ifSame(object1[i], object2[i]);
            if(!same)return false
        }
        return true
    }else{
        console.log('isSame出现例外')
    }
    
    
    
    
    
}




var SoundPriority = {//暂不支持同时播放
    currentPlay:null,//当前正在播放list中的哪一个
    list:[
        {
            name:"bg", 
            level : 0,//越大优先级越高
            canBeInterrupted : true ,
            
        },
        {
            name:"boxVideo", 
            level : 1, 
            canBeInterrupted : true,
            checkIfNeedPlay:function(){
                
                
            }
        },
        {
            name:"hot", 
            level : 2, 
            canBeInterrupted : true
        },
        {
            name:"tour", 
            level : 3, 
            canBeInterrupted : true
        },
        
        
    ],
    register:function(){
        
        
        
    }
    
    
}

//兼容一代的場景
//請求地址統一管理
var g_onePregix = "https://bigscene.4dage.com/" //对应一代  http://www.4dmodel.com/SuperPanoramic/index.html?m=55
var g_version = manage.number("version");
g_version === "one" ? g_Prefix = g_onePregix : '';

