dojo.require('dojo.date');
dojo.require('introplay.dom');
dojo.require('introplay.rank');


/*extern document */
var ajaxError = new Error("Trouble communicating with the server, please try again later.");

dojo.require("dijit.dijit");
dojo.require("dojo.fx");
dojo.require("dojox.fx");
dojo.require("dojox.data.dom");

/* global colors */
var blueH = "#0067A6";
var lBlueH = "#0981FF";
var redH = "#BE0514";



function topNavDropDown(picked) {
  dojo.fx.wipeIn({node: picked, duration: 250}).play();
}

function hideTopNavMenu() {
    var popup1 = document.getElementById('topPopupDiv1');
    var popup2 = document.getElementById('topPopupDiv2');
    var bodyDiv = document.getElementById('main');

    bodyDiv.onclick = function () {
      if(popup1.style.display != "none") { dojo.fx.wipeOut({node: popup1, duation: 250}).play(); }
      if(popup2.style.display != "none") { dojo.fx.wipeOut({node: popup2, duration: 250}).play(); }
    };
}

function dateFormatted(){
    var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
    var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
    var today = new Date();
    var formatted = days[today.getDay()]+', '+ months[today.getMonth()] +' '+today.getDate().toString()+', '+today.getFullYear().toString();

    return formatted;
}

function changeMonthAjax(year, month)
{
    dojo.xhrPost(
    {
        url: "/workouts/JSON/Ws_by_month/"+year+"/"+month+"/",
        handleAs: "json",
        load: function(response, ioArgs)
        {
            changeMonth(year, month, response);
        },
        error: function(response, ioArgs) { alert(ajaxError); }
    });
}

function timedelta(month, delta)
{
    month += delta;

    if(month == -1) { month = 11; }
    if(month == 12) { month =  0; }

    return month;
}

function returnMonth(year, month)   // month *must* be zero-based (Jan = 0, Feb = 1 ... Nov = 10, Dec = 11)
{
    var firstDayOfMonth = new Date(Date.UTC(year, month, 1)); // Date object
    var firstDayOfCalendar = new Date(firstDayOfMonth.valueOf() - firstDayOfMonth.getUTCDay()*86400000); // Date object
    var calendar = new Array(6);
    var day = firstDayOfCalendar;  // to simplify typing

    for(var i = 0; i < 6; i++)    // # of rows (weeks)
    {
        calendar[i] = new Array(7);
        for(var j = 0; j < 7; j++)    // # of columns (days)
        {
            calendar[i][j] =
            {
                "year": day.getUTCFullYear(),
                "month": day.getUTCMonth(),
                "day": day.getUTCDate(),
                "epoch": day.valueOf()
            };
            day = new Date(day.valueOf() + 86400000);  // increment day by 1
        }
    }
    return calendar;
}

function changeMonth(year, month, epoch_array)   // again, month *must* be zero-based
{
    var now = new Date();
    var newCal = returnMonth(year, month);  // array holding our newly created calendar
    var calId = document.getElementById('new_calendar');
    var monthArray = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    var dayId, pYear, nYear;
    var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));

    if(month ==  0) { pYear = year - 1; } else { pYear = year; }
    if(month == 11) { nYear = year + 1; } else { nYear = year; }

    calId.rows[0].cells[0].childNodes[0].href = 'javascript:changeMonthAjax('+pYear+','+timedelta(month, -1)+')';
    calId.rows[0].cells[1].innerHTML = monthArray[month] + ' ' + year;
    calId.rows[0].cells[2].childNodes[0].href = 'javascript:changeMonthAjax('+nYear+','+timedelta(month, 1)+')';

    var lwMonth, lwDay;

    for(var i = 0; i < 6; i++) // rows
    {
        for(var j = 0; j < 7; j++)  // cells
        {
            calId.rows[i+2].cells[j].innerHTML = newCal[i][j].day; // setting date

            (newCal[i][j].month+1) < 10 ? lwMonth = '0' + (newCal[i][j].month + 1).toString(): lwMonth = (newCal[i][j].month+1).toString();
            newCal[i][j].day < 10 ? lwDay = '0' + newCal[i][j].day.toString() : lwDay = newCal[i][j].day.toString();

            calId.rows[i+2].cells[j].id = newCal[i][j].year+lwMonth+lwDay;   // setting unique id

            if(newCal[i][j].epoch <= now.valueOf())
            {   // every date before the current date becomes a link to load the workout journal
                calId.rows[i+2].cells[j].innerHTML = "<a href='javascript:loadWorkout("+newCal[i][j].year+lwMonth+lwDay+")'>"+newCal[i][j].day+"</a>";
            }

            if(newCal[i][j].month == month) { calId.rows[i+2].cells[j].className = 'cal_in_month not_a_workout'; } // assume in month and no workout
            else { calId.rows[i+2].cells[j].className = 'cal_not_in_month not_a_workout'; } // assume out of month and no workout
	    if(todayUTC.getUTCFullYear() == newCal[i][j].year && todayUTC.getUTCMonth() == newCal[i][j].month && todayUTC.getUTCDate() == newCal[i][j].day){
		var todayCell = calId.rows[i+2].cells[j];
		//make sure this actually gets what we think it should !!
		if(todayCell){
		  todayCell.className = 'right_now';
		  todayCell.innerHTML = '<a href="javascript:loadWorkout('+sFullDate+')">'+cDay.toString()+'</a>';
		}
	    }
        }
    }

    var w_day;
    
    for(var i in epoch_array)
    {
        w_day = document.getElementById(epoch_array[i]);
	if(w_day){
	    w_day.className = w_day.className.split(' ')[0] + ' a_workout';
	}
    }
}

function leagueBarHeight()
{
    if(navigator.appVersion.indexOf('MSIE') != -1)
    {
        var IEVersion = parseFloat(navigator.appVersion.split('MSIE')[1]);

        if(document.getElementById('container') && IEVersion < 7)
        {
            var container = document.getElementById('container');
            var leagueBase = document.getElementById('leagueBase');
            var leagueMenu = document.getElementById('leagueMenu');

            if(leagueBase.clientHeight < container.clientHeight) { leagueBase.style.height = container.clientHeight; }
            if(leagueMenu.clientHeight < container.clientHeight) { leagueMenu.style.height = container.clientHeight; }

            if(container.clientHeight < 800)
            {
                leagueBase.style.height = '800px';
                leagueMenu.style.height = '800px';
            }
        }
    }
}

function leagueSelect(nav)
{
    var league = nav.options[nav.selectedIndex].value;
    if(league){location.href = '/leagues/'+league+'/';}
}

function LoadContactUs()
{
    var wBG = dojo.byId('workoutBG');
    var width = 335;
    var height = 445;
    var viewWidth =  dijit.getViewport().w;
    var viewHeight = dojo.coords(dojo.byId('topbar')).h + dojo.coords(dojo.byId('maincontent')).h;
    var leftCenter = ((viewWidth - width) / 2).toString() + 'px';
    var topCenter = (dojo.body().scrollTop + 50) + 'px';

    if (viewHeight < 800){wBG.style.height = '800px';}
    else{wBG.style.height = viewHeight.toString() + 'px';}

    toggleBleeders("hidden");

    wBG.style.zIndex = '0';
    wBG.style.display = 'inline';

    if(dojo.byId('id_hours_of_sleep') && dojo.byId('id_hours_of_work'))
    {
        hide('id_hours_of_sleep');
        hide('id_hours_of_work');
    }

    if (((viewWidth - width) / 2) < 50) leftCenter = '50px';

    dojo.xhrGet(
    {
        url: "/about/contact.html",
        handleAs: "text",

        load: function(response, ioArgs)
        {
            var cBase = dojo.byId('contactBase');
            cBase.innerHTML = response;
            cBase.style.display = 'inline';
            cBase.style.zIndex = '1';
            cBase.style.left = leftCenter;
            cBase.style.top = topCenter;
            var fbobj = document.getElementById('id_feedback');
            fbobj.onfocus = function clearDefaultText()
            {
                if (fbobj.value == '[Enter Your Message Here]') fbobj.value = '';
            }
        },

      error: function(response, ioArgs)
        {
            alert(ajaxError);hideWorkout();loadingNode.style.visibility='hidden';
        }
    });
}

function hideContactUsForm()
{
    var wBG = dojo.byId('workoutBG');
    var contact = dojo.byId('contactBase');

    hide('nav_thanks');
    hide('contactBase');
    contact.display = '';
    wBG.style.display = '';

    toggleBleeders("visible");

    if(dojo.byId('id_hours_of_sleep') && dojo.byId('id_hours_of_work'))
    {
        show('id_hours_of_sleep');
        show('id_hours_of_work');
    }
}

function contactUs()
{
    var url = '/about/contact.html';
    var nav_thanks = document.getElementById('nav_thanks');
    dojo.xhrPost({
        url: url,
        load: function(response,ioArgs){
            if(data == 'true')
            {
                hide('contact');
                nav_thanks.style.display = 'block';
                setTimeout('hideContactUsForm()',2000);
            }
            else
            {
                var cBase = dojo.byId('contactBase');
                cBase.innerHTML = response;
            }
        },
        error: function(type,data){alert(ajaxError);},
        formNode: dojo.byId('contact_form')
    });
}

function ShowSaveWorkoutForm(evt){
    var SWF = document.getElementById("SaveWorkoutForm");
    var SW = document.getElementById("SaveWorkout");
    SW.style.visibility = 'hidden';
    SWF.style.visibility = 'visible';
}
function ShowSaveWorkout(){
    var SWF = document.getElementById("SaveWorkoutForm");
    var SW = document.getElementById("SaveWorkout");
    SW.style.visibility = 'visible';
    SWF.style.visibility = 'hidden';
}
function activateRow(rowNode){
    rowNode.style.color = "#FFFFFF";
    rowNode.style.background = blueH;
    rowNode.style.cursor = 'pointer';
}
function deactivateRow(rowNode){
    rowNode.style.color = "#000000";
    rowNode.style.background = lBlueH;
    rowNode.style.cursor = 'auto';
}
function hide(node){
    var mydiv = document.getElementById(node);
    mydiv.style.display = 'none';
}
function show(node){
    var mydiv = document.getElementById(node);
    mydiv.style.display = 'inline';
}
function toggle(node){
    var mydiv = document.getElementById(node);
    if(mydiv.style.display == 'none'){
    mydiv.style.display = 'inline';
    }
    else{
    mydiv.style.display = 'none';
    }
}
function checkInjuryReport(){
    var myradio = document.getElementById("injuryI");
    myradio.checked = true;
}
function checkNotes(){
    var myradio = document.getElementById("noteN");
    myradio.checked = true;
}

function toggleBleeders(visibility){
  //toggle all elements with the "bleed" class
  var bleeders = dojo.query(".bleed");
  for(i=0;i<bleeders.length;i++){
    bleeders[i].style.visibility = visibility;
  }
}

/* Removes the forward-navigation link from the workout pane if it
refers to tomorrow.  The date that the workout pane is currently
targeting is passed as ''date'', to be formatted as "yyyy/mm/dd". */
function removeLinkToTomorrow(date) {
    // ''today'' is set by a script embedded in the template.  Oh! the
    // coupling!
    var parts = date.match('(\\d{4})/(\\d{2})/(\\d{2})');
    // Whose bright idea was it to make JS months zero-based!?
    var date2 = new Date(parts[1], parts[2] - 1, parts[3]);
    if(dojo.date.compare(date2, today, 'date') < 0) return;
    var link = dojo.byId('workout-next-day');
    link.parentNode.removeChild(link);
}

function changeToWorkout(date) {
    var wbWidget = dojo.byId('workoutBase');
    var dict = {};
    var save = function(id) {
        var element = dojo.query('#' + id, wbWidget)[0];
        dict[id] = [element, element.innerHTML];
        introplay.dom.showLoadingNotification(element);
    };
    var restore = function(id) {
        var pair = dict[id];
        pair[0].innerHTML = pair[1];
    };

    save('workoutWrap');

    var rand = Math.floor(Math.random() * 1000);
    dojo.xhrGet({
        url: '/workouts/' + date + '/' + rand.toString() + '/',
        load: function(response, args) {
            wbWidget.innerHTML = response;
            removeLinkToTomorrow(date);
        },
        error: function(args, response) {
            restore('workoutWrap');
        }});
}

function loadWorkout(picked){
    var wBG = dojo.byId("workoutBG");
    var width = 925;
    var height = 605;
    var viewWidth =  dijit.getViewport().w;
    var viewHeight = dojo.coords(dojo.byId('topbar')).h + dojo.coords(dojo.byId('maincontent')).h;
    var leftCenter = ((viewWidth - width) / 2).toString() + 'px';
    var topCenter = (dojo.body().scrollTop + 50) + 'px';

    if(viewHeight < 800){
	wBG.style.height = '800px';
    }
    else{
	    wBG.style.height = viewHeight.toString() + 'px';
	}

    toggleBleeders("hidden");

    wBG.style.zIndex = '50';
    wBG.style.display = 'inline';

    if(dojo.byId('id_hours_of_sleep') && dojo.byId('id_hours_of_work'))
    {
        hide('id_hours_of_sleep');
        hide('id_hours_of_work');
    }

    if (((viewWidth - width) / 2) < 50) leftCenter = '50px';

    var sPicked = picked.toString();

    var year = sPicked.slice(0,4), month = sPicked.slice(4,6), day = sPicked.slice(6,8);
    var workoutDate = year+'/'+month+'/'+day;
    show('ieframe');
    wBG.style.width = document.body.clientWidth.toString() + 'px';
    loadingNode = dojo.byId("loadingBase");
    loadingNode.style.visibility = 'visible';

    var wWidth = dijit.getViewport().w;
    var newLeft = (wWidth - 925) / 2;
    var wbWidget = dijit.byId('workoutBase');
    var wB = dojo.byId("workoutBase");
    wB.style.display = 'inline';
    wB.style.zIndex = '110';
    wB.style.left = leftCenter;
    wB.style.top = topCenter;
    var rand = Math.floor(Math.random()*1000);
    wbWidget.setHref("/workouts/"+workoutDate+ '/' + rand.toString()+'/');
    wbWidget.onDownloadError = function(e)
    {
        alert(ajaxError);
        hideWorkout();
        loadingNode.style.visibility='hidden';
    };
    wbWidget.onLoad = function()
    {
        removeLinkToTomorrow(workoutDate);
        loadingNode.style.visibility = 'hidden';
        wB.style.display = 'inline';
        //pngfix for IE, correctPNG will be undefined unless the browser is IE
        wB.style.visibility = 'hidden';
        wB.style.visibility = 'visible';
        if (dojo.isIE == 6){
            correctPNG();
	    // this doesn't seem to be working right for the moment so i'm just going to hide the glow in IE
	    dojo.byId('glow-top').style.visibility = 'hidden';
	    dojo.byId('glow-btm').style.visibility = 'hidden';
	    dojo.byId('workoutGlow').style.background = "";
        }
    };
    wbWidget.onDownloadEnd = function(){
    };
}

function hideWorkout(){
    //because IE is retarded
    hide('ieframe');

    hide('workoutBase');
    hide('workoutBG');

    //showing the bleeders again
    toggleBleeders("visible");
    //refreshing after close for now, each page will need it's own routine for this eventually

    /* Temp code preparing for each page routine ajax-y foo
    
    switch(location.pathname)
    {
        case '/locker/': break;
        case '/workouts/': break;
        case '/ticker/': break;
        case '/profile/': break;
        case '/leagues/': break;    // this should be able to take what leagues they are in as well (/leagues/77/)
    }

    */
    //location.href = location.href;
}

function nextWorkout(){
  var journalId = dojo.byId('journalId').value;
  updateJournal(false);
  var url = "/workouts/list/"+journalId+'/';
  ajaxViewURL("workoutActivity",
	      url,
	      function(){
		hide('nextButton');
		show('finishedButton');
	      });
}

function nextButton(){
    dojo.byId('id_notes').focus();

    if (dojo.byId('RunningForm') && (!dojo.byId('tableLegs'))){
	//this function includes nextWorkout() in the appropriate place
	updateLeg2(dojo.byId('RunningForm'),null,true);
    }
    else{
	nextWorkout();
    }
}

/* function to create a new workout to be used by a workout detail */
function createNewWorkout(){
    dojo.xhr({
    url: "workout_form.html",
    load: function(response, ioArgs){
        dojo.byId("newWorkout").innerHTML = response;
        dojo.byId("id_workout").value = dojo.byId("id_current_workout").value;
    },
    form: dojo.byId("workoutHiddenForm")
    });
}

/* function to update the notes and injury report along with the private status */
function updateJournal(bHide){
    dojo.xhrPost({
      url: "/workouts/journal_update.html",
      handleAs: "json",
      load: function(response, ioArgs){
	if(response == true){
	  if(bHide === true){
            hideWorkout();
	  }
        }
        else{
	  alert('Journal update failed.');
        }
	return response;
    },
    error: function(type,data){alert(ajaxError);},
    form: dojo.byId("journalForm"),
    content: {'journal_id':dojo.byId("journalId").value,'calc':bHide}
    });
}

/* not sure this is necessary any more

function updateRunningPerformance(running_id){
    var rpdiv = dojo.byId("RunningP");
    var plusImage = dojo.byId("plusImage");
    rpdiv.style.cursor = 'wait';
    plusImage.style.cursor = 'wait';
    dojo.xhr({
      url: "/workouts/running_create.html",
      load: function(type, data){
        // if the string "data" has the red_error image tag in it, just update the running_new div otherwise update the runningPerformance div 
        if (dojo.string.has(data,"red_error.jpg")){
        dojo.byId("running_new").innerHTML = data;
        rpdiv.style.cursor = 'auto';
        plusImage.style.cursor = 'auto';
        }
        else {
        dojo.byId("RunningP").innerHTML = data;
        rpdiv.style.cursor = 'auto';
        plusImage.style.cursor = 'auto';
        //reloadWorkout(); //update the workout div
        }
    },
    error: function(type,error){alert(error);},
    formNode: dojo.byId("runningDetailForm")
    });
}
*/

function toggleRaceInfo(){
    var myselect = dojo.byId("id_running_type");
    if(myselect[myselect.selectedIndex].text == '**Race Event**'){
        dojo.byId("raceInfo").style.display = "";
        //show("raceInfo");
    }
    else{
        dojo.byId("raceInfo").style.display = "none";
        //hide("raceInfo");
    }
}

function resetWeightTraining(type, evaldObj) {
    //alert("The script returned\n" + evaldObj + "\nAnd type\n" + type);
    weightTraining([], fullExerTable, []);
}

function showWorkout(workout_id) {
    updateJournal(false);
    if(dojo.isIE) {
        //to compensate for poor cacheing in IE
        var rand = Math.floor(Math.random()*1000);
        var url = "/workouts/workout/"+workout_id+'/?_view=workout&_rand='+rand.toString();    
    } else {
        var url = "/workouts/workout/"+workout_id+'/?_view=workout';        
    }

    ajaxViewURL("workoutActivity", 
                url,
                function() {
                    // here i need to add appropriate event connections for the workout id 
                    if(dojo.byId("id_running_type")) {
                        dojo.connect(dojo.byId("id_running_type"), "onchange", "toggleRaceInfo");
                    } else if(dojo.byId("weight_muscles")) {
                        dojo.xhrGet({
                            url: '/media.introplay.com/js/weight_training.js',
                            handleAs: 'javascript',
                            load: resetWeightTraining});
                    }
                    initWorkout();
                },
                true);
}

/* creates and displays a workout */
function showWorkoutAdd(a,activity_id) {
    updateJournal(false);

    ajaxUpdateTwo(
	dojo.byId('waddform'),
        activity_id,
        'workoutActivity',
        function () {
            if(dojo.byId("id_running_type")) {
                dojo.connect(dojo.byId("id_running_type"), "onchange", "toggleRaceInfo");
            } else if(dojo.byId("weight_muscles")) {
                dojo.xhrGet({
                    url: '/media.introplay.com/js/weight_training.js',
                    handleAs: 'javascript',
                    load: resetWeightTraining
                            });
            }
            initWorkout();
            updateWorkoutSummary(dojo.byId('id_workout').value);
        });
}
/*
function deleteWorkout(id){
    var wNode = dojo.byId("workoutSum_"+id);
    var parentTable = dojox.data.dom.getAncestorsByTag(wNode,"table")[1];
    dojo.fx.highlight("workoutSum_"+id, redH, 500).play(500);
    var url = "/workouts/JSON/delete/";
    dojo.io.bind({
    url: url,
    method: "POST",
    load: function(type,r){
        if(r[0] == true){
        if(r[1].count > 0){
            dojo.fx.wipeOut(parentTable,400).play();
            dojox.data.dom.removeNode(parentTable);
            updateWorkoutSummaryTotal(r[1].duration,r[1].points);
        }
        else{
            //show "No Workouts Yet" wipe out/wipe in?
            dojox.data.dom.removeChildren(parentTable.rows[0].cells[0]);
            dojox.data.dom.removeChildren(parentTable.rows[0].cells[1]);
            //create the No Workouts Yet Table
            var innerTable = document.createElement("table");
            innerTable.className = "workout";
            innerTable.insertRow(0);
            innerTable.rows[0].id = "workoutSum_0";
            innerTable.rows[0].insertCell(0);
            innerTable.rows[0].cells[0].width = 110;
            innerTable.rows[0].insertCell(1);
            innerTable.rows[0].cells[1].width = 60;
            innerTable.rows[0].cells[1].align = "right";
            innerTable.rows[0].insertCell(2);
            innerTable.rows[0].cells[2].width = 80;
            innerTable.rows[0].cells[2].align = "right";
            dojox.data.dom.textContent(innerTable.rows[0].cells[0],"No Workouts Yet");
            dojox.data.dom.insertAtPosition(innerTable,parentTable.rows[0].cells[0],"first");
            //hide totals
            dojo.byId("wTotals").style.visibility = 'hidden';
        }
        //if this workout is the currently shown workout, revert that pane back to the add workout pane
        if(dojo.byId("id_workout")){
          if(dojo.byId("id_workout").value == id){
            nextWorkout();
          }
        }
        }
    },
    error: function(type,error){alert("Delete Workout Failed");},
    mimetype: "text/json",
    content: {"id":id}
    });
}
*/
/*
function deleteWorkout2(id) {
  var wNode = dojo.byId("workoutSum_"+id);
  dojox.fx.highlight({node: wNode, color: redH,duration:500}).play();
  dojo.fx.wipeOut({node: wNode,duration: 500}).play(500);
  dojo.xhrPost({
    url: "/workouts/workout/"+id+"/",
    content: {'id':id},
    load: function(response, ioArgs) {
      //update the workout pane along with totals from the response
      dojo.byId('workout_summary_div').innerHTML = response;
      //if this workout is the currently shown workout, revert that pane back to the add workout pane
      if(dojo.byId("id_workout")) {
        if(dojo.byId("id_workout").value == id) {
          nextWorkout();
        }
      }
    },
    error: function(){
      alert("Delete Workout Failed");
    }
  });
}
*/

// TODO: The id parameter will be removed later.
function deleteWorkout2(form, id) {
  var wNode = dojo.byId("workoutSum_"+id);
  dojox.fx.highlight({node: wNode, color: redH,duration:500}).play();
  dojo.fx.wipeOut({node: wNode,duration: 500}).play(500);
  dojo.xhrPost({
    form: form,
    load: function(response, ioArgs) {
      //update the workout pane along with totals from the response
      dojo.byId('workout_summary_div').innerHTML = response;
      //if this workout is the currently shown workout, revert that pane back to the add workout pane
      if(dojo.byId("id_workout")) {
        if(dojo.byId("id_workout").value == id) {
          nextWorkout();
        }
      }
    },
    error: function(){
      alert("Delete Workout Failed");
    }
  });
}

/* function to delete a leg */
function deleteLeg(activity,id){
    var legNode = dojo.byId("wLeg_"+id);
    dojox.fx.highlight(legNode,redH,500).play(500);

    var url = "/workouts/JSON/"+activity+"/delete/";
    dojo.io.bind({
    url: url,
    method: "POST",
    load: function(type, evaldObj){
        if(evaldObj[0] == true){
        dojox.data.dom.removeNode(legNode);
        wSumNode = dojo.byId("workoutSum_"+evaldObj[1].id);
        updateWorkoutSummaryItem(wSumNode,evaldObj[1].activity,evaldObj[1].duration,evaldObj[1].points);
        dojox.fx.highlight(wSumNode, blueH, 500).play(500);
        updateWorkoutSummaryTotal(evaldObj[2].duration,evaldObj[2].points);
        }
    },
    mimetype: "text/json",
    content: {"id":id}
    });
}

/* alerts on the Locker Room Page */
function toggleAlerts(){
    var alerts = dojo.byId('alerts');

    if (alerts.style.display == 'none') {
      dojo.fx.wipeIn({node: alerts, duration: 250}).play();
    } else {
      dojo.fx.wipeOut({node: alerts, duration: 250}).play();
    }
    alerts.blur();
}
/* end alerts */

function addToInviteQueue(invitee){
    var dQ = dojo.byId('divQueue');
    dQ.style.display = '';
    var tQ = dojo.byId('tQueue');
    var index = tQ.rows.length;
    tQ.insertRow(index);
    var tRow = tQ.rows[index];
    tRow.id = 'invite_'+invitee[1];
    tRow.insertCell(0);
    if(invitee[0]==false){tRow.cells[0].style.color = '#0981FF';}
    tRow.cells[0].appendChild(document.createTextNode(invitee[2]));
    tRow.insertCell(1);
    tRow.cells[1].appendChild(document.createTextNode(invitee[3]));
    tRow.insertCell(2);
    var xLink = document.createElement("a");
    xLink.href = "javascript:deleteInvite("+invitee[1]+")";
    dojox.data.dom.textContent(xLink,"X");
    tRow.cells[2].style.textAlign = 'right';
    tRow.cells[2].appendChild(xLink);
}

function addInvite(formId){
    //return true/false plus an error dict or new invite dict
    //if true, create cells and populate
    //if it's the first time we'll have to create the table
    //if false show errors
    dojo.io.bind({
    url: '/leagues/invite/',
    method: "POST",
    load: function(type, evaldObj){
        if(evaldObj[0] == true){
        addToInviteQueue(evaldObj[1]);
        }
        else{alert('false'+evaldObj[1]);}
    },
    error: function(type, data){alert('error');},
    mimetype: 'text/json',
    formNode: dojo.byId(formId)
    });
}
function showInviteErrors(errors){
    eNode = dojo.byId('inviteErrorText');
    eString = "";
    for(var i in errors){
    eString = eString +' '+ errors[i];
    }
    dojox.data.dom.textContent(eNode,eString);
    show('inviteErrors');
}

function updateInviteTables(friends, invited, declined) {
    var clearTable = function(table) {
        while(table.rows.length > 1)
            table.deleteRow(table.rows.length - 1);
    };
    var addTextArrayRow = function(table, row, data, n) {
        table.insertRow(row);
        for(var i = 0; i < n; i++) {
            table.rows[row].insertCell(i);
            var node = document.createTextNode(data[i]);
            table.rows[row].cells[i].appendChild(node);
        }
    };
    var i, j;
    var friendParent = dojo.byId('friendTable').parentNode;
    var invitedT = dojo.byId('invitedTable');
    var declinedT = dojo.byId('declinedTable');
    if(friends.length > 0) {
        var friendT = document.createElement('table');
        for(i = 0; i < friends.length; i++) {
            friendT.insertRow(i);
            friendT.id = 'friendTable';
            friendT.rows[i].insertCell(0);
            friendT.rows[i].cells[0].innerHTML = '<label><input name="friend_' + friends[i][0] + '" style="vertical-align: top;" type="checkbox"/> ' + '<img class="tinyImage" src="https://introplay.com/media/img/photos/' + friends[i][1] + '_ubermini.png" /> ' + friends[i][2] + '</label>';
            friendT.rows[i].cells[0].className = 'row' + ((i % 2) + 1);
        }
        introplay.dom.removeNode(introplay.dom.firstElement(friendParent));
        friendParent.appendChild(friendT);
    }
    clearTable(invitedT);
    for(i = 0; i < invited.length; i++) {
        addTextArrayRow(invitedT, i + 1, invited[i], 3);
    }
    /* I guess we won't be doing this, leaving it commented out until that gets verified by Anil
     * clearTable(declinedT);
     * for(i = 0; i < declined.length; i++) {
     *    addTextArrayRow(declinedT, i + 1, declined[i], 4);
     * }
    */
}

function sendInvites(league_id) {
    var url = "/leagues/invite/send/";
    var inviteForm = dojo.byId("inviteForm");
    var button = dojo.byId('inviteButton');
    var status = dojo.byId('id_sending');
    button.style.visibility = 'hidden';
    status.style.visibility = 'visible';
    dojo.xhrPost({
        url: url,
        handleAs: 'json',
        load: function(evaldObj, args) {
            if(evaldObj[0] == true) {
                button.style.visibility = 'visible';
                status.style.visibility = 'hidden';
                inviteForm.reset();
                if(evaldObj[1].length > 0) {
                    showInviteErrors(evaldObj[1]);
                } else {
                    hide('inviteErrors');
                }
		// this is the function that's causing the problems
                updateInviteTables(evaldObj[2], evaldObj[3], evaldObj[4]);
            } else {
                alert('false ' + evaldObj[1]);
            }
        },
        error: function(type, data) {alert(ajaxError);},
        form: inviteForm,
        content: {'id': league_id}});
}

function ajaxInvite(id,action){
    var url = '/leagues/invite/';
    dojo.xhrPost({
	url: url,
        load: function(evaldObj, args) {
	    if(evaldObj[0] == true){
		var iL = dojo.byId('leagueBase');
		// actions from the individual league page
		if(iL) {
		    if(action == 'Join' || action == 'Public'){
			iL.innerHTML = 'Loading...';
			location.href = location.href;
		    }
		    else{
			location.href = '/leagues/';
		    }
		}
		/*  actions from the league summary page */
		else{
		    /* var inviteNode = dojo.byId('invite_'+id);
		    var invitedT = dojo.byId('invitedTable');
		    if(invitedT.rows.length == 2){
			invitedT.insertRow(2);
			invitedT.rows[2].insertCell(0);
			invitedT.rows[2].cells[0].colSpan = 4;
			invitedT.rows[2].cells[0].appendChild(document.createTextNode("No Pending Invitations"));
		    } */
		    if(action == 'Decline'){
			location.href = '/leagues/';
		    }
		    else{
			location.href = '/leagues/'+evaldObj[1].toString()+'/';
		    }
		   } 
	    }
	    else if(evaldObj[0] == false){
		alert(evaldObj[1]);
		location.href = location.href;
	    }
	},
	error: function(type,data){alert(ajaxError);},
        handleAs: 'json',
	content: {"id":id,"action":action}
    });
}
function acceptInvite(id){
    ajaxInvite(id,"Join");
}
function rejectInvite(id){
    ajaxInvite(id,"Decline");
}

function closeSignups(id){
    if(!confirm('Are you sure?  Once you manage the draft, no new players can join the introLEAGUE and outstanding invitations will be deleted.'))
        return;

    var url = '/leagues/close/';
    dojo.xhrPost({
        url: url,
        load: function(evaldObj, args) {
            if(evaldObj == true) {
                introplay.dom.removeNode(dojo.byId('closeSignups'));
                introplay.dom.removeNode(dojo.byId('inviteContainer'));
                // TODO: invitedContainer no longer exists *anywhere*.  Are we
                // tearing-down everything that needs to be?
                //introplay.dom.removeNode(dojo.byId('invitedContainer'));
            } else {
                alert('You must have at least 2 players in the league to close signups.');
            }
        },
        error: function(type, data) {alert(ajaxError);},
        handleAs: 'json',
        content: {'id': id}});
}

function manageDraft(){
    show('draftContainer');
    show('createTeams');
    hide('manageDraft');
}

function playerManager(action,players){
    if(action == "create"){
    var playerT = document.createElement("table");
    var rowColor = 'row2';
    //only for the case where a team exists but has no players in it
    if(players.length == 0){
        playerT.insertRow(0);
        playerT.rows[0].insertCell(0);
        playerT.rows[0].cells[0].innerHTML = 'No Players';
        playerT.rows[0].className = 'noPlayers';
        playerT.rows[0].cells[0].className = 'row1';
        playerT.rows[0].cells[0].style.width = '180px';
    }
    for(i=0;i<players.length;i++){
        playerT.insertRow(i);
        playerT.rows[i].insertCell(0);
        playerT.rows[i].cells[0].innerHTML = '<input name="player_'+players[i][0]+'" style="vertical-align: top;" type="checkbox" /> '+'<img class="tinyImage" src="/media.introplay.com/img/photos/'+players[i][1]+'_ubermini.png" /> '+players[i][2]+" ("+players[i][3]+')';
        if(rowColor == 'row1'){rowColor = 'row2';}
        else{rowColor = 'row1';}
        playerT.rows[i].cells[0].className = rowColor;
        playerT.rows[i].cells[0].style.width = '180px';
    }
    return playerT;
    }
}

function changeTeams(teamSelect){
    var t2_id = teamSelect.options[teamSelect.selectedIndex].value;
    if(t2_id.length == 0) return true;
    var status = dojo.byId('id_creating');
    status.innerHTML = 'Moving...';
    status.style.visibility = 'visible';
    var t1_id = teamSelect.id.split('_')[1];
    var tForm = dojo.byId('tform' + t1_id);
    var tForm2 = dojo.byId('tform' + t2_id);
    var t1Table = dojo.byId('team_' + t1_id).rows[1].cells[0].childNodes[0].childNodes[0];
    var t2Table = dojo.byId('team_' + t2_id).rows[1].cells[0].childNodes[0].childNodes[0];
    
    var url = '/leagues/teams/change/' + t1_id + '/' + t2_id + '/';
    dojo.xhrPost({
        url: url,
        load: function(evaldObj, args) {
            if(evaldObj != false) {
                //iterate through the source team form elements and grab the checked players
                var players = new Array;
                var j = 0;
                for(var i = 0; i < tForm.elements.length; i++) {
                    if(tForm.elements[i].checked) {
                        players[j] = tForm.elements[i];
                        j++;
                    }
                }
                //move players to new team (visually)
                /* if no players will exist after the last player is moved then create a table row that says 'No Users'
                 or something which will be removed/replaced/hidden when a new user is added again.
                 */
                for(var k = 0; k < players.length; k++) {
                    var lastRow = t2Table.rows.length - 1;
                    players[k].checked = false;
                    if(lastRow < 0) {
                        players[k].parentNode.className = 'row1';
                    } else {
                        if(t2Table.rows[lastRow].cells[0].className == 'row1') {
                            players[k].parentNode.className = "row2";
                        } else {
                            players[k].parentNode.className = "row1";
                        }
                    }
                    t2Table.appendChild(players[k].parentNode.parentNode);
                    if(t2Table.rows[0].className == 'noPlayers') {
                        introplay.dom.removeNode(t2Table.rows[0]);
                    }
                    if(t1Table.rows.length == 0) {
                        t1Table.innerHTML = '<tr class="noPlayers"><td>No Players Currently</td></tr>';
                    }
                }
                //fix alternating rows on source table
                var rowClass = 'row1';
                for(var h = 0; h < t1Table.rows.length; h++) {
                    t1Table.rows[h].cells[0].className = rowClass;
                    if(rowClass == 'row1') {
                        rowClass = 'row2';
                    } else {
                        rowClass = 'row1';
                    }
                }
                //set the teamSelect back to the default
                teamSelect.selectedIndex = 0;
            } else if(evaldObj == false) {
                alert("You haven't chosen any players to move. (or you may not be using Firefox, the page will be refreshed and you can try again.)");
                location.href = location.href;
                //set the teamSelect back to the default
                teamSelect.selectedIndex = 0;
            }
            status.style.visibility = 'hidden';
            //update the metric for that team
            dojox.data.dom.textContent(dojo.byId('metric_' + t1_id), evaldObj.src);
            dojox.data.dom.textContent(dojo.byId('metric_' + t2_id), evaldObj.dest);
        },
        error: function(type, data) {
            alert(ajaxError);
        },
        handleAs: 'json',
        form: tForm});

    return true;
}

function displayTeams(teams){
    introplay.dom.removeNode(dojo.byId("createTeams"));
    var tcol1 = dojo.byId('tcol1');
    var tcol2 = dojo.byId('tcol2');
    var tcol3 = dojo.byId('tcol3');
    var tcol = tcol1;
    for(var i=0;i<teams.length;i++){
	var formNode = document.createElement("form");
	formNode.id = 'tform'+teams[i][0];
	formNode.name = 'tform'+teams[i][0];
	formNode.action = "";
	formNode.method = "POST";
	dojo.place(formNode, tcol, 'last');
	var T = document.createElement("table");
	T.style.width = '188px';
	T.id = 'team_'+teams[i][0].toString();
	T.insertRow(0);
	T.rows[0].insertCell(0);
	T.rows[0].cells[0].innerHTML = teams[i][1] +' (<span id="metric_'+teams[i][0]+'">'+ teams[i][3] +'</span>)';
	T.rows[0].cells[0].style.backgroundColor = '#000000';
	T.rows[0].cells[0].style.color = '#FFFFFF';
	T.insertRow(1);
	T.rows[1].insertCell(0);
	T.rows[1].cells[0].appendChild(playerManager("create",teams[i][2]));
	T.insertRow(2);
	T.rows[2].insertCell(0);
	T.rows[2].cells[0].innerHTML = "Move To: "+teams[i][4];
	dojo.place(T, formNode, 'first');
	if(tcol==tcol1){tcol=tcol2;}
	else if(tcol==tcol2){tcol=tcol3;}
	else{tcol=tcol1;}
    }
    return true;
}

//accepts a JSONized team and position with which to create the tabular team
//this function should be able to replace the similar piece in the function above for DRY compliance ;)
function createTeamTable(team,position){
    var formNode = document.createElement("form");
    formNode.id = 'tform'+team[0];
    formNode.name = 'tform'+team[0];
    formNode.action = "";
    formNode.method = "POST";
    dojox.data.dom.insertAtPosition(formNode,position,"last");
    var T = document.createElement("table");
    T.style.width = '188px';
    T.id = 'team_'+team[0].toString();
    T.insertRow(0);
    T.rows[0].insertCell(0);
    T.rows[0].cells[0].innerHTML = team[1];
    T.rows[0].cells[0].style.backgroundColor = '#000000';
    T.rows[0].cells[0].style.color = '#FFFFFF';
    T.insertRow(1);
    T.rows[1].insertCell(0);
    T.rows[1].cells[0].appendChild(playerManager("create",team[2]));
    T.insertRow(2);
    T.rows[2].insertCell(0);
    T.rows[2].cells[0].innerHTML = "Move To: "+team[3];
    dojox.data.dom.insertAtPosition(T,formNode,"first");
}


function createTeams(league_id){
    var tSelect = dojo.byId("numTeams");
    var teamNum = tSelect.options[tSelect.selectedIndex].value;
    var status = dojo.byId('id_creating');
    status.style.visibility = 'visible';
    hide("createTeams");
    var url = '/leagues/'+league_id+'/teams/create/';
    dojo.xhrPost({
	url: url,
	load: function(evaldObj, args) {
	    if(evaldObj[0] == true){
		if (displayTeams(evaldObj[1])){
		    status.style.visibility = 'hidden';
		    show("teamSelection");
		    location.href=location.href;
		}
	    }
	    else{
		alert(evaldObj[1]);
	    }
	},
	error: function(type,data){
	    alert(ajaxError);
	    status.style.visibility = 'hidden';
	    show("createTeams");
	},
        handleAs: 'json',
	content: {"team_count":teamNum}
    });
}

function closeTeams(league_id) {
    var fT = dojo.byId('finalizeTeams');
    fT.innerHTML = 'Please Wait...';
    var url = '/leagues/close_teams/';
    dojo.xhrPost({
        url: url,
        load: function(evaldObj, args) {
            if(evaldObj == true) {
                //redirect to self to get the updates for now
                fT.innerHTML = 'Loading...';
                location.href = location;
            } else {
                alert('Sorry, you have already finalized your team selections.');
            }
        },
        error: function(type, data) {alert(ajaxError);},
        handleAs: 'json',
        content: {'id': league_id}});
}

function showTeamName(){
    hide('changeTeamName');
    dojo.byId('teamName').style.display = '';
}

function changeTeamName(team_id){
    var teamName = dojo.byId('teamNameInput').value;
    var url = '/leagues/change_team_name/';
    dojo.xhrPost({
      url: url, 
      handleAs: 'json',
      load: function(evaldObj,type){
          if(evaldObj == true){
              dojo.byId('hTeamName').innerHTML = teamName;
              hide('teamName');
              dojo.byId('changeTeamName').style.display = '';
          }
	  else{
	      alert('Change Team Name Failed.');
	  }
      },
      error: function(type,data){alert(ajaxError);},
      content: {"id":team_id,"team_name":teamName}
    });
}

/* end stuff for leagues */


function ajaxViewURL(replaceId, url, extraFn, loading_msg) {
    var replaceNode = dojo.byId(replaceId);
    var old;
    if(loading_msg) {
        old = replaceNode.innerHTML;
        introplay.dom.showLoadingNotification(replaceNode);
    }
    dojo.xhrGet({
        load: function(response, ioArgs) {
            replaceNode.innerHTML = response;
            if(extraFn != null) extraFn();
        },
        error: function(response, ioArgs) {
            if(loading_msg) replaceNode.innerHTML = old;
            alert(ajaxError);
        },
        url: url});
}

function ajaxViewLink(replaceId, link, extraFn) {
  ajaxViewURL(replaceId, link.href, extraFn);
}

function ajaxUpdate(form, button, replaceId, extraFn) {
    var url = form.action;
    var content = {};
    if(button != null) {
        if(dojo.isIE) {
            //it's really not cool that IE sends the button text as the button.value.  Jerks.
            //in a perfect world, this function wouldn't need a second parameter
            content[button.name] = activity_id;
        } else {
            content[button.name] = button.value;
        }
    }

    dojo.xhrPost({
        form: form,
        content: content,
        load: function(response, ioArgs) {
            dojo.byId(replaceId).innerHTML = response;
            extraFn();
        },
	error: function(response, ioArgs){
	  if(ioArgs.xhr.status == 409){
            dojo.byId(replaceId).innerHTML = response.responseText;
	  }
	  else{
            alert(ajaxError.message);
	  }
        }
    });
}

function ajaxUpdateTwo(form, activityId, replaceId, extraFn) {
    var url = form.action;

    dojo.xhrPost({
        form: form,
        content: {'activity_id':activityId},
        load: function(response, ioArgs) {
            dojo.byId(replaceId).innerHTML = response;
            extraFn();
        },
	error: function(response, ioArgs){
	  if(ioArgs.xhr.status == 409){
            dojo.byId(replaceId).innerHTML = response.responseText;
	  }
	  else{
            alert(ajaxError.message);
	  }
        }
    });
}

function updateWorkoutSummary(workout_id) {
    /*
    var id = "workoutSum_" + workout_id;
    var node = dojo.byId(id);
    if (dojo.dom.isNode(node)) {
        var activity = dojo.byId('workout_activity').value;
        var duration = dojo.byId('workout_duration').value;
        var points = dojo.byId('workout_points').value;
        updateWorkoutSummaryItem(node, activity, duration, points);
    } else if(dojo.dom.isNode(dojo.byId("workoutSum_0"))) {
        firstWorkoutSummaryItem(workout_id, evaldObj[2]);
    } else {
        createWorkoutSummaryItem(workout_id, evaldObj[2]);
    }
    dojox.fx.highlight(id, blueH, 500).play(500);

    //update the totals div
    updateWorkoutSummaryTotal(evaldObj[2][3], evaldObj[2][4]);
     */

  // this function should highlight the relevant workout some way or another
    var table = dojo.byId('bundled_workout_summary');
    var parent = dojo.byId('workout_summary_div');
    // I'm sure there's a better way...
    parent.innerHTML = table.innerHTML;
}

function viewLeg(link) {
    ajaxViewLink('runningP', link/*, 'special'*/);
}

/* ''button'' can be omitted */
function updateLeg2(form, button, isNext) {
    ajaxUpdate(
        form,
        button,
        'runningP',
        function() {
            updateWorkoutSummary(dojo.byId('id_workout').value);
	    if(isNext) nextWorkout();
            //if(dojo.byId('weight_muscles')) resetWeightTraining();
        });
}

/*
//hopefully this function will allow any activity leg to be saved, basically at least, there will probably have to be variation on some activities
function activityAddLeg(modelName){

  var errorDOM = dojo.byId('activity_errors');

  dojo.io.bind({
      url: "/workouts/activityAJAX/"+modelName+'/',
      method: "POST",
      sync: true,
      load: function(type, evaldObj){
          if(evaldObj[0] == false){
          //show error foo
              //dojo.byId("id_error_icon").style.visibility = 'visible';
              dojox.data.dom.textContent(errorDOM,evaldObj[1]);
          }
          else{
	      var T;
	      //see if the table exists, if not, create it, if so, append it
	      if (dojox.data.dom.isNode(dojo.byId("tableLegs")) != true){
		  T = document.createElement("table");
		  T.id = "tableLegs";
		  T.className = "tbl_"+modelName.toLowerCase()+"_leg";
		  dojox.data.dom.insertAtPosition(T,dojo.byId(modelName+"P"),"first");
	      }
	      else{
		  T = dojo.byId("tableLegs");
	      }
	      //somehow some of this needs to be turned into a function so that each particular activities' function is called
	      //we do this with this --> x = this("functionName"); x();
	      //need to move the running specific stuff to a different function probably.  maybe just return an array to match the table
	      //loop through the array and use the indexes to match the tables
	      //a is the activity object
	      var a = evaldObj[1];
	      var index = T.rows.length;
	      T.insertRow(index);
	      tRow = T.rows[index];
	      tRow.id = "wLeg_"+a.id;
	      //if(a.running_type != null){
		  tRow.insertCell(0);
		  tRow.cells[0].appendChild(document.createTextNode(a.running_type));
		  //}
	      tRow.insertCell(1);
	      tRow.cells[1].appendChild(document.createTextNode(a.distance+" "+a.distance_type));
	      tRow.insertCell(2);
	      tRow.cells[2].appendChild(document.createTextNode(a.time_HH+" hr "+a.time_MM+" min "+a.time_SS+" sec "));
	      tRow.insertCell(3);
	      if(a.intensity == 1){var intensity = "Moderate"}
	      else if(a.intensity == 0){var intensity = "Light"}
	      else if(a.intensity == 2){var intensity = "Vigorous"}
	      tRow.cells[3].appendChild(document.createTextNode(intensity));
	      tRow.insertCell(4);
	      tRow.cells[4].align = "right";
	      var eLink = document.createElement("a");
	      eLink.href = "javascript:edit"+modelName+"Leg("+a.id+")";
	      dojox.data.dom.textContent(eLink," e ");
	      tRow.cells[4].appendChild(eLink);
	      var legLinks = document.createElement("a");
	      legLinks.href = "javascript:deleteLeg('"+modelName+"',"+a.id+")";
	      legLinks.innerHTML = '<img src="/media.introplay.com/img/red_minus.jpg" />';
	      tRow.cells[4].appendChild(legLinks);
	      dojox.fx.highlight(tRow, "#f7c32f", 500).play(500);

          dojo.byId("id_workout").value = a.workout_id;
          //a lot of the look and feel info that's in here could be switched out if i build a better CSS solution
          //check to see if the current running item exists in the workout summary pane and if so, update it, if not, create it
          //if it exists it's id will be workoutSum_[workout id] e.g. workoutSum_70
          //creating document fragments in these cases instead of updating the dom directly will make the page update more quickly and cleanly
          //also need to update the total and on the very first workout get rid of the "No Workouts Yet"
          if (dojox.data.dom.isNode(dojo.byId("workoutSum_"+a.workout_id))){
          updateWorkoutSummaryItem(dojo.byId("workoutSum_"+a.workout_id),evaldObj[2][0],evaldObj[2][1],evaldObj[2][2]);
          }
          else if(dojox.data.dom.isNode(dojo.byId("workoutSum_0"))){
          firstWorkoutSummaryItem(a.workout_id,evaldObj[2]);
          }
          else{
          createWorkoutSummaryItem(a.workout_id,evaldObj[2]);
          }
          dojox.fx.highlight("workoutSum_"+a.workout_id, blueH, 500).play(500);

          //update the totals div
          updateWorkoutSummaryTotal(evaldObj[2][3],evaldObj[2][4]);

              dojox.data.dom.textContent(errorDOM," ");
      }
      },
      error: function(type, data){
      alert(data["message"]);
      },
      mimetype: "text/json",
      formNode: dojo.byId(modelName+"Form"),
      content: { "journal": dojo.byId("journalId").value }
  });
}
*/

function populateForm(legObj) {
    for(var item in legObj) {
        if(dojo.byId("id_" + item)) {
            var current = dojo.byId("id_" + item);
            if(current.type == "text")
                current.value = legObj[item];
            else if(current.type == "select-one") {
                if(legObj[item].toString().length == 0) {
                    current.options.selectedIndex = 0;
                } else {
                    for(var i = 0; i < current.options.length; i++) {
                        if(current.options[i].text == legObj[item]) {
                            dojo.byId("raceInfo").style.display = "none";
                            current.options.selectedIndex = i;
                        } else if(current.options[i].text == "**Race Event**" && legObj[item] == "Race Event") {
                            dojo.byId("raceInfo").style.display = "";
                            current.options.selectedIndex = i;
                        }
                    }
                }
            } else {
                alert(current.type);
            }
        }
    }
}

function rLegRow(rowId,rLeg){
    tRow = dojo.byId(rowId);
    tRow.deleteCell(0);
    tRow.insertCell(0);
    tRow.cells[0].appendChild(document.createTextNode(rLeg.running_type));
    tRow.insertCell(1);
    tRow.cells[1].appendChild(document.createTextNode(rLeg.distance+" "+rLeg.distance_type));
    tRow.insertCell(2);
    tRow.cells[2].appendChild(document.createTextNode(rLeg.time_HH+" hr "+rLeg.time_MM+" min "+rLeg.time_SS+" sec "));
    tRow.insertCell(3);
    if(rLeg.intensity == 1){var intensity = "Moderate"}
    else if(rLeg.intensity == 0){var intensity = "Light"}
    else if(rLeg.intensity == 2){var intensity = "Vigorous"}
    tRow.cells[3].appendChild(document.createTextNode(intensity));
    tRow.insertCell(4);
    tRow.cells[4].align = "right";
    var eLink = document.createElement("a");
    eLink.href = "javascript:editRunningLeg("+rLeg.id+")";
    dojox.data.dom.textContent(eLink," e ");
    tRow.cells[4].appendChild(eLink);
    var legLinks = document.createElement("a");
    legLinks.href = "javascript:deleteLeg('Running',"+rLeg.id+")";
    legLinks.innerHTML = '<img src="/media.introplay.com/img/red_minus.jpg" />';
    tRow.cells[4].appendChild(legLinks);
    dojox.fx.highlight(tRow, "#0981FF", 500).play(500);
}

function updateLeg(activity,id){
    dojo.io.bind({
    url: "/workouts/JSON/"+activity+"/update/"+id+"/",
    method: "POST",
    load: function(type, evaldObj){
        if(evaldObj[0] == true){
        dojox.data.dom.moveChildren(dojo.byId("wLeg_"+id).cells[0],dojo.byId("running_new"));
        rLegRow("wLeg_"+id,evaldObj[1]);
        //change the link to be back to the add leg link
        var rFormSubmit = dojo.byId("rFormSubmit");
        rFormSubmit.href = "javascript:activityAddLeg('Running')";
        dojox.data.dom.textContent(rFormSubmit,"+ add");
        dojo.byId("running_new").style.visibility = 'visible';
        //update the workout
        wSumNode = dojo.byId("workoutSum_"+evaldObj[1].workout_id);
        updateWorkoutSummaryItem(wSumNode,evaldObj[2][0],evaldObj[2][1],evaldObj[2][2]);
        dojox.fx.highlight(wSumNode, blueH, 500).play(500);
        updateWorkoutSummaryTotal(evaldObj[2][3],evaldObj[2][4]);
        }
    },
      mimetype: "text/json",
      formNode: dojo.byId(activity+"Form")
    });
}
function revertLeg(activity,id){
    //add post data to this, add "update" or something to the url as well, for now just testing with the same data
    dojo.io.bind({
    url: "/workouts/JSON/"+activity+"/"+id+"/",
    load: function(type, evaldObj){
        if(evaldObj != false){
        dojox.data.dom.moveChildren(dojo.byId("wLeg_"+id).cells[0],dojo.byId("running_new"));
        rLegRow("wLeg_"+id,evaldObj);
        dojo.byId("running_new").style.visibility = 'visible';
        }
    },
    mimetype: "text/json"
    });
}
function editRunningLeg(id) {
    var leg = dojo.byId("wLeg_"+id);
    //grab the json version of the running leg
    dojo.io.bind({
        url: "/workouts/JSON/Running/"+id+"/",
        load: function(type, evaldObj) { populateForm(evaldObj); },
        mimetype: "text/json"
    });
    //delete the table cells for display
    for(var i = 0; i < 5; i++) leg.deleteCell(0);
    leg.insertCell(0);
    leg.cells[0].colSpan = 5;
    var formParent = dojo.byId("divRunningForm").parentNode;

    var rFormSubmit = dojo.byId("rFormSubmit");
    rFormSubmit.href = "javascript:updateLeg('Running'," + id + ");";
    dojox.data.dom.textContent(rFormSubmit, "update");

    dojox.data.dom.moveChildren(formParent, leg.cells[0]);

    if(formParent.tagName == "DIV") {
        formParent.style.visibility = 'hidden';
    } else {
        revertLeg('Running', formParent.parentNode.id.split('_')[1]);
    }
    dojox.fx.highlight(leg, "#0981FF", 500).play(500);
}
function updateWorkoutSummaryItem(wSumNode,activityName,duration,points){
    dojox.data.dom.textContent(wSumNode.cells[0], activityName.toString());
    dojox.data.dom.textContent(wSumNode.cells[1], duration.toString());
    dojox.data.dom.textContent(wSumNode.cells[2], points.toString());
}
function updateWorkoutSummaryTotal(duration,points){
    totRow = dojo.byId("tblWorkoutTot").rows[0];
    dojox.data.dom.textContent(totRow.cells[1],duration.toString());
    dojox.data.dom.textContent(totRow.cells[2],points.toString());
    dojox.fx.highlight("tblWorkoutTot", blueH, 500).play(500);
}
function firstWorkoutSummaryItem(wId,w){
    var currentRow = dojo.byId("workoutSum_0");
    currentRow.id = "workoutSum_"+wId;
    updateWorkoutSummaryItem(currentRow,w[0],w[1],w[2]);
    //create the delete link
    var deleteLink = document.createElement("a");
    deleteLink.href = "javascript:deleteWorkout("+wId+")";
    dojox.data.dom.textContent(deleteLink,"X");
    //insert the delete link into the DOM
    dojox.data.dom.getAncestorsByTag(currentRow,"table")[1].rows[0].cells[1].appendChild(deleteLink);
    //attach the activate/deactivate Row events
    dojo.connect(currentRow, "onmouseover", function(evt){ activateRow(currentRow); });
    dojo.connect(currentRow, "onmouseout", function(evt){ deactivateRow(currentRow); });
    dojo.connect(currentRow, "onclick", function(evt){ showWorkout(wId); });
    //show the totals div
    dojo.byId("wTotals").style.visibility = 'visible';
}

function createWorkoutSummaryItem(wId,w){
    var newTable = document.createElement("table");
    var innerTable = document.createElement("table");
    //create the outer table
    newTable.className = "workout";
    newTable.insertRow(0);
    newTable.rows[0].insertCell(0);
    newTable.rows[0].insertCell(1);
    newTable.rows[0].cells[1].width = 20;
    newTable.rows[0].cells[1].align = "right";
    //create the inner table
    innerTable.className = "workout";
    innerTable.insertRow(0);
    innerTable.rows[0].id = "workoutSum_"+wId;
    innerTable.rows[0].insertCell(0);
    innerTable.rows[0].cells[0].width = 110;
    innerTable.rows[0].insertCell(1);
    innerTable.rows[0].cells[1].width = 60;
    innerTable.rows[0].cells[1].align = "right";
    innerTable.rows[0].insertCell(2);
    innerTable.rows[0].cells[2].width = 80;
    innerTable.rows[0].cells[2].align = "right";
    updateWorkoutSummaryItem(innerTable.rows[0],w[0],w[1],w[2]);
    //create the delete link
    var deleteLink = document.createElement("a");
    deleteLink.href = "javascript:deleteWorkout("+wId+")";
    dojox.data.dom.textContent(deleteLink,"X");
    //attach the activate/deactivate Row events
    dojo.connect(innerTable.rows[0], "onmouseover", function(evt){ activateRow(innerTable.rows[0]); });
    dojo.connect(innerTable.rows[0], "onmouseout", function(evt){ deactivateRow(innerTable.rows[0]); });
    dojo.connect(innerTable.rows[0], "onclick", function(evt){ showWorkout(wId); });
    //append the inner table into the outer table
    newTable.rows[0].cells[0].appendChild(innerTable);
    //append the delete link to the outer table
    newTable.rows[0].cells[1].appendChild(deleteLink);
    //place the table into the workout div just above the total div
    dojox.data.dom.insertBefore(newTable,dojo.byId("wTotals"));
}

function levelValue(divNode, val, color){
  if(val.length == 0 || val == "undefined"){
    val = 0;
  }
  var images = dojo.query("img",divNode);

  for(var i = 0; i < 5; i++){
    if((i+1) <= val){
      images[i].src = '/media.introplay.com/img/'+color+'_bar.gif';
    }
    else{
      images[i].src = '/media.introplay.com/img/gray_bar.gif';
    }
  }
}

function vitaminLevel(divNode, val) {
  var imgElement = dojo.query("img",divNode);
  (val == 1) ? imgElement.src = '/media.introplay.com/img/vitamin_yellow.jpg' : imgElement.src = '/media.introplay.com/img/vitamin_gray.jpg';
}

function setupVitamin(divNode){
  var inputElement = dojo.query("input",divNode)[0];
  var imgElement = dojo.query("img",divNode)[0];
  vitaminLevel(inputElement, inputElement.value);
  dojo.connect(imgElement, "onclick", function(evt){inputElement.value=1; vitalsValidSave(inputElement.name);} );
  dojo.connect(imgElement, "onmouseover", function(evt){vitaminLevel(divNode,1);} );
  dojo.connect(imgElement, "onmouseout", function(evt){vitaminLevel(divNode,inputElement.value);});
}

function connectLevelClick(imgElement, inputElement, i, saveFn) {
    dojo.connect(imgElement,
                 'onclick',
                 function(evt) {
                     inputElement.value = i;
                     saveFn(inputElement);
                 });
}

function connectLevelHover(imgElement, divNode, i, color) {
    dojo.connect(imgElement,
                 'onmouseover',
                 function(evt) {
                     levelValue(divNode, i, color);
                 });
}

//accepts a div for the Levels widget
function setupLevels(divNode, color, saveFn) {
    var inputElement = dojo.query('input', divNode)[0];
    // set imgElement to input element for loop
    var images = dojo.query('img', divNode);
    // set the current level for the element based on the form hidden input value
    levelValue(divNode, inputElement.value, color);
    for(var j = 0; j < 5; j++) {
        var i = j + 1;
        imgElement = images[j];
        connectLevelClick(imgElement, inputElement, i, saveFn);
        connectLevelHover(imgElement, divNode, i, color);
        dojo.connect(imgElement, 'onmouseout',
                     function(evt) {
                         levelValue(divNode, inputElement.value, color);
                     });
    }
}

function workoutFieldSave(control) {
    var savingNode = dojo.query('.saving', control.form)[0];
    savingNode.style.visibility = 'visible';
    // wId needs to be set here because by the time the load function is executed, it may no longer exist in the dom
    var wId = dojo.byId('id_workout').value;
    setTimeout(function() {
                   dojo.xhrPost({
                       sync: true,
                       load: function(response, ioArgs) {
                           //we should have status 204 except on the generic minutes workout fields 
                           if(ioArgs.xhr.status == 200) {
			       //setting the id to null so that when it's recreated the DOM knows what element to select
			       //note that the node will need to be reselected 
			       dojo.byId('workoutSum_'+wId).id = null;

                               dojo.byId('workout_summary_div').innerHTML = response;
                               //TODO highlight the workout and the totals that have been changed
                               dojox.fx.highlight({
                                   node: 'workoutSum_' + wId,
                                   color: blueH,
                                   duration: 500}).play(500);
                               //highlight totals once it's consistently available
                               //dojox.fx.highlight({node: "tblWorkoutTot", color: blueH, duration: 500}).play(500);
                           }
                           savingNode.style.visibility = 'hidden';
                       },
                       error: function(response, ioArgs) {
                           if(ioArgs.xhr.status == 409) {
                               dojo.byId('workoutActivity').innerHTML = response.responseText;
                               //getting rid of any selection and returning focus back to the field that sent the request
                               dojo.byId(control.id).focus();
                           }
                       },
                       form: control.form});
               },
               500);
}


function initWorkout() {
    hide('finishedButton');
    show('nextButton');
    dojo.byId('nextButton').disabled = false;

    /* might we be able to attach these events in templates as well? */
    setupLevels(dojo.byId('qualityLevels'), 'blue', workoutFieldSave);

    // This loop should be able to test for each different activity and
    // variations of which terrain/surface/weather/precip/time values are
    // available.  We should probably move this stuff into templates as well.
    var wForm = dojo.byId('workoutform');
    // This lambda is necessary to capture specific values of ''element''.
    var conn = function(element) {
        dojo.connect(element,
                     'onclick',
                     function(evt) {
                         workoutFieldSave(element, 'sWorkoutTP');
                     });
    };
    var tags = ['surface', 'terrain', 'weather', 'precipitation',
                'time_of_day'];
    for(var i = 0; i < wForm.elements.length; i++) {
        var element = wForm.elements[i];
        for(var j = 0; j < tags.length; j++) {
            if(!element.id.match(tags[j])) continue;
            conn(element);
            break;
        }
    }
}

/* for account settings */
function changePassword(){
    var url = '/profile/settings/password.json';
    var errorDOM = dojo.byId('error_message');
    dojo.byId('id_error_icon').style.visibility = 'hidden';
    dojo.byId('cpass').disabled = true;
    dojo.byId('cpass').value = '  Saving....  ';
    errorDOM.style.visibility = 'hidden';

    dojo.xhrPost({
        url: url,
	load: function(data,type){
            if(data === true){
                errorDOM.style.color = '#05be15';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, 'Your password was successfully changed.');
            }
            else{
                errorDOM.style.color = '#BE0514';
                dojo.byId('id_error_icon').style.visibility = 'visible';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, data[0]);
                dojo.byId('cpass').disabled = false;
                dojo.byId('cpass').value = 'Change Password';
            }
        },
	error: function(data,type){alert(ajaxError);},
        handleAs: "json",
        form: dojo.byId('passwordForm')
    });
}

function changeNickname(){
    var url = '/profile/settings/nickname.json';
    var errorDOM = dojo.byId('error_message');
    dojo.byId('id_error_icon').style.visibility = 'hidden';
//    dojo.byId('uForum').disabled = true;
//    dojo.byId('uForum').value = 'Saving....'
    errorDOM.style.visibility = 'hidden';

    dojo.io.bind({
        url: url,
        method: "POST",
        load: function(type,data){
            if(data === true){
                errorDOM.style.color = '#05be15';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, 'Your nickname was successfully changed.');
            }
            else{
                errorDOM.style.color = '#BE0514';
                dojo.byId('id_error_icon').style.visibility = 'visible';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, data[0]);
//                dojo.byId('uForum').disabled = false;
//                dojo.byId('uForum').value = 'Update Nickname'
            }
        },
        error: function(type,data){alert(ajaxError);},
        mimetype: 'text/json',
        formNode: dojo.byId('nickForm')
    });
}

function updateForumSettings(){
    var url = '/profile/settings/forum.json';
    var errorDOM = dojo.byId('error_message');
    dojo.byId('id_error_icon').style.visibility = 'hidden';
    dojo.byId('uForum').disabled = true;
    dojo.byId('uForum').value = 'Saving....'
    errorDOM.style.visibility = 'hidden';

    dojo.io.bind({
        url: url,
        method: "POST",
        load: function(type,data){
            if(data === true){
                errorDOM.style.color = '#05be15';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, 'Your forum settings were successfully changed.');
                dojo.byId('uForum').disabled = false;
                dojo.byId('uForum').value = 'Update Forum Settings'
            }
            else{
                errorDOM.style.color = '#BE0514';
                dojo.byId('id_error_icon').style.visibility = 'visible';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, data[0]);
                dojo.byId('uForum').disabled = false;
                dojo.byId('uForum').value = 'Update Forum Settings'
            }
        },
        error: function(type,data){alert(ajaxError);},
        mimetype: 'text/json',
        formNode: dojo.byId('forumForm')
    });
}

function updateEmailSettings(){
    var url = '/profile/settings/email.json';
    var errorDOM = dojo.byId('error_message');
    dojo.byId('id_error_icon').style.visibility = 'hidden';
    dojo.byId('uEmail').disabled = true;
    dojo.byId('uEmail').value = 'Saving...';
    errorDOM.style.visibility = 'hidden';

    dojo.xhrPost({
        form: dojo.byId('emailForm'),
        url: url,
        handleAs: 'json',
        load: function(data, args){
            if(data == true){
                errorDOM.style.color = '#05be15';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, 'Your account settings were successfully changed.');
                dojo.byId('uEmail').disabled = false;
                dojo.byId('uEmail').value = 'Update Account Settings';
            }
            else{
                errorDOM.style.color = '#BE0514';
                dojo.byId('id_error_icon').style.visibility = 'visible';
                errorDOM.style.visibility = 'visible';
                dojox.data.dom.textContent(errorDOM, data[0]);
                dojo.byId('uEmail').disabled = false;
                dojo.byId('uEmail').value = 'Update Account Settings';
            }
        },
        error: function(type,data){alert(ajaxError);}
    });
}

function forgot(){
    if(dojo.byId('id_errors')){
    hide('id_errors');
    }
    hide('mainForm');
    show('forgot');
}

function backtoLogin(){
    if(dojo.byId('id_errors')){
	hide('id_errors');
    }
    hide('forgot');
    show('mainForm');
}

function sendForgot(){
    var url = '/forgot.json';
    dojo.xhrPost({
        url: url,
        load: function(data,type){
            if(data[0] === true){
		alert(data[1]);
		backtoLogin();
            }
	    else{
		dojo.byId('id_errors').style.display = '';
		dojo.byId('id_error_message').innerHTML = data[1];
            }
        },
        error: function(data,type){alert(ajaxError);},
        handleAs: "json",
        form: dojo.byId('forgotForm')
    });
}

/* Analysis Section */

/*function lockerAnalysis()
{
    dojo.require('dojo.collections.Store');
    dojo.require('dojo.charting.Chart');
    dojo.require('dojo.json');

    var store1 = new dojo.collections.Store();
    var store2 = new dojo.collections.Store();
    var store3 = new dojo.collections.Store();
    
    store1.setData(weight);
    store2.setData(happiness);
    store3.setData(stress);

    var timeSeries1 = new dojo.charting.Series({ dataSource: store1, bindings: { x: 'week', y: 'weight' }, label: 'Your weight over 8 weeks' });
    var timeSeries2 = new dojo.charting.Series({ dataSource: store2, bindings: { x: 'week', y: 'happiness' }, label: 'Your happiness over 8 weeks' });
    var timeSeries3 = new dojo.charting.Series({ dataSource: store3, bindings: { x: 'week', y: 'stress' }, label: 'Your stress over 8 weeks' });

    Date.prototype.getWeek = function()
    {
        var janOne = new Date(this.getFullYear(),0,1);
        return Math.ceil((((this - janOne) / 86400000) + janOne.getDay())/7);
    }
    
    var dt = new Date();
    var upperDt = new Date(86400000*Math.floor(dt.getTime()/86400000+0.5));
    var lowerDt = new Date(upperDt.getTime()-(49*24*60*60*1000));

    var xAxis1 = new dojo.chartingAxis();
    xAxis1.range = {lower: (dt.getWeek()-7), upper: dt.getWeek() };
    xAxis1.origin = 'max';
    xAxis1.showTicks = false;
    xAxis1.label = 'Your Weight Over 8 Weeks';
    for(var i=0; i<57; i++)
    {
        dt = new Date(lowerDt.getTime()+(i*24*60*60*1000)+(60*60*1000));
        if(i%7==0)
        {
            xAxis1.labels[i]=
            {
                label: (dt.getMonth(dt.getTime())+1).toString()+'/'+(dt.getDate(dt1.getTime()).toString()),
                value: dt.getWeek()
            };
        }
        else
        {
            xAxis1.labels[i]={ label: '', value: dt.getWeek() };
        }
    }

    var xAxis2 = new dojo.charting.Axis();
    var metricLength;
    xAxis2.range = { lower: (dt.getWeek()-7), upper: dt.getWeek()
}*/

function drawAnalysis()
{
    var isKhtml = navigator.appName.indexOf('KHTML') > -1;
    var isKonqueror = navigator.appName.indexOf('Konqueror') > -1;
    var isAppleWebKit = navigator.appName.indexOf('AppleWebKit') > -1;
    var isOpera = navigator.appName.indexOf('Opera') > -1;
    var isMac = navigator.appVersion.indexOf('Mac') > -1;

    if(navigator.vendor != undefined)
        var isSafari = navigator.vendor.indexOf('Apple Computer, Inc.') > -1;
    else
        var isSafari = 0;

    /* commenting this out for the redesign, switching to open flash charts
    if(isSafari || isKhtml || isKonqueror || isAppleWebKit || (isMac && !(isOpera)))
    {
        dojo.byId('browserWarn').style.display = 'block';
        dojo.byId('bWarn').style.display = 'block';
        dojo.byId('bWarn').style.paddingBottom = '15px';
        dojo.byId('charts').style.display = 'none';
        dojo.byId('browserWarn').innerHTML = "Stay tuned as we build out graphs and more analysis in the Workout Summary!";
    }
    */

    dojo.require("dojo.collections.Store");
    dojo.require("dojo.charting.Chart");
    dojo.require('dojo.json');

    var store1 = new dojo.collections.Store();
    var store2 = new dojo.collections.Store();
    var store3 = new dojo.collections.Store();
    var store4 = new dojo.collections.Store();

    if(activities.length==0)
    {
        activities[0]={minutes: 0, activity: 'Activity 1'};
        activities[1]={minutes: 0, activity: 'Activity 2'};
        activities[2]={minutes: 0, activity: 'Activity 3'};
    }
    else if(activities.length==1)
    {
        activities[1]={minutes: 0, activity: 'Activity 2'};
        activities[2]={minutes: 0, activity: 'Activity 3'};
    }
    else if(activities.length==2)
    {
        activities[2]={minutes: 0, activity: 'Activity 3'};
    }

    for(var i=0; i<activities.length; i++) { activities[i].a_num = 2*i; }
    for(var i=0; i<intensity.length; i++) { intensity[i].i_num = 2*i; }

    store1.setData(hoursWorked); store2.setData(activities); store3.setData(weights); store4.setData(intensity);

    var timeSeries1 = new dojo.charting.Series({ dataSource: store1, bindings: { x: "week", y: "minutes" }, label: "Weekly workouts" });
    var timeSeries2 = new dojo.charting.Series({ dataSource: store2, bindings: { x: "a_num", y: "minutes" }, label: "Top 3 activites" });
    var timeSeries3 = new dojo.charting.Series({ dataSource: store3, bindings: { x: "date", y: "w_metric" }, label: "Your weight gain/loss percentages over time" });
    var timeSeries4 = new dojo.charting.Series({ dataSource: store4, bindings: { x: "i_num", y: "minutes"}, label: "Light, moderate, vigorous intensities" });

    Date.prototype.getWeek = function()
    {
        var janOne = new Date(this.getFullYear(),0,1);
        return Math.ceil((((this - janOne) / 86400000) + janOne.getDay())/7);
    }
    var xAxis1 = new dojo.charting.Axis();
    var dt1 = new Date();
    var upperDt1 = new Date(86400000*Math.floor(dt1.getTime()/86400000+0.5));
    var lowerDt1 = new Date(upperDt1.getTime()-(49*24*60*60*1000));
    xAxis1.range = { lower: (dt1.getWeek()-7), upper: dt1.getWeek() };
    xAxis1.origin = "max";
    xAxis1.showTicks = false;
    xAxis1.label = "Weekly Hours Exercised";
    for(var i=0; i<57; i++)
    {
        dt1 = new Date(lowerDt1.getTime()+(i*24*60*60*1000)+(60*60*1000));
        if(i%7==0)
        {
            xAxis1.labels[i]=
            {
                label: (dt1.getMonth(dt1.getTime())+1).toString()+'/'+(dt1.getDate(dt1.getTime()).toString()),
                value: dt1.getWeek()
            };
        }
        else { xAxis1.labels[i]={ label: '', value: dt1.getWeek() }; }
    }

    var xAxis2 = new dojo.charting.Axis();
    var actLength;
    for(var i=0; i<activities.length*2; i++) { if(i<6){actLength=i;} }
    xAxis2.range = { lower: -1, upper: actLength };
    xAxis2.origin = "max";
    xAxis2.label = "Top 3 Activities";
    for(var i=0; i<activities.length*2; i++)
    {
        if(i<6 && i%2==0){xAxis2.labels[i]={ label: activities[i/2].activity, value: i };}
        else{xAxis2.labels[i]={ label: '', value: i };}
    }

    var xAxis3 = new dojo.charting.Axis();
    var dt = new Date();
    var upperDt = new Date(86400000*Math.floor(dt.getTime()/86400000+0.5));
    var lowerDt = new Date(upperDt.getTime()-(49*24*60*60*1000));
    xAxis3.range = { lower: lowerDt.valueOf(), upper: upperDt.valueOf() };
    xAxis3.origin = "max";
    xAxis3.label = "% Weight Gain/Loss In 8 Weeks";
    for(var i=0; i<57; i++)
    {
        dt = new Date(lowerDt.getTime()+(i*24*60*60*1000)+(60*60*1000));
        if(i%7==0)
        {
            xAxis3.labels[i]=
            {
                label: (dt.getMonth(dt.getTime())+1).toString()+'/'+(dt.getDate(dt.getTime()).toString()),
                value: dt.valueOf()
            };
        }
        else { xAxis3.labels[i]={ label: '', value: dt.valueOf() }; }
    }

    var xAxis4 = new dojo.charting.Axis();
    xAxis4.range = { lower: -1, upper: actLength };
    xAxis4.origin = "max";
    xAxis4.label = "Hours Exercised By Intensity";
    for(var i=0; i<intensity.length*2; i++)
    {
        if(i<6 && i%2==0){ xAxis4.labels[i]={ label: intensity[i/2].intensity, value: i }; }
        else{ xAxis4.labels[i]={ label: '', value: i }; }
    }

    var min1 = hoursWorked[0].minutes;
    var max1 = max2 = max3 = max4 = min3 = 0;

    for(var i=0; i<hoursWorked.length; i++)
    {
        if(hoursWorked[i].minutes>max1) max1=hoursWorked[i].minutes;
        if(hoursWorked[i].minutes<min1) min1=hoursWorked[i].minutes;
    }
    for(var i=0; i<weights.length; i++)
    {
        if(weights[i].w_metric>max3) max3=weights[i].w_metric;
        if(weights[i].w_metric<min3) min3=weights[i].w_metric;
    }
    if(Math.abs(min3)>max3) max3=Math.abs(min3);
    max1=100*Math.round(0.5+max1/100);
    max2=10*Math.round(0.5+activities[0].minutes/10);     //round to the nearest 100 minutes from the max activity (already sorted as activities[0].minutes is highest value)
    max4=intensity[0].minutes;
    if(intensity[1].minutes>max4){max4=intensity[1].minutes;}
    else if(intensity[2].minutes>max4){max4=intensity[2].minutes;}
    max4=100*Math.round(0.5+max4/100);     //round to the nearest 100 minutes from the max intensity (sorted above)

    var yAxis1 = new dojo.charting.Axis();
    yAxis1.range = { lower: 0, upper: max1 };
    yAxis1.showLines = true;
    yAxis1.showTicks = true;
    yAxis1.label = "Hours";
    for(var i=0; i<=5; i++) { yAxis1.labels[i]={ label: (max1*i/300).toFixed(1).toString(), value: max1*i/5}; }

    var yAxis2 = new dojo.charting.Axis();
    yAxis2.range = { lower: 0, upper: max2 };
    yAxis2.showLines = true;
    yAxis2.showTicks = true;
    yAxis2.label = "Hours";
    for(var i=0; i<=5; i++) { yAxis2.labels[i]={ label: (max2*i/300).toFixed(1).toString(), value: max2*i/5 }; }

    var yAxis3 = new dojo.charting.Axis();
    max3==0 ? yAxis3.range = { lower: -3, upper: 3 } : yAxis3.range = { lower: -(max3*1.5), upper: max3*1.5 };
    yAxis3.showLines = true;
    yAxis3.showTicks = true;
    yAxis3.label = "Percentage";
    if(max3==0)
    {
        yAxis3.labels = [
            { label: '-3%', value: -3 },
            { label: '-2%', value: -2 },
            { label: '-1%', value: -1 },
            { label: '0%', value: 0 },
            { label: '1%', value: 1 },
            { label: '2%', value: 2 },
            { label: '3%', value: 3 }
        ];
    }
    else
    {
        yAxis3.labels = [
            { label: -(max3*150).toFixed(1).toString()+'%', value: -(max3*1.5) },
            { label: -(max3*100).toFixed(1).toString()+'%', value: -(max3) },
            { label: -(max3*50).toFixed(1).toString()+'%', value: -(max3/2) },
            { label: '0%', value: 0 },
            { label: (max3*50).toFixed(1).toString()+'%', value: max3/2 },
            { label: (max3*100).toFixed(1).toString()+'%', value: max3 },
            { label: (max3*150).toFixed(1).toString()+'%', value: max3*1.5 }
        ];
    }

    var yAxis4 = new dojo.charting.Axis();
    yAxis4.range = { lower: 0, upper: max4 };
    yAxis4.showLines = true;
    yAxis4.showTicks = true;
    yAxis4.label = "Hours";
    for(var i=0; i<=5; i++) { yAxis4.labels[i]={ label: (max4*i/300).toFixed(1).toString(), value: max4*i/5 }; }

    var chartPlot1 = new dojo.charting.Plot(xAxis1, yAxis1);
    chartPlot1.addSeries({
        data: timeSeries1,
        plotter: dojo.charting.Plotters.CurvedLine
    });

    var chartPlot2 = new dojo.charting.Plot(xAxis2, yAxis2);
    chartPlot2.addSeries({
        data: timeSeries2,
        plotter: dojo.charting.Plotters.DataBar
    });

    var chartPlot3 = new dojo.charting.Plot(xAxis3, yAxis3);
    chartPlot3.addSeries({
        data: timeSeries3,
        plotter: dojo.charting.Plotters.CurvedLine
    });

    var chartPlot4 = new dojo.charting.Plot(xAxis4, yAxis4);
    chartPlot4.addSeries({
        data: timeSeries4,
        plotter: dojo.charting.Plotters.DataBar
    });

    var chartPlotArea1 = new dojo.charting.PlotArea();
    var chartPlotArea2 = new dojo.charting.PlotArea();
    var chartPlotArea3 = new dojo.charting.PlotArea();
    var chartPlotArea4 = new dojo.charting.PlotArea();

    chartPlotArea1.size = { width: 298, height: 180 };
    chartPlotArea2.size = { width: 298, height: 180 };
    chartPlotArea3.size = { width: 298, height: 180 };
    chartPlotArea4.size = { width: 298, height: 180 };

    chartPlotArea1.padding = { top: 10, right: 20, bottom: 30, left: 50 };
    chartPlotArea2.padding = { top: 10, right: 20, bottom: 30, left: 50 };
    chartPlotArea3.padding = { top: 10, right: 20, bottom: 30, left: 50 };
    chartPlotArea4.padding = { top: 10, right: 20, bottom: 30, left: 50 };

    chartPlotArea1.plots.push(chartPlot1);
    chartPlotArea2.plots.push(chartPlot2);
    chartPlotArea3.plots.push(chartPlot3);
    chartPlotArea4.plots.push(chartPlot4);

    timeSeries1.color = chartPlotArea1.nextColor();
    timeSeries2.color = chartPlotArea2.nextColor();
    timeSeries3.color = chartPlotArea3.nextColor();
    timeSeries4.color = chartPlotArea4.nextColor();

    var chart1 = new dojo.charting.Chart(null, "Weekly workout totals", "This chart shows the number of hours each week that you worked out for the past 8 weeks.");
    var chart2 = new dojo.charting.Chart(null, "Top 3 Activities", "This chart shows the top 3 workout activities that you have entered over time.");
    var chart3 = new dojo.charting.Chart(null, "Weight gain/loss percentages", "This chart shows the weight gain/loss percentages over time as compared to the rest of the site.");
    var chart4 = new dojo.charting.Chart(null, "Light, moderate and vigorous totals", "This chart shows the amount of time that you spend working out in each intensity.");

    chart1.addPlotArea({ x: 10, y: 10, plotArea: chartPlotArea1 });
    chart2.addPlotArea({ x: 10, y: 10, plotArea: chartPlotArea2 });
    chart3.addPlotArea({ x: 10, y: 10, plotArea: chartPlotArea3 });
    chart4.addPlotArea({ x: 10, y: 10, plotArea: chartPlotArea4 });

    dojo.addOnLoad(function()
    {
        chart1.node = dojo.byId("chart1");
        chart2.node = dojo.byId("chart2");
        chart3.node = dojo.byId("chart3");
        chart4.node = dojo.byId("chart4");
        chart1.render();
        chart2.render();
        chart3.render();
        chart4.render();
        for(var i=1; i<=4; i++) { dojo.byId('chart'+i).style.visibility='visible'; }
    });
}
