   
  function upperLastName(argObj) {
     return argObj.lastName.toUpperCase() + ', ';
  }
  function upperLName(argObj) {
     return argObj.lName.toUpperCase() + ', ';
  }
  function showAmount(i) {
    alert('Accesing the amount property using the array index [' + i +']\n\nAmount=' + Jam('numbering').getItem(i).amount);
  }
  function firstLetter(argObj) {
     return argObj.lastName.substring(0,1).toUpperCase();
  }

  function sum(argObj,i) {
     return argObj.lastName.substring(0,1).toUpperCase();
  }

  function count(argObj,i) {
     var cnt = 0;     
     while (myData[i].lastName.substring(0,1).toUpperCase() === argObj.lastName.substring(0,1).toUpperCase()) { 
        cnt++;
        i++;
        if (!myData[i]) break;
     }
     return cnt;
  }

  function sum(argObj,i) {
     var tot = 0;     
     while (myData[i].lastName.substring(0,1).toUpperCase() === argObj.lastName.substring(0,1).toUpperCase()) {
        tot = tot + myData[i].amount;
        i++;
        if (!myData[i]) break;
     }
     return tot;
  }


    
    
var Menu = {
    currentId:'intro',
    data:  [
//	            {type:0,id:'intro',text:'Introduction',cb:'Menu.show'},
	            {type:0,id:'basics',text:'Basics',cb:'Menu.basics'},
	            {type:0,id:'orderby',text:'Order By',cb:'Menu.orderBy'},
	            {type:0,id:'alternation',text:'Alternation',cb:'Menu.show'},
	            {type:0,id:'numbering',text:'Numbering',cb:'Menu.show'},
	            {type:0,id:'formatting',text:'Formatting',cb:'Menu.format'},
//	            {type:0,id:'orderbytoggle',text:'Order By Toggle',cb:'Menu.orderByToggle'},
	            {type:0,id:'groupby',text:'Group By Property',cb:'Menu.show'},
	            {type:0,id:'groupbyfunction',text:'Group By Function',cb:'Menu.show'},
	            {type:0,id:'groupendsimple',text:'Group End',cb:'Menu.groupendsimple'},
/*
	            {type:1,id:'select',text:'Single Select',cb:'Menu.select'},
	            {type:1,id:'multiselect',text:'Multi Select',cb:'Menu.multiselect'},
	            {type:2,id:'autocomplete',text:'Autocomplete',cb:'Menu.autocomplete'},
*/
	            {type:2,id:'filter',text:'Filters',cb:'Menu.filter'},
	            {type:2,id:'nonefound',text:'None Found',cb:'Menu.nonefound'},
	            {type:3,id:'ajax',text:'Ajax',cb:'Menu.ajax'},
	            {type:4,id:'api',text:'API',cb:'API.show'},
	            {type:4,id:'css',text:'CSS Notation',cb:'API.css'},
	            {type:5,id:'performance',text:'Stats',cb:'Menu.performance'},
	            {type:6,id:'groupendadvanced',text:'Advanced Grouping',cb:'Menu.groupendadvanced'},
//	            {type:6,id:'grid',text:'Sortable Grid',cb:'Menu.grid'}, 
	            {type:6,id:'selectbox',text:'Select Box',cb:'Menu.show'},
	            {type:6,id:'data',text:'Sample Data',cb:'Menu.show'},
	            {type:7,id:'download',text:'<a target="_blank" href="http://jamjax.com/js/jamjax.2.0.2.js">Download Jamjax</a>',cb:'Menu.download'},

           ],

    titleData: [
        'Using the Jam Render method',
        'Enable Selection',
        'Data',
        'Ajax',
        'Jam API',
        'Performance',
        'Examples',
        'Download'

    ],

    download:
    function() {
	// do nothing
    },			

    title:
    function(argObj) {
        return Menu.titleData[argObj.type];
    },

    basics:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
            Jam('basics').render(myObj);
            Jam('basics2').render(myObjects);
    },


    show:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData,['lastName', Jam.ASC,'firstName', Jam.ASC]);
            }
    },

    grid:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData,['lastName', Jam.TOGGLE]);
            }
    },


    groupendsimple:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData, [ 'lastName', Jam.ASC,'firstName', Jam.ASC]);
            }
    },

    groupendadvanced:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData, [ 'fn:firstLetter', Jam.ASC,'amount', Jam.DESC]);
            }
    },

    ajax:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
    },

    format:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData);
            }
    },

    orderBy:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData, ['lastName',Jam.ASC,'firstName',Jam.ASC]);
            }
    },

    orderByToggle:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
		    if ($id(Menu.currentId)) {
		        Jam(Menu.currentId).render(myData, ['lastName',Jam.TOGGLE]);
            }
    },

    performance_callBack:
    function(argData) {
		    if ($id(Menu.currentId)) {
		        Timer.start('render');
		        Jam(Menu.currentId).render(argData);
		        Timer.stop('render');
		        Timer.start('render_fn');
		        Jam('performance2').render(argData);
		        Timer.stop('render_fn');
/*
		        Timer.start('render_table');
		        Jam('performance3').render(argData);
		        Timer.stop('render_table');
*/
            }
            document.getElementById("jq").src= "content/jsrepeat.htm";
    },    


    performance:
    function(argHTML) {
            $id('content').innerHTML = argHTML;
            Jam.ajaxNoCache('content/names.js', Menu.performance_callBack);
    },    
    

    filter:
    function(argHTML) {
        $id('content').innerHTML = argHTML;

        var myFilter = myData.filterStartsWith('firstName', 'B', 'red')
        Jam(Menu.currentId).render(myFilter  , ['lastName', Jam.ASC,'firstName', Jam.ASC]);

    },

    nonefound:
    function(argHTML) {
        $id('content').innerHTML = argHTML;

        var myFilter = myData.filterStartsWith('firstName', 'X', 'red')
        Jam(Menu.currentId).render(myFilter  , ['lastName', Jam.ASC,'firstName', Jam.ASC]);

    },

    select:
    function(argHTML) {
       $id('content').innerHTML = argHTML;
       Jam(Menu.currentId).render(myData  , ['lastName', Jam.ASC,'firstName', Jam.ASC]);
       Jam(Menu.currentId).enableSelection('select',false);
    },

    autocomplete:
    function(argHTML) {
        $id('content').innerHTML = argHTML;
        Jam(Menu.currentId).setSortOrder(['lastName',Jam.ASC, 'firstName', Jam.ASC]);
        var ac = Jam(Menu.currentId).autocomplete( 'ac1', myData, ['lastName','firstName'], 'select','red',10);
    },
    
    multiselect:
    function(argHTML) {
        $id('content').innerHTML = argHTML;
        Jam(Menu.currentId).render(myData  , ['lastName', Jam.ASC,'firstName', Jam.ASC]);


       Jam(Menu.currentId).enableSelection('select',true);
    },
    

	opt:
    function(argId, argCb) {
        Menu.currentId = argId;
 //           Jam.ajaxNoCache('content/'+ argId + '.htm', argCb);
            Jam.ajax('content/'+ argId + '.htm'.addVersion(), argCb);
    },

    init:
    function() {
            $id('logo').src = 'images/logo.jpg';
            $id('logo').width=65;
            $id('logo').heigth=65;
            
        Jam('menu').render(Menu.data);
        this.opt('intro',Menu.show);
    }
}


var API = {
    css:
    function(argHTML) { 
        $id('content').innerHTML = argHTML;  		    
    },
    
    show:
    function(argHTML) { 
        $id('content').innerHTML = argHTML;  		    

        $id('apiStatic.summary').innerHTML = 'JAM Static Methods';
        var stat = [
                {type:'function',name:'ready',args:'(argCallBack,<i>argDocument</i>)'},
                {type:'function',name:'ajax',args:'(argUrl,argCallBack,<i>argJsonObjectToPost, argErrorCallBack</i>)'},
                {type:'function',name:'ajaxNoCache',args:'(argUrl,argCallBack,<i>argJsonObjectToPost, argErrorCallBack</i>)'},
                {type:'function',name:'getScript',args:'(argUrl,<i>argCharset</i>)'}
        ];    

        Jam('apiStatic').render(stat ,  ['type', Jam.ASC]);

        $id('api0.summary').innerHTML = 'JAM Instance Methods';
        var core = [
                {type:'function',name:'render',args:'(argJsonArray,<i>[argProperty1,direction, argProperty2, direction, ...]</i>)'}
/*
                {type:'function',name:'setSortOrder',args:'([argProperty1,direction, argProperty2, direction, ...])'},
                {type:'function',name:'enableSelection',args:'(argClassName,<i>argMultiSelect,argCallBack</i>)'},
                {type:'function',name:'autocomplete',args:'(argInputId, argData, argProperty, argSelectorClass, <i>argBoldClass, argMaxSize</i>)'}
*/
        ];    

        Jam('api0').render(core ,  ['type', Jam.ASC]);
        
        
        //$id('api1.summary').innerHTML = 'Methods available when enableSelection is invoked';
        //Jam('api1').render(API.getMembers(Jam.Control.prototype),['type', Jam.ASC,'name', Jam.ASC]);
        $id('api1.summary').innerHTML = 'Utilities';
        Jam('api1').render(API.getMembers(Util),['type', Jam.ASC,'name', Jam.ASC]);
        $id('api3.summary').innerHTML = 'Array Prototypes';
        Jam('api3').render(API.getMembers(Array.prototype),['type', Jam.ASC,'name', Jam.ASC]);
        $id('api4.summary').innerHTML = 'String Prototypes';
        Jam('api4').render(API.getMembers(String.prototype),['type', Jam.ASC,'name', Jam.ASC]);
    },
    
    getMembers:
    function(obj) {
        var members = [];
        for (var i in obj) {
            members.push({name:i, type:typeof(obj[i]),args:''});
            if (members[members.length-1].type === "function") {
                members[members.length-1].args = Util.getArguments(obj[i]);
            }
        }
        return members;
    
    }
};

var myData =  [
                 {id:'4444', firstName:'Zoe', lastName:'Wilson', date:'1/11/08', amount:10.00},
                 {id:'3333', firstName:'Bill', lastName:'Johnson', date:'12/13/08', amount:2.50}, 
                 {id:'1111', firstName:'Robert', lastName:'Smith', date:'12/13/08', amount:3.25},
                 {id:'2222', firstName:'Allan', lastName:'Smith', date:'12/01/07', amount:1.25},
                 {id:'5555', firstName:'Ben', lastName:'Simpson', date:'12/02/07', amount:1.75},
                 {id:'4444', firstName:'Bob', lastName:'Wilson', date:'11/11/08', amount:5.00}
              ];

var myObjects =  [
                 {id:'1', firstName:'Bill', lastName:'Johnson',  amount:{usd:'20.00',euro:'15.00'}}, 
                 {id:'2', firstName:'Allan', lastName:'Smith', amount:{usd:'40.00',euro:'30.00'}},
                 {id:'3', firstName:'Robert', lastName:'Smith',amount:{usd:'30.00',euro:'22.50'}},
                 {id:'4', firstName:'Zoe', lastName:'Wilson',  amount:{usd:'10.00',euro:'7.50'}}
              ];

var myObj =  {id:'1', firstName:'Bill', lastName:'Johnson'};

              
              


