Source: sina.js

/*
 * @file Simple info access (SINA) API: Factory
 * @namespace sap.bc.ina.api.sina
 * @requires jQuery
 * @copyright Copyright (c) 2013 SAP AG. All rights reserved.
 */

if (typeof window === 'undefined') {
    $.import("sinaxsjq.xsjslib");

    $.import("filter.xsjslib");
    $.import("impl/inav2/filter.xsjslib");

    $.import("sinabase.xsjslib");

    $.import("impl/inav2/jsontemplates.xsjslib");

    $.import("proxy.xsjslib");
    $.import("impl/inav2/proxy.xsjslib");

    $.import("system.xsjslib");
    $.import("impl/inav2/system.xsjslib");

    $.import("impl/inav2/sina_impl.xsjslib");
}

(function(global, isXS) {

    "use strict";

    var executeSina = function($) {
        if (!$)
        {
            $ = global.$;
        }

        if (!isXS) {
            global.sap.bc.ina.api.sina.expandPackage(global, 'sap.bc.ina.api.sina');
        }

        var module = global.sap.bc.ina.api.sina;
        module.properties = module.properties || {};
        var api = global.sap.bc.ina.api;
        // var inaV2Proxy = global.sap.bc.ina.api.sina.impl.inav2.proxy;
        // // var config = proxy.config;
        // var inaV2System = global.sap.bc.ina.api.sina.impl.inav2.system;
        var sinabase = global.sap.bc.ina.api.sina.sinabase;

        // =========================================================================
        // global fields
        // =========================================================================
        if(global.sap.bc.ina.api.sina.impl&&global.sap.bc.ina.api.sina.impl.inav2&&global.sap.bc.ina.api.sina.impl.inav2.sina_impl&&global.sap.bc.ina.api.sina.impl.inav2.sina_impl.IMPL_TYPE){
            /**
             * SAP HANA info access HTTP service implementation of SINA.
             * @memberOf sap.bc.ina.api
             * @constant
             */
            api.SINA_TYPE_INAV2 = global.sap.bc.ina.api.sina.impl.inav2.sina_impl.IMPL_TYPE;
        }

        /**
         * Factory method for the SINA API. Optionally, you can choose a service implementation to be used.
         * @memberOf sap.bc.ina.api.sina
         * @param {Object} [properties]
         * @param {String} [properties.impl_type=sap.bc.ina.api.sina.impl.inav2.sina_impl.IMPL_TYPE] Define the service type to be used by the SINA API.
         * @return {sap.bc.ina.api.sina.sinabase.Sina} The instance of SINA. If no properties object was provided, it will return an instance
         * that uses the info access HTTP service (V2) on an SAP HANA system.
         * @since SAP HANA SPS 06
         * @public
         */
        global.sap.bc.ina.api.sina.getSina = function(properties) {
            properties = properties || {};
            properties.impl_type = properties.impl_type || api.SINA_TYPE_INAV2;
            if(properties.impl_type === api.SINA_TYPE_INAV2){
                if (!properties.system) {
                    //create default proxy with settings from config.js
                    var sys;
                    // if (config) {
                    //     proxyProperties = {
                    //         httpMethod : config.httpMethod,
                    //         cachelifetime : config.cachelifetime,
                    //         demoMode : config.demoMode,
                    //         record : config.record
                    //     };
                    // }
                            var inaV2Proxy = global.sap.bc.ina.api.sina.impl.inav2.proxy;

        var inaV2System = global.sap.bc.ina.api.sina.impl.inav2.system;
                    var newProxy = new inaV2Proxy.Proxy(properties);
                    if (properties.systemType && properties.systemType.toUpperCase() === "ABAP") {
                        sys = new inaV2System.ABAPSystem({
                            'proxy': newProxy
                        });
                    } else {
                        sys = new inaV2System.HANASystem({
                            'proxy': newProxy
                        });
                    }
                    newProxy.setXSRFService(sys.infoUrl);
                    properties.system = sys;
                }
            }
            if(sinabase.provider[properties.impl_type]&&sinabase.provider[properties.impl_type].sina){
                var sina = new sinabase.provider[properties.impl_type].sina(properties);
                sina._provider = sinabase.provider[properties.impl_type];
                return sina;
            }
            return {};
        };

        if (!isXS) {
            module.properties.noDefaultSina = module.properties.noDefaultSina || false;
            if (module.properties.noDefaultSina !== undefined && !module.properties.noDefaultSina) {
                /**
                 * Default instantiation of SINA. After page load a SINA instance will be provided with default
                 * settings if there is not already a global SINA instance at sap.bc.ina.api.sina.
                 * If you need other settings, create your own SINA instance using the factory @link {sap.bc.ina.api.sina.getSina}
                 * You can turn off the default instatiation by setting a variable sap.bc.ina.api.properties.noDefaultSina to true
                 * BEFORE sina.js is loaded!
                 * @memberOf sap.bc.ina.api.sina
                 * @type {sap.bc.ina.api.sina.impl.inav2.Sina}
                 * @since SAP HANA SPS 06
                 */
                global.sap.bc.ina.api.sina = $.extend({}, module, module.getSina(module.properties)); // without extend the new global sina instance would overwrite everything after sap.bc.ina.sina !!!
                return global.sap.bc.ina.api.sina;
            }
            return {};
        } else {

            global.sap.bc.ina.api.sinaxs = global.sap.bc.ina.api.sinaxs || module.getSina(module.properties);
            return global.sap.bc.ina.api.sinaxs;
        }

    };

    if (isXS) {
        executeSina($.sap.bc.ina.api.sina.sinaxsjq.jq);
    }
    else if(global.sap && global.sap.ushell){
        executeSina();    // only concatenated sina is in ushell repo!
    }
    else if (typeof define === "function" && define.amd) { 
        define( ["jquery",
                 "require",
                 "./filter",
                 "./impl/inav2/sina_impl"],
            function($) {
                var sina = executeSina($);
                // sina.filter = global.sap.bc.ina.api.sina.impl.inav2.filter;
                // sina.systems = global.sap.bc.ina.api.sina.impl.inav2.system;
                return sina;
            });
    }
    else {
        executeSina();
    }

}(typeof window === 'undefined' ? $ : window, typeof window === 'undefined'));