/*
loadableObjects
charts
*/
$hn.loading = '<img src=\"/images/loading2.gif\" alt=\"loading symbol\" style=\"display: line;\" />';
var $hnuitt = false;
/* add the getElementById function to browsers which don't support it - this is a fix for fusion charts */
if(!document.getElementById){
  if(document.all)
  document.getElementById=function(){
    if(typeof document.all[arguments[0]]!="undefined")
    return document.all[arguments[0]]
    else
    return null
  }
  else if(document.layers)
  document.getElementById=function(){
    if(typeof document[arguments[0]]!="undefined")
    return document[arguments[0]]
    else
    return null
  }
}

/* **** API REQUEST **** */
$hn.callback = function(callback, params) {
    var exec = 'callback(';
                
    if (params) {
        for (var i = 0; i < params.length; i++) {
            if (i > 0) {exec += ',';}
            exec += 'params[' + i + ']';
        }
    }
    exec += ')';
    eval(exec);
}
$hn.responseBreak = function() {};
$hn.apiResponse = function(xml, startTime, api, callback, callbackParams, callbackFailure, callbackFailureParams, json) {
    $hn.responseBreak();
    var elapsed = (new Date().getTime() - startTime);
    var ok = false;
    
    if (json) {
        var ops = eval($(xml).find('json').text());
        if (ops) {
            ok = true;
            for (var i = 0; i < ops.length; i++) { if (ops[i].status.code != '100') { ok = false; break; } }
            xml = ops;
        }
    } else { ok = ($(xml).find('status').attr('code') == '100'); }
    if (ok) {
        if (callback) { callbackParams[callbackParams.length] = xml; $hn.callback(callback, callbackParams); }
    } else {
        if (callbackFailure) { callbackFailureParams[callbackFailureParams.length] = xml; $hn.callback(callbackFailure, callbackFailureParams); }
    }
    if ($hna.pageTracker) { $hna.pageTracker._trackEvent("APIs", "API Request Time Sec", api, elapsed); }
}
$hn.apiRequest = function(api, names, values, callback, callbackParams, callbackFailure, callbackFailureParams, json) {
    json = (json == null)?false:json;
    var startTime = new Date().getTime();
    var postData = { MagicCookie: $hnc.magicCookie, returnJson: json, libraryVersion: 'general2a.js', SourceGID: $hnc.sourceGid, TargetGID: $hnc.targetGid };
    
    for (var i = 0; i < names.length; i++) { postData[names[i]] = values[i]; }
    $.post('http://' + $hnc.host + api, postData, function(xml) { $hn.apiResponse(xml, startTime, api, callback, callbackParams, callbackFailure, callbackFailureParams, json); }, 'xml');
}

$hn.loadFile = function(path) {
    var xmlhttp = window.XMLHttpRequest? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
    var response;
    
    if (xmlhttp) {
        xmlhttp.open('GET', 'http://' + $hnc.host + path, false);
        xmlhttp.setRequestHeader('Connection', 'close');
        xmlhttp.send(null);
        response = xmlhttp.responseText;
    }
    
    return response;
}

/* **** CHARTS **** */
$hn.chartRetrieved = function(chartType, chartId, divId, width, height, optionalParams, response) {
    var div = (divId.jquery?divId:$('#' + divId));
    var graphData = $(response).find('chart')[0];
    var chart = new FusionCharts(chartType, chartId, width, height, "0", "0");
    
    var chartXml, chartXml1;
    
    if (graphData) {
        if (graphData.xml) {
            chartXml = graphData.xml;
        } else {
            // firefox has to serialize the xml node
            // to get the xml that makes up this node
            try {
                var serializer = new XMLSerializer();
                chartXml = serializer.serializeToString(graphData);
            } catch (ex) {
                chartXml = '';
            }
            serializer = null;
        }
        chartXml1 = chartXml;
        chart.setDataXML(escape(chartXml1));
        chart.render(div[0]);
        
        if (typeof($hn.chartRetrievedCallback) != 'undefined') {
            if ($hn.chartRetrievedCallback != null) {
                $hn.chartRetrievedCallback(chartId, response, optionalParams);
            }
        }
    } else {
        div.html('<span class="error">no data is available to graph - sorry</span>');
    }
    
}

$hn.chartNotRetrieved = function() {}
$hn.retrieveChart = function(api, names, values, chartType, chartId, divId, width, height, optionalParams) {
    var div = (divId.jquery?divId:$('#' + divId));
    var override = false;
    if (optionalParams) { optionalParams.isEmpty = false; } else { optionalParams = { "isEmpty" : true }; }
    optionalParams.api = api;
    
    if (div.length > 0) {
        div.html($hn.loading);
        
        flashDetect.detect();
        if (flashDetect.flashInstalled == 2) {
            if (flashDetect.flashVersion >= 8) {
                names[names.length] = 'chartId';
                values[values.length] = chartId;
                $hn.apiRequest(api, names, values, $hn.chartRetrieved, [chartType, chartId, divId, width, height, optionalParams], $hn.chartNotRetrieved, [ divId ], false);
                
            } else {
                div.html('<br /><h1>Adobe Flash Player 8 (or above) Required</h1>To view charts on this website you must have adobe flash player 8 (or above) installed. Please upgrade your version of adobe flash player.<br /><a href=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW\"><img border=\"0\" src=\"http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif\" width=\"112\" height=\"33\" /></a><br /><br />');
                override = true;
            }
        } else {
            div.html('<br /><h1>Adobe Flash Player Required</h1>To view charts on this website you must have adobe flash player installed.<br /><a href=\"http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW\"><img border=\"0\" src=\"http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif\" width=\"112\" height=\"33\" /></a><br /><br />');
            override = true;
        }
        if (override) {
            div.css('border', '1px solid black').css('margin', '5px 5px 5px 5px').css('backgroundColor', '#ffe5b8');
            div.append($('<input type=\"button\" value=\"show anyway\" />').click(function() { $hn.apiRequest(api, names, values, $hn.chartRetrieved, [ chartType, chartId, divId, width, height, optionalParams ], $hn.chartNotRetrieved, [ divId ], false); div.html($hn.loading); div.css('border', '').css('margin', '').css('backgroundColor', ''); }));
        }
    } 
}

$hnlo.list = [];
$hnlo.defineObject = function(objectName, ver, file) {
    $hnlo.list[$hnlo.list.length] = objectName;
    file = (file?file:objectName);
    
    var loader = $('<script type="text/javascript">' + 
    'function ' + objectName + 'Proxy(variableName) {' +
    '    variableName = (variableName)?variableName:\'' + escape(objectName) + '\';' +
    '    var objectCode = $hn.loadFile(\'\/js\/' + file + '.js?ver=' + ver + '\');' +
    '    eval(objectCode);' +
    '    self.' + objectName + 'Proxy = ' + objectName + 'Internal;' +
    '    ' +
    '    return new self.' + objectName + 'Proxy(variableName);' +
    '}' +
    ' var ' + objectName + ' = new Object();' + 
    objectName + '.isReal = function() { return false; }</script>');
    $(document).find('head').append(loader);
}

$hnlo.defineMethod = function(objectName, methodName) { $(document).find('head').append($('<script type="text/javascript">' + objectName + '.' + methodName + ' = function(a1, a2, a3, a4, a5, a6, a7, a8, a9) { var loadableObject = new ' + objectName + 'Proxy(); self.' + objectName + ' = loadableObject; return loadableObject.' + methodName + '(a1, a2, a3, a4, a5, a6, a7, a8, a9); }</script>')); }
$hnlo.cache = function() { for (var i = 0; i < $hnlo.list.length; i++) { eval('var temp = new ' + escape($hnlo.list[i]) + 'Proxy(\'temp\'); temp = null;'); } }

var $hndlo = $hnlo.defineObject;
var $hndlm = $hnlo.defineMethod;

$hndlo('flashDetect', '1.11', 'flashDetect2');
$hndlm('flashDetect', 'detect');
$hndlm('flashDetect', 'load');
$hndlo('ui', '1.67', 'ui2');
$hndlm('ui', 'tooltip');
$hndlm('ui', 'htmlWindow');
$hndlm('ui', 'htmlWindowFromUrl');
$hndlm('ui', 'load');
$hndlm('ui', 'displayFlashScroller');
$hndlm('ui', 'displayFlashImageGallery');
/*
$hndlo('questionnaire', '1.00');
$hndlm('questionnaire', 'display');
$hndlm('questionnaire', 'load');
$hndlo('workflow', '1.00');
$hndlm('workflow', 'displayStatus');
$hndlo('activityPlanner', '1.71');
$hndlm('activityPlanner', 'load');
$hndlm('activityPlanner', 'minutesToTimeLength');
*/
//$hndlm('activityPlanner', 'preprocessItem');  /* just in case */
/*
$hndlo('uiCal', '0.29');
$hndlm('uiCal', 'load');
$hndlm('uiCal', 'getMonthName');
$hndlo('uiLists', '0.22');
$hndlm('uiLists', 'load');
$hndlo('teams', '0.08');
$hndlm('teams', 'initEventsMap');
*/

$(document).ready(function() { if ($hnlo.child) { $hnlo.child(); } if ($hnlo.parent) { $hnlo.parent(); } });

$hn.exists = function(s) { return (eval('typeof(' + s + ')') != 'undefined')?(eval(s + ' != null')?true:false):false; }

$hn.dRound = function(q, d) {
    return (d > 0)?(Math.round(q * Math.pow(10, d)) / Math.pow(10, d)):Math.round(q);
}

/* **** SIDE ITEMS / PANELS **** */
$hn.reg('healthnut.panels.defaults');
$hn.reg('healthnut.dom');
var $hnp = $hn.panels;
var $hnpd = $hnp.defaults;

$hnp.create = function(api, auth, color, classes, div, name) {
    auth = (auth?auth:false);
    if (!color) { color = $hnpd.colors.shift(); $hnpd.colors.push(color); }
    if (!classes) { classes = $hnpd.classes.shift(); $hnpd.classes.push(classes); }
    if (!div) { if ($hnpd.divs.length == 0) { div = false; } else { div = $hnpd.divs.shift(); } }
    name = (name?name:api);
    
    return { api: api, auth: auth, color: color, classes: classes, div: div, status: 0, error: '', callback: false, name: name };
}
$hnp.stack = [];
$hnp.processed = {};
$hnpd.colors = [ 'purple', 'green', 'orange' ];
$hnpd.classes = [ 'standard rsiTop', 'standard rsiMiddle', 'standard rsiBottom' ];
$hnpd.divs = [ 'rsi0', 'rsi1', 'rsi2', 'rsi3', 'rsi4', 'rsi5' ];
$hnpd.subs = [ $hnp.create('/api/rightsideitems/getprofilegaps', true), $hnp.create('/api/rightsideitems/myteamsclubs', true), $hnp.create('/api/rightsideitems/mybusinesses', true)];

$hn.serialize = function(xmlNode) {
    var data = '';
    if (!$hn.dom.serializeXml) { if (xmlNode) { if (xmlNode.xml) { data = xmlNode.xml; } else { $hn.dom.serializeXml = true; } } }
    if ($hn.dom.serializeXml) { try { var s = new XMLSerializer(); data = s.serializeToString(xmlNode); } catch(ex) { data = ''; } }
    return data;
}

$hnp.retrieved = function(name, xml) {
    var panel = $hnp.processed[name];
    panel.status = 3;
    panel.htmlNodes = $(xml).find('html');
    panel.scriptNodes = $(xml).find('script');
    panel.element = $('#' + panel.div);
    
    if (panel.element.length == 1) {
        panel.htmlNodes.each(function() { var s = $hn.serialize($(this).children()[0]).replace(/^\s+|\s+$/g, ''); (s.length>0)?panel.element.append($(s)):s=''; });
        panel.scriptNodes.each(function() { $(document).find('body').append($($hn.serialize($(this)[0]))); });
        if (panel.callback) { panel.status = 4; panel.callback(name); }
        panel.status = 5;
        
    } else { panel.error = 'the specified div could not be found'; }
}

$hnp.process = function() {
    var panel = $hnp.stack.shift();
    if (!panel) { panel = $hnpd.subs.shift(); }
    
    while (panel) {
        /* process this panel */
        $hnp.processed[panel.name] = panel;
        panel.status = 1;
        
        if((panel.auth && $hnc.userId > 0) || (!panel.auth)) {
            if (panel.div) {
                panel.names = [ 'color', 'class', 'name' ];
                panel.values = [ panel.color, panel.classes, panel.name ];
                panel.status = 2;
                $hn.apiRequest(panel.api, panel.names, panel.values, $hnp.retrieved, [ panel.name ], null, [], false);
            } else { panel.error = 'this panel has no available div to use'; }
        } else { panel.error = 'this panel is only available to logged in users'; }
        
        /* get the next panel */
        panel = $hnp.stack.shift();
        if (!panel) { panel = $hnpd.subs.shift(); }
    }
}

/* **** Feedback **** */
$hn.sendFeedback = function() {
    var feedback = $('#feedback').val();
    var status = false;
    var noFeedback = 'You must supply some feedback before sending it!';

    if (feedback != 'Your Feedback' && feedback != noFeedback && feedback != '' && feedback.replace(/ /g, '') != '') {    
        $hn.apiRequest('/api/tickets/createfeedbackticket', [ 'feedback' ], [ feedback ], $hn.feedbackSent, [], null, null, true);
        status = 'sending...';
    } else { status = noFeedback; }
    $('#feedback').val(status);
}

$hn.feedbackSent = function(json) { $('#feedback').val('Thank You for your feedback!'); }

/* **** Pre jQuery Compatibility Section **** */
/* getElement */ function gE(e) { return document.getElementById(e); }
/* optionValue */ function oV(e) { return gE(e).options[gE(e).selectedIndex].value; }
/* createElement */ function cE(e) { return document.createElement(e); }
function apiRequest(a1, a2, a3, a4, a5, a6, a7, a8) { $hn.apiRequest(a1, a2, a3, a4, a5, a6, a7, a8); }
function kill(id) { $('#' + id).remove(); }
var h_lt = $hn._lt; var h_gt = $hn._gt; var h_amp = $hn._amp;

/* **** tabs *** */
$hn.reg('healthnut.tabs');
var $hnt = $hn.tabs;

$hnt.createSettings = function(normalBgcolor, mouseoverBgcolor, selectedBgcolor) {
    return { 'normal-css' : { 'background-color' : normalBgcolor }, 'mouseover-css' : { 'background-color' : mouseoverBgcolor }, 'selected-css' : { 'background-color' : selectedBgcolor }, 'sticky-states' : { 'normal' : true, 'selected' : true} };
}

$hnt.register = function(setId, tabId, elementId, settings, state) {
    if (!$hnt.sets) { $hnt.sets = {}; }
    if (!$hnt.sets[setId]) { $hnt.sets[setId] = {}; }
    $hnt.sets[setId][tabId] = settings;
    $hnt.sets[setId][tabId]['element'] = { 'id' : elementId, 'selected' : '', 'normal' : 'none' };
    $hnt.applyState(setId, tabId, state);
    
    var tab = $('#' + tabId)[0];
    tab.onmouseover = function() { $hnt.applyState(setId, tabId, 'mouseover'); };
}

$hnt.applyState = function(setId, tabId, state) {
    var tab = $('#' + tabId)[0];
    for (var css in $hnt.sets[setId][tabId][state + '-css']) { $('#' + tabId).css(css, $hnt.sets[setId][tabId][state + '-css'][css]); }
    if ($hnt.sets[setId][tabId]['element'][state]) { $('#' + $hnt.sets[setId][tabId]['element']['id']).css('display', $hnt.sets[setId][tabId]['element'][state]); }
    if ($hnt.sets[setId][tabId]['sticky-states'][state]) {
        tab.onmouseout = function() { $hnt.applyState(setId, tabId, $hnt.sets[setId][tabId]['state']); }
    }
}

$hn.reg('healthnut.facebook');
var $hnfb = $hn.facebook;
$hnfb.userId = false;
$hnfb.connectedTriggered = false;
$hnfb.notConnectedTriggered = false;

$hnfb.connected = function(fbUserId) {
    if (!$hnfb.connectedTriggered) {
        $hnfb.connectedTriggered = true;
        $hnfb.fbUserId = fbUserId;
        
        $('#fbConnect').html('');
        $hnfb.userId = fbUserId;
        
        if ($hnc.userId > 0) {  }
    }
    return true;
}
$hnfb.notConnected = function() {
    if (!$hnfb.notConnectedTriggered) {
        $hnfb.notConnectedTriggered = true;
        FB_RequireFeatures(["XFBML"], function() {
            FB.XFBML.Host.addElement(new FB.XFBML.LoginButton($('#fbConnect')[0]));
        });
    }
    
    return true;
}
/* $hnfb.newConnection = function(x) { $hnfb.x = x; alert(x); } */

$hnfb.init = function() {
    FB_RequireFeatures(["Connect"], function() {
        FB.init("3420b9ea0c79c0087dfa8be13c3df355", "/hnmain/xd_receiver.htm");
        FB.Connect.ifUserConnected($hnfb.connected, $hnfb.notConnected);
    });
}

/* $(document).ready($hnfb.init); */
