Ok, here's the browser script from the Business Service. The purpose of the BS is to act as wrappers to the server side - allowing rich features on the browser side. I'll discuss in more detail in a future post - there are security concerns in particular here becuase of what we're exposing that are worth a mention.ExtendJsObjects();
top.oFramework = new Class_Main();
function BuildBsFramework()
{
    // empty method - real work done in declarations section
}
function Class_BusComp(theParent)
{
    /*------------------------------------------------------------------------------------------
    Created:        01/06/2010
    Description:    BusComp class 
                    Encapsulate functionality relating to Business Components
    -----------------------------------------------------------------------------------------*/
    
    var oBusComp = 
    {
        // member variables
        name: "Class_BusComp",
        parent: theParent,
        
        // member methods - simple wrappers
        methodWrapper: Method_Wrapper,
        addRecord: function () { return this.methodWrapper("BusComp.addRecord", arguments); },
        getRecord: function () { return this.methodWrapper("BusComp.getRecord", arguments); },
        getRecords: function () { return this.methodWrapper("BusComp.getRecords", arguments); },
        updateRecord: function () {    return this.methodWrapper("BusComp.updateRecord", arguments); },
        updateRecords: function () { return this.methodWrapper("BusComp.updateRecords", arguments); }    
    }
    
    return oBusComp;
}
function Class_IHelp(theParent)
{
    /*------------------------------------------------------------------------------------------
    Created:        01/06/2010
    Description:    IHelp class 
                    Encapsulate functionality relating to IHelp
    ------------------------------------------------------------------------------------------*/
    
    var oIHelp = 
    {
        // member variables
        name: "Class_IHelp",
        parent: theParent,
    
        // member methods
        setToPath: function (sHelpPathName)
        {
            // code removed for brevity - sets iHelp to a particular path
        },
            
        setToRoot: function ()
        {
            // code removed for brevity - returns iHelp to root menu
        },
    
        openPath: function (sHelpPathName)
        {
            // code removed for brevity - opens iHelp menu window + sets to a particular path
        }
    }
    
    return oIHelp;
}
function Class_Lov(theParent)
{
    /*------------------------------------------------------------------------------------------
    Created:        16/06/2010
    Description:    Lov class 
                    Encapsulate functionality relating to LOVs
    ------------------------------------------------------------------------------------------*/
    
    var oLov = 
    {
        // member variables
        name: "Class_Lov",
        parent: theParent,
        
        // member methods - simple wrappers
        methodWrapper: Method_Wrapper,
        get: function () { return this.methodWrapper("Lov.get", arguments); },
        getAzValue: function () { return this.methodWrapper("Lov.getAzValue", arguments); },
        getDescription: function () { return this.methodWrapper("Lov.getDescription", arguments); },
        getEuFlag: function () { return this.methodWrapper("Lov.getEuFlag", arguments); }
    }
    
    return oLov;
}
function Class_Main()
{
    /*------------------------------------------------------------------------------------------
    Created:        05/05/2010
    Description:    Class definition - can be accessed via top.oFramework
    ------------------------------------------------------------------------------------------*/
    
    var oMain = 
    {
        // members values 
        name: "Class_Main",
        createdTime: new Date(),
        UID: new Date().toTimeStamp(),
        aStack: [],
        
        // methods
        addToStack: function (sValue)
        {
            this.aStack.push("[" + new Date().toTimeStamp() + "] " + sValue);
            // limit the size of the stack to the last 50 entries
            if (this.aStack.length>50)
                this.aStack.shift();
        },
        
        clearStack: function ()
        {
            this.aStack = [];
        },
        
        getStack: function ()
        {
            return "[UID:" + this.UID + "]\n" + this.aStack.join("\n");
        },
        
        getCreatedTime: function ()
        {
            return this.createdTime;
        },
        
        resizeAppWindow: function ()
        {
            top.window.moveTo(0,0);
            top.window.resizeTo(1280,960);
        },
        
        toObject: function (source)
        {
            /*------------------------------------------------------------------------------------------
            Created:        12/05/2010
            Description:    Rebuild an object from its source representation.
                            The handling of the _length is to workaround the fact
                            that Siebel does not allow an object property called "length"
                            be enumerated using the "for in" construct.
                            
            ------------------------------------------------------------------------------------------*/
        
            var oT = eval('(' + source + ')');
        
            if (oT._length)
            {
                oT.length = oT._length;
            }
            return oT;
        },
        toSource: function (obj)
        {
            /*------------------------------------------------------------------------------------------
            Created:        11/05/2010
            Description:    Convert any Javascript object into its source (string) representation
                            This can be used to pass return objects from the server-side Framework
                            to the browser side, recursion is used to break down properties of objects
                            and elements of arrays.
                            
                            Quirk of Siebel: Arrays seem to have a typeof "function" rather than "object"
                            as expected. To distinguish between an Array and a real function, check does
                            it have a method called "shift" - an array will
                            
            ------------------------------------------------------------------------------------------*/
            var sReturn = ""; 
            if (typeof(obj)=="string") // strings - need to quote, also replace ' with \'
            {
                sReturn = "\"" + obj.replace(/\'/g,"\\\x27") + "\"";
            }
            else if (typeof(obj.shift)=="function") // arrays
            {
                sReturn += "[";
                for (var i=0; i<obj.length; i++)
                {
                    sReturn += this.toSource(obj[i]) + ", ";
                }
                sReturn = (sReturn.length==1) ? sReturn + ']' : sReturn.substr(0, sReturn.length-2) + ']';
            }
            else if (typeof(obj.getTime)=="function") // date
            {
                sReturn = "new Date(\"" + obj + "\")";
            }
            else if (typeof(obj)=="object") // objects - loop through properties
            {
                sReturn += "{";
                for (var x in obj)
                {
                    sReturn += (x.indexOf(" ")>-1) ? "\"" + x + "\":" : x + ":" ;
                    sReturn += this.toSource(obj[x]) + ", ";
                }
                sReturn = (sReturn.length==1) ? sReturn + '}' : sReturn.substr(0, sReturn.length-2) + '}';
            }
            else // number, boolen, function will be left
            {
                sReturn = "" + obj;
            }
            return sReturn;
        },
        
        callServerFramework: function ()
        {
        /*------------------------------------------------------------------------------------------
            Created:        17/05/2010
            Description:    This method uses a business service to expose server-side Framework methods
                            to browser script.
                            
            ------------------------------------------------------------------------------------------*/
        
            var oArguments = arguments[0]; //This will be an array of arguments
        
            //Objects required to call business service
            var oBusServ = null;
            var oInputs    = null;
            var oOutputs = null;
        
        
            try
            {
                //Set up objects
                oBusServ = theApplication().GetService("My Framework");
                oInputs    = theApplication().NewPropertySet();
                oOutputs = theApplication().NewPropertySet();
            
                //Place the first argument in the Method property
                oInputs.SetProperty("Method", oArguments.shift());
        
                //Convert the remaining arguments to a string and place in the Arguments property
                oInputs.SetProperty("Arguments", this.toSource(oArguments));
                
                //Call server-side Framework    
                oOutputs = oBusServ.InvokeMethod("RunFrameworkMethod", oInputs);
        
                //Rebuild complex objects and return
                if(oOutputs.GetProperty("Return Type") == "Object")
                {
                    return this.toObject(oOutputs.GetProperty("Return Value"));
                }
                //Return simple objects
                else
                {
                    return oOutputs.GetProperty("Return Value");
                }
        
            }
            catch(e)
            {
            }
            finally
            {
                //Clear down objects
                oArguments = null;
                oBusServ = null;            
                oInputs    = null;
                oOutputs = null;    
            }
        },
        variantToArray:    function(pV) 
        {
            return (typeof(pV)=="object" || typeof(pV)=="function" ? pV : [pV]); 
        }
    };
    
    oMain.BusComp = new Class_BusComp(oMain);
    oMain.iHelp = new Class_IHelp(oMain);
    oMain.Lov = new Class_Lov(oMain);
    oMain.Service = new Class_Service(oMain);
    oMain.Utility = new Class_Utility(oMain);
    
    return oMain;
}
function Class_Service(theParent)
{
    /*------------------------------------------------------------------------------------------
    Created:        16/06/2010
    Description:    Service class 
                    Encapsulate functionality relating to Services
    ------------------------------------------------------------------------------------------*/
    
    var oService = 
    {
        // member variables
        name: "Class_Service",
        parent: theParent,
        
        // member methods - simple wrappers
        methodWrapper: Method_Wrapper,
        run: function () { return this.methodWrapper("Service.run", arguments); },
        runAsynch: function () { return this.methodWrapper("Service.runAsynch", arguments); }
    }
    
    return oService;
}
function Class_Utility(theParent)
{
    /*------------------------------------------------------------------------------------------
    Created:        16/06/2010
    Description:    Service class 
                    Encapsulate functionality relating to Utility
    ------------------------------------------------------------------------------------------*/
    
    var oUtility = 
    {
        // member variables
        name: "Class_Utility",
        parent: theParent,
        
        // member methods - simple wrappers
        methodWrapper: Method_Wrapper,
        getSystemPreference: function () { return this.methodWrapper("Utility.getSystemPreference", arguments); },
        setSystemPreference: function () { return this.methodWrapper("Utility.setSystemPreference", arguments); },
        logMessage: function () { return this.methodWrapper("Utility.logMessage", arguments); }
    }
    
    return oUtility;
}
function ExtendJsObjects()
{
    // String methods    
    String.prototype.spaceToUnderscore = function() {
        return this.replace(/\s/g,"_");
    }
    String.prototype.hasSpace = function() {
        return this.match(/\s/);
    }
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g,"");
    }
    String.prototype.trimLeft = function() {
              return this.replace(/^\s+/g,"");
    }
    String.prototype.trimRight = function() {
        return this.replace(/\s+$/g,"");
    }
    String.prototype.inList = function(vA) {
        for (var i=0; i<vA.length; i++)
            if (vA[i]==this.valueOf())
                return true;
        
        return false;
    }
    // Date methods
    Date.prototype.compare = function() {
        var op = (arguments.length == 2 ? arguments[0] : "==" );
        var pV = (arguments.length == 2 ? arguments[1] : arguments[0] );
        var bReturn = false;
        var d = new Date();
        d.setFromString(pV);
    
        if (op=="!=")
            bReturn = this.toString()!=d.toString();
        else
        {
            if (op.indexOf("=")>-1)
                bReturn = (this.toString() == d.toString());
            
            if (op.indexOf("<")>-1)
                bReturn = bReturn || (this < d);
            
            if (op.indexOf(">")>-1)
                bReturn = bReturn || (this > d);
        }
        return bReturn;
    }
    Date.prototype.toIso=function() {
        // return date in the format YYYYMMDD
        var YYYY, MM, DD, M, D; // variables to hold parts of date
        
        YYYY=this.getFullYear()+""; // convert to string
        MM = (M=this.getMonth()+1)<10?('0'+M):M; // add 0 if 1-9 to make MM format
        DD = (D=this.getDate())<10?('0'+D):D; // add 0 if 1-9 to make DD format
        
        return YYYY+MM+DD;
    }
    Date.prototype.toDb=function() {
        // return date in the format DD/MM/YYYY
        var YYYY, MM, DD, M, D; // variables to hold parts of date
        
        YYYY=this.getFullYear()+""; // convert to string
        MM = (M=this.getMonth()+1)<10?('0'+M):M; // add 0 if 1-9 to make MM format
        DD = (D=this.getDate())<10?('0'+D):D; // add 0 if 1-9 to make DD format
        
        return DD+"/"+MM+"/"+YYYY;
    }
    Date.prototype.toUs=function() {
        // return date in the format MM/DD/YYYY
        var YYYY, MM, DD, M, D; // variables to hold parts of date
        
        YYYY=this.getFullYear()+""; // convert to string
        MM = (M=this.getMonth()+1)<10?('0'+M):M; // add 0 if 1-9 to make MM format
        DD = (D=this.getDate())<10?('0'+D):D; // add 0 if 1-9 to make DD format
        
        return MM+"/"+DD+"/"+YYYY;
    }
    Date.prototype.toTimeStamp=function() {
        var hh,mm,ss,mmm,h,m,s,ms;
        
        var ms = this.getMilliseconds();
        var s = this.getSeconds();
        var m = this.getMinutes();
        var h = this.getHours();
        
        var mmm = (ms<10?('00'+ms):ms<100?('0'+ms):ms);
        
        hh = h<10?('0'+h):h==24?'00':h;
        mm=m<10?('0'+m):m;
        ss=s<10?('0'+s):s;    
        
        return this.toIso() + hh+mm+ss+mmm;
    }
    Date.prototype.setFromString = function(pV) {
        var aTs = pV.split(" ");
        var aD = aTs[0].split("/");
        var aT = (aTs.length > 1) ? aTs[1].split(":") : [0,0,0];
    
        this.setFullYear(aD[2], aD[1]-1, aD[0]);
        this.setHours(aT[0], aT[1], aT[2]);
    }
}
function Method_Wrapper(sName, vArguments)
{
    /*------------------------------------------------------------------------------------------
    Created:        01/06/2010
    Description:    passes arguments + object.method name to server side
    ------------------------------------------------------------------------------------------*/
    var oArguments =[];
            
    oArguments[0] = sName;
        
    for(var x=0;x<vArguments.length;x++)
    {
        oArguments[x+1] = vArguments[x];
    }
            
    return top.oFramework.callServerFramework(oArguments);
}
function Service_PreInvokeMethod (methodName, inputPropSet, outputPropSet)
{
    sReturn = "ContinueOperation";
    
    try
    {
        switch ( methodName )
        {
            case "BuildBsFramework":
                
                BuildBsFramework();
                
                sReturn = "CancelOperation";
                break;
                
            default:
                break;
        }
    }
    catch(e)
    {
    }
    finally
    {
    }
    
    return (sReturn);
}