var photoOrg = photoOrg || {};
photoOrg.hostName = "5639a64bd39a"
photoOrg.allFiles = photoOrg.allFiles || [];
photoOrg.translations = photoOrg.translations || {};
photoOrg.config = photoOrg.config || {}
photoOrg.config = $.extend(true, photoOrg.config, {"context":"/hp/sf/sf-us/snapfish-us","env":"production","locale":"en_US","library_cdn_host":"https://prd-static.sf-cdn.com/library","library_url_domain":"www.snapfish.com","cobrandName":"snapfish","websiteName":"snapfish_us","parnerName":"snapfish","is_device_on":true,"is_facebook_on":true,"is_instagram_on":true,"is_flickr_on":false,"is_google_on":true,"store_url":"https://www.snapfish.com","library_url":"https://www.snapfish.com/library","sdk_version":"aggr_module_min_1.7.0.js","photoSourceList":["google","facebook","instagram","flickr"],"store_cdn_url":"https://prd-static.sf-cdn.com","enable_api_hit_with_main_host":false});


photoOrg.app = {};
photoOrg.app.preloadAllFiles = function(){
    var lRef = document.createElement("link")
    for(var i=0; i<photoOrg.allFiles.length; i++){
        if(lRef.relList){
            $('<link/>').attr({
            rel: 'prefetch',
            href:  photoOrg.allFiles[i],
            crossorigin: 'anonymous'
            }).appendTo("body");
        }else{
            $.ajax({
            url: photoOrg.allFiles[i],
            dataType: " text/plain",
            cache:true
            });
        }
    }
}
photoOrg.app.calculateRefreshTokenTime = function(ts){
   try{
        var timeDiff = (30 * 60);
        var oa2creationTime = Number.parseInt(ts) + 25200000;
        var gmtCurrentTime = new Date().getTime() + (new Date().getTimezoneOffset() * 60 * 1000);
        var refreshTokenRemaingTime = Math.abs(gmtCurrentTime - oa2creationTime)/1000;
        return refreshTokenRemaingTime > 0 ? refreshTokenRemaingTime : 0;
    }catch(e){
        return timeDiff;
    }
}
photoOrg.app.logPageLoadMetrics = function(config, page){
    try{
        if(config.clickTime && photoOrg.clientLogger && photoOrg.clientLogger.info){
            photoOrg.clientLogger.info({description: "LIBRARY: LoadTime for the page "+ page +" = "+ (new Date()-config.clickTime)/1000 +"SEC",  quickLogger: true});
        }
    }catch(e){

    }
}
photoOrg.app.isValidConfiguration = function(config){
    if(config && config.oauthInfo && config.oauthInfo.oa2 && config.oauthInfo.oa2 != "null" && config.oauthInfo.GSID && config.oauthInfo.GSID != "null"){
        return true;
    }else{
        return false;
    }
}

    photoOrg.translations.sourceStatusWidget = {};


photoOrg.sourceStatusApp ={
    'name': "sourceStatusApp",//name of component
    'preJSFiles' : [],//Array for JS Files
    'preCSSFiles' : [],//Array for CSS Files
    'postJSFiles' : [],//Array for JS Files after initial load
    'postCSSFiles' : [],
    'successCSSFiles': 0,//Count for CSS Files loaded
    'successJSFiles':0,//Count for JS Files loaded
    'isAppPageLoaded': false,
    'isConfigReceived': false,
    'sdkVersion': "aggr_module_min_1.7.0.js",
    'refreshObj': { "refreshPhotos" : false, "refreshProjects" : false},
    'transconfigUrl': "/transconfig?oh=www_snapfish_com&vn=23092021"
    //'transconfigUrl': "https://dev.library.sf-qa.com/library/transconfig?oh=www_snapfish_com&vn=23092021"
}





photoOrg.sourceStatusApp.storeAllFiles = function(){
    console.log("widget-sourceStatusApp.storeAllFiles");
    photoOrg.allFiles = photoOrg.allFiles.concat(photoOrg.sourceStatusApp.preJSFiles,photoOrg.sourceStatusApp.preCSSFiles,photoOrg.sourceStatusApp.postJSFiles);
    photoOrg.allFiles = $.unique(photoOrg.allFiles);
}

photoOrg.sourceStatusApp.pushAllFiles = function(){

    console.log("widget-sourceStatusApp.pushAllFiles");
    console.log("push files with cdn host ");


            photoOrg.sourceStatusApp.preJSFiles.push('<script src="https://prd-static.sf-cdn.com/library/release-20250612-0519-e7908cd/assets/source_status_widget_application-680cd27555287d9c2d93a4d979b0fdbcfaa791fa8117afda881d19819e2fa2f0.js"></script>');



}

photoOrg.sourceStatusApp.loadedCount = 0;
photoOrg.sourceStatusApp.onLoadOfScriptsLinkTags = function(invokeJsRequest){
    photoOrg.sourceStatusApp.loadedCount++;
    if (photoOrg.sourceStatusApp.loadedCount === 
    (photoOrg.sourceStatusApp.preJSFiles.length + photoOrg.sourceStatusApp.preCSSFiles.length)) {
        photoOrg.sourceStatusApp.jsDefer.resolve();
        photoOrg.sourceStatusApp.cssDefer.resolve();
    }else if(invokeJsRequest  
    && photoOrg.sourceStatusApp.successJSFiles < photoOrg.sourceStatusApp.preJSFiles.length ){
        photoOrg.sourceStatusApp.loadJSFiles(photoOrg.sourceStatusApp.preJSFiles[photoOrg.sourceStatusApp.successJSFiles])
    }
}

photoOrg.sourceStatusApp.loadCSSFiles = function( url, callback ) {  
     

    if(url.indexOf("link") > -1  && url.indexOf("module") > -1){
        
        async function loadAndExecuteScript(url) {
            const script = document.createElement('script');
            script.type = 'module';
            script.src = $(url).attr("href");

            // Wrap script loading in a Promise
            const scriptLoaded = new Promise((resolve, reject) => {
                script.onload = resolve;
                script.onerror = reject;
            });

            document.getElementsByTagName('head')[0].appendChild(script);


            // Wait for script to load and execute (using await)
            await scriptLoaded;

            photoOrg.sourceStatusApp.onLoadOfScriptsLinkTags();
        }

        loadAndExecuteScript(url)
        return;
        
    }
    
    if(url.indexOf("link") > -1){
        url = $(url).attr("href");
    }
    console.log("widget-uploadConfirmApp-loadCSSFiles"+ url);
    $.ajax({
        url:url,
        contentType: 'text/plain',
        success:function(data){
            $("head").append("<style>" + data + "</style>");
            photoOrg.sourceStatusApp.onLoadOfScriptsLinkTags();
            if(callback != undefined){
            console.log('css callback is called')
            callback(true)
            }
        },
        error: function(data){
            console.log('css not loaded')
        }
    });
 

}

photoOrg.sourceStatusApp.downloadJSFiles = function(url, callback) {
    $.ajax({
        url: url,
        dataType: "script",
        async: false,
        headers: {
            "Accept": "application/javascript",
            "Content-Type": "application/javascript"
        },
        success: function(response) {
            if(callback){
                callback();
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log('CommonWidgetTemplate: error in downloadJSFiles');
        },
        cache:true
    });
}
photoOrg.sourceStatusApp.loadJSFiles = function(url,callback){
    
    if(url.indexOf("script") > -1){
         async function loadAndExecuteScript(url) {
            const script = document.createElement('script');
            if(url.indexOf("module") > -1){
                script.type = 'module';
            }
            script.src = $(url).attr("src");

            // Wrap script loading in a Promise
            const scriptLoaded = new Promise((resolve, reject) => {
                script.onload = resolve;
                script.onerror = reject;
            });

            document.getElementsByTagName('head')[0].appendChild(script);

            // Wait for script to load and execute (using await)
            await scriptLoaded;

            photoOrg.sourceStatusApp.successJSFiles++;
            var invokeJsRequest = true;
            photoOrg.sourceStatusApp.onLoadOfScriptsLinkTags(invokeJsRequest);
        }
        loadAndExecuteScript(url);
    }
    console.log("widget-sourceStatusApp.loadJSFiles"+ url);
    return;
    if(photoOrg.sourceStatusApp.sdkVersion && url && url.indexOf(photoOrg.sourceStatusApp.sdkVersion) !== -1 && !typeof(AggrModule) === "undefined"){
        callback();
    }

    if(url.indexOf("script") > -1){
        url = $(url).attr("src");
    }

    var script = document.createElement('script');
    console.log("the js URL is:"+url);
    script.src = url;

    if(callback != undefined){
        if (script.readyState) { //for few IE browsers
            script.onreadystatechange = function() {
                if (script.readyState == "loaded" || script.readyState == "complete") {
                    script.onreadystatechange = null;
                        callback();
                    }
                };
            } else {
            script.onload = function() { // Other browsers
                callback();
            };
            script.onerror = function(){
                photoOrg.sourceStatusApp.jsDefer.reject();
            };
    }
    }
    document.getElementsByTagName('head')[0].appendChild(script);

}

photoOrg.sourceStatusApp.onSuccessJSloaded = function(){
    console.log("widget-sourceStatusApp-onSuccessJSloaded and count is" + photoOrg.sourceStatusApp.successJSFiles);
    photoOrg.sourceStatusApp.successJSFiles++
    if(photoOrg.sourceStatusApp.successJSFiles >= photoOrg.sourceStatusApp.preJSFiles.length){
        photoOrg.sourceStatusApp.jsDefer.resolve();
    }else{
        photoOrg.sourceStatusApp.loadJSFiles(photoOrg.sourceStatusApp.preJSFiles[photoOrg.sourceStatusApp.successJSFiles], photoOrg.sourceStatusApp.onSuccessJSloaded)
    }
}

photoOrg.sourceStatusApp.onSuccessCSSloaded = function(status){
    console.log("widget-sourceStatusApp-onSuccessCSSloaded"+ status + "count is" + photoOrg.sourceStatusApp.successCSSFiles);
    console.log('cssloaded'+status);
    if(status){
        photoOrg.sourceStatusApp.successCSSFiles++;
    }else{
        console.log('css file failed')
        photoOrg.sourceStatusApp.cssDefer.reject();
    }
    if(photoOrg.sourceStatusApp.successCSSFiles == photoOrg.sourceStatusApp.preCSSFiles.length){
        photoOrg.sourceStatusApp.cssDefer.resolve();
    }
}

photoOrg.sourceStatusApp.addReactLibrary = function(config){
}

photoOrg.sourceStatusApp.init = function(config){
    photoOrg.sourceStatusApp.initBeginTime = new Date();
    console.log("widget-sourceStatusApp.init");
    photoOrg.sourceStatusApp.config = jQuery.extend({}, config);
    //appending appContainer to the configuration
    if(photoOrg.sourceStatusApp.config.appContainer && photoOrg.sourceStatusApp.config.appContainer.indexOf("#") == -1){
        photoOrg.sourceStatusApp.config.appContainer = "#"+photoOrg.sourceStatusApp.config.appContainer;
    }
    if(photoOrg.sourceStatusApp.isAppPageLoaded && photoOrg.sourceStatusApp.afterInit){
        //Here means all js/css files loaded
        photoOrg.sourceStatusApp.afterInit();
    }else if(!photoOrg.sourceStatusApp.isAppPageLoaded){

        photoOrg.sourceStatusApp.cssDefer = $.Deferred();
        photoOrg.sourceStatusApp.jsDefer = $.Deferred();
        if(config.oauthInfo){
            photoOrg.oauthInfo = config.oauthInfo;
            if(photoOrg.oauthInfo.accountId){
                photoOrg.config.account_id = photoOrg.oauthInfo.accountId;
            }
        }
        if(config.accountId){
            photoOrg.config.account_id = config.accountId
        }


        $.when(photoOrg.sourceStatusApp.cssDefer, photoOrg.sourceStatusApp.jsDefer)
        .then(function (config) {
            //log time metrics
            photoOrg.sourceStatusApp.dependenciesLoadedEndTime = new Date();
            
            

            photoOrg.sourceStatusApp.isAppPageLoaded = true;

                        
            photoOrg.sourceStatusApp.beforeInit();
            if(photoOrg.Util){
                
                //initiatorName is not avaiable then we are logging url
                var initiatorName = photoOrg.sourceStatusApp.config.initiatorName || window.location.href
                
                var clickTime = photoOrg.sourceStatusApp.config == undefined ? undefined : photoOrg.sourceStatusApp.config.clickTime
                
                var metricsMap = photoOrg.Util.addWidgetClientMetrics(photoOrg.sourceStatusApp.name, initiatorName, clickTime, photoOrg.sourceStatusApp.initBeginTime, photoOrg.sourceStatusApp.dependenciesLoadedEndTime)            
                
                photoOrg.Util.logClientMetrics([metricsMap])
            }

            //delayed css and js files
            for(var i=0; i < photoOrg.sourceStatusApp.postJSFiles.length ; i++){
                photoOrg.sourceStatusApp.loadJSFiles(photoOrg.sourceStatusApp.postJSFiles[i])
            }
            for(var i=0; i < photoOrg.sourceStatusApp.postCSSFiles.length ; i++){
                photoOrg.sourceStatusApp.loadCSSFiles(photoOrg.sourceStatusApp.postCSSFiles[i])
            }
            
        },function (data) {
            console.log("when failure:" + data);
            if(photoOrg.sourceStatusApp.config.failureCallback){
                photoOrg.sourceStatusApp.config.failureCallBack.call({'redirect':true})
            }
            
        })
        photoOrg.sourceStatusApp.successJSFiles=0;
        photoOrg.sourceStatusApp.loadedCount=0;
        console.log("the jsFile URL is:"+photoOrg.sourceStatusApp.preJSFiles[0]);
        if(photoOrg.sourceStatusApp.preCSSFiles.length > 0){
            for(var i=0; i < photoOrg.sourceStatusApp.preCSSFiles.length ; i++){
                photoOrg.sourceStatusApp.loadCSSFiles(photoOrg.sourceStatusApp.preCSSFiles[i], photoOrg.sourceStatusApp.onSuccessCSSloaded)
            }
        }else{
            photoOrg.sourceStatusApp.cssDefer.resolve();
        }
        if(photoOrg.sourceStatusApp.preJSFiles.length > 0){
            photoOrg.sourceStatusApp.loadJSFiles(photoOrg.sourceStatusApp.preJSFiles[0],photoOrg.sourceStatusApp.onSuccessJSloaded)
        }else{
            photoOrg.sourceStatusApp.jsDefer.resolve();
        }    
    }

}

photoOrg.sourceStatusApp.addReactLibrary();
photoOrg.sourceStatusApp.pushAllFiles();
photoOrg.sourceStatusApp.storeAllFiles();



photoOrg.sourceStatusApp.beforeInit = function(){
    photoOrg.sourceStatusAppIntervalId = setInterval(() => {
        if(photoOrg.sourceStatusManager){
            console.log("fnd sourceStatusManager");
            clearInterval(photoOrg.sourceStatusAppIntervalId);
            photoOrg.sourceStatusManager.initialize();
        }
    }, 500);
}
photoOrg.sourceStatusApp.afterInit = photoOrg.sourceStatusApp.beforeInit;
