//
// --- This is required for pages that load javascript on-demand
// ---
// --- Assumes a global function fc_page_setup() defined elsewhere.
//

if ( typeof(setup) == 'undefined' ) var setup = {};

// Keep track of loaded files (old school since we are loading the loader)
setup.loaded = [];


setup.addEventListener = function( element, event, handler ) {
    if ( element.addEventListener ) {
        element.addEventListener(event, handler, false);
    }
    else if ( element.attachEvent ) {
        element.attachEvent("on" + event, handler);
    }
};

setup.removeEventListener = function( element, event, handler ) {
    if ( element.removeEventListener ) {
        element.removeEventListener(event, handler, false);
    }
    else if ( element.detachEvent ) {
        element.detachEvent("on" + event, handler);
    }
};

/**
 * Prototype is loaded now load the remaing scripts that are required for onDemand loading to work
 */
setup.stage1Loaded = function() {
    setup.removeEventListener(document, 'dataavailable', setup.stage1Loaded);

    setup.stage2Scripts = [
//        { name: 'tricky', url: '/tr/icky.js' },
        { name: 'loader', url: '/resources/v2/common/scripts/loader.js' },
        { name: 'savemysearch', url: '/resources/v2/components/save-my-search/scripts/save-my-search-v9.js' }
    ];
    setup.addEventListener(document, 'dataavailable', setup.stage2LoadEvent);

    for ( var i=0; i < setup.stage2Scripts.length; ++i ) {
        setup._addScriptTag( setup.stage2Scripts[i].name, setup.stage2Scripts[i].url );
    }
};

setup._addScriptTag = function( id, src ) {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.id = 'scr_' + id;
    script.type = 'text/javascript';
    script.src = src;
    head.appendChild(script);

};

/**
 * Since we can't use the onDemand loader yet we have to make have to make sure that the correct number of scripts
 * have been loaded before we continue to the next step.
 * @param event
 */
setup.stage2LoadEvent = function( event ) {
    if ( setup.loaded === null ) return;
    if ( window.event ) event = window.event;

    if ( event.memo && event.memo.pkg ) {
        setup.loaded[setup.loaded.length] = event.memo.pkg;

	    if ( event.memo.pkg == 'tricky' && typeof yoTracky == 'function' ) {
			yoTracky();
	    }
	}

    if ( setup.loaded && setup.loaded.length == setup.stage2Scripts.length ) {
        setup.loaded = null;
        setup.stage2Loaded();
    }
};

/**
 * At this point we should have prototype and loader javascript available.
 */
setup.stage2Loaded = function() {
    var options = {
        urls : {
            fc_common : '/resources/v2/common/scripts/fc_common.js',
            dynamic   : '/resources/v2/components/dynamic/scripts/dynamic-v25.js'
        },
        callback : setup.stage3
    };

    new loader.JSPkgLoader(options);
};

/**
 * At this point we should have all of the javascript required to initialize the page.
 */
setup.stage3 = function() {
    if ( typeof fc_page_setup == 'function') {
        fc_page_setup();
    }
    else {
        var scripts = $(document).getElementsByTagName('script');
        for ( var i=0, size = scripts.length; i < size; ++i) {
            var item = scripts[i];
            if ( item.src.indexOf('setup.js') != -1 ) {
                var jsURI = null;
                if ( item.src.indexOf('jsURI') != -1 ) {
                    jsURI = item.src.gsub( /.*jsURI=/, '' );
                }
                else if ( item.getAttribute('jsURI') ) {
                    jsURI = item.getAttribute('jsURI');
                }
                if ( jsURI ) {
                    var jsOpts = {
                        urls : {
                            'farecompare.Page' : jsURI
                        },
                        callback : setup.createPage
                    };

                    new loader.JSPkgLoader( jsOpts );
                }
            }
        }
    }
};

setup.createPage = function() {
    if ( farecompare && typeof farecompare.Page == 'function' ) {
        new farecompare.Page();
    }
};

setup.initWebletController = function( weblet_placeholder, pageName, pageOptions) {
    if ( document.location.hash.indexOf( 'profile') != -1 ) {
        // Try to instrument our loadtime performance
        fc_instances.profiler.unHook();
        fc_instances.profiler.namespaces = ['weblet', 'weblets', 'ui', 'loader'];
        fc_instances.profiler.hook();
    }
    new weblets.WebletController(weblet_placeholder, pageName, pageOptions).load();
};

setup.loadCore = function() {
    setup.addEventListener(document, 'dataavailable', setup.stage1Loaded);

    setup._addScriptTag( 'prototype-1.6.1'   , '/resources/v2/common/3rdparty/scripts/prototype-1.6.1.js' );
};

setup.addEventListener(window,'load', setup.loadCore );
