/* GLOBALS */
var response_count=0;
var logged_in;
var loggedout_sessions;
var attempted_user_action;
var error_set = true;
var webServiceURL = appURL + '/ajax.php?s='+Site;
var checkboxType = "image";

var display_prefix = "session";
var display_suffix = "list";

var arrowCoords = new Object;
var tooltipAddCoords = new Object;
var tooltipRemoveCoords = new Object;

var working_div;
var working_div2;

var loader;

var session_cookie;

// MooScroll reference.
//var mooScroll = new MooScroll();

//This variable indicates track information is displayed
var track_info = 0;

var Images = {
    btn_addToSchedule : imageURL + '/btn_addToSchedule.gif',
    load : imageURL + '/load.gif'
}

function log(message) {
    try {
        console.log(message);
    } catch (e) {}
        
}


window.onbeforeunload = function(e){
    var sessions = session_cookie.get('sessions');
    var user_id = session_cookie.get('user_id');
    if (!user_id && sessions.length>0) {
        return "You have not saved your schedule.";
    }
}

window.addEvent('domready', function(){
    session_cookie = new Hash.Cookie('scheduler_session',{duration:false});
    session_cookie.load();
    sessions = session_cookie.get("sessions");
    if (sessions) {
        sessions.each(function(id) {
            var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
            $('user_sessions').appendChild(saved_session_input);
        });
    }   
    $$('.bottom-tabs.active').each(function(item){
        display_suffix = item.get("id").replace(/-view/, "");
    });
    
    Shadowbox.init({animate: false, enableKeys:false});
      
    loader = "<center><img src='http://"+httpHost+"/img/default/load.gif' title='Loading...'/></center>";
    
   // mooScroll = new MooScroll({selector:'.scrollable', handleActiveOpacity:1});         
    
    $$('.button').each(function(item){
        var rightEdge = new Element('div', {
            'class': 'button-right-edge'});
        rightEdge.inject(item, "bottom");
    });

    
    $('tooltip-arrow-up').setStyle("visibility", "hidden");
    $('tooltip-arrow-up').setStyle("display", "block");
    arrowCoords = $("tooltip-arrow-up").getCoordinates();
    $('tooltip-arrow-up').setStyle("display", "none");
    $('tooltip-arrow-up').setStyle("visibility", "visible");

    refreshPage();

    var form = document.getElementById('session_search');
    form.onkeydown = function(e) {
        e = e || window.event;
        if (e.keyCode == 13) {
            document.getElementById('search_string').value=document.getElementById('search_field').value;
            getSessions();
            return false;
        }
    };

    checkLogin();

});

var timeout_queue = {
    queue : [],
    timeout : false,
    running : false,
        
    start : function() {
        this.running = true;
        this.shift();
    },
        
    push : function(params) {
        this.queue.push(params);
    },
        
    shift : function() {
        if (this.queue.length == 0) {
            this.running = false;
            return;
        }
        if (this.timeout) {
            clearTimeout(this.timeout);
        }
        func_plus_args = this.queue.shift();
        func = func_plus_args.func;
        args = func_plus_args.args;
        time = func_plus_args.time;
        func(args);
        this.timeout = setTimeout("timeout_queue.shift()", time);
    },
    
    clear : function() {
        if (this.timeout) {
            clearTimeout(this.timeout);
        }
        this.running = false;
        this.queue = [];
    }
}

var ellipses;
function addEllipses() {
    ellipses = $$('.ellipsis');
    //addEllipsis(0);
    
    $$('.ellipsis').each(function(item){    
    });
}

/**
 * @param id
 * @return
 */
function disable(id) {
    if (!$(id)) {
        return;
    }
    var element =  $(id);
    if (element.get('tag') == 'a') {
        if($(id+"-disabled")) {
            element.setStyle("display", "none");
            $(id+"-disabled").setStyle("display", "block");
        } else {
            var elementCopy = element.clone(true, true);
            elementCopy.removeClass('active');
            elementCopy.removeClass('inactive');
            elementCopy.addClass('disabled');
            elementCopy.setProperty('id', id+"-disabled");
            elementCopy.setProperty('onclick', 'return false;');
            element.setStyle("display", "none");
            elementCopy.inject(element, 'before');
        }
        return;
    }
    if (element.getElement('.disabler')) {
        return;
    }
    var disabler = new Element('div', {
        'id': id+'-disabler',
        'class': 'disabler'
    });
    disabler.inject(element, 'top');
}

function enable(id) {
    if (!$(id)) {
        return;
    }
    var element =  $(id);
    if (element.get('tag') == 'a') {
        element.setStyle("display", "block");
        $(id+"-disabled").setStyle("display", "none");
        return;
    }
    var removeElement = element.getElement('.disabler');
    if (!removeElement) {
        return;
    }
    removeElement.dispose();
}

/**
 * @return
 */
function truncate_speakers(from) {
    if (!from) {
        from = $("list");
    }
    if (display_suffix == "list") {
        working_div.addClass("speakers-display-list");
        working_div2.addClass("speakers-display-list");
        working_div.removeClass("speakers-display-calendar");
        working_div2.removeClass("speakers-display-calendar");
    } else {
        working_div.removeClass("speakers-display-list");
        working_div2.removeClass("speakers-display-list");
        working_div.addClass("speakers-display-calendar");
        working_div2.addClass("speakers-display-calendar");
    }
    from.getElements('.speakers-display').each(function(speakerdiv) {
        timeout_queue.push({func : truncate_speakers_text, args : {speakerdiv : speakerdiv}, time : 2});
    });
    timeout_queue.start();
}

/**
 * @param object args
 * @return
 */
function truncate_speakers_text(args) {
        
        var speakerdiv = args.speakerdiv;
        var html = speakerdiv.get('html');
        var anchors_reg = new RegExp("<a[^>]*>[^<]*</a>", "gi");
        anchors = html.match(anchors_reg);
        working_div2.set('html', html);
        var coordinates = working_div2.getScrollSize();
        var width = coordinates.x;
        var parent = speakerdiv.getParent();
        var parentCoordinates = parent.getCoordinates();
        var parentWidth = parentCoordinates.width;
        var target_width = parentWidth-20;
        if (width<target_width) {
            speakerdiv.setStyle("display", "block");
            return;
        }
        var contents = "";
        if (anchors) {
            for (x=0; x<anchors.length; x++) {
            
                if (x == anchors.length-2) {
                    more = " and ";
                } else if (x == anchors.length-1) {
                    more = "";
                } else {
                    more = ", ";
                }
                working_div.set('html', contents + anchors[x] + more);
                var working_div_coords = working_div.getScrollSize();
                working_div_width = working_div_coords.x;
                if (working_div_width < target_width) {
                    contents += anchors[x] + more;
                } else {
                    link_regexp = new RegExp("(<a[^>]*>)([^<]*)", "i");
                    inside_link = link_regexp.exec(anchors[x]); 
                    link = inside_link[1];
                    text = inside_link[2];
                    contents += link+truncate_text_by_word(contents, text, target_width)+"</a>...";
                    break;
                }
            }
        } else {
            contents = truncate_text_by_word("", html, target_width)+"...";
        }
        speakerdiv.set('html', contents);
        speakerdiv.setStyle("visibility", "visible");

        speakerdiv.setStyle("display", "block");
}

function truncate_text_by_word(start_text, questionable_text, target_width) {
    add_text = "";
    var tokens = questionable_text.split(" ");
    for (y=0; y<tokens.length; y++) {
        
        working_div.set('html', start_text + add_text + " " + tokens[y]);
        var working_div_coords = working_div.getScrollSize();
        working_div_width = working_div_coords.x;
        if (working_div_width < target_width) {
            add_text += " "+tokens[y];
        } else {
            add_text += truncate_text_by_char(start_text+add_text, " "+tokens[y], target_width)
            break;
        }
    }
    return add_text;
}

function truncate_text_by_char(start_text, questionable_text, target_width) {
    add_chars = "";
    for (z=0; z<questionable_text.length; z++) {
        this_char = questionable_text.charAt(z);
        working_div.set('html', start_text + add_chars + this_char);
        var working_div_coords = working_div.getScrollSize();
        working_div_width = working_div_coords.x;
        if (working_div_width < target_width) {
            add_chars += this_char;
        } else {
            break;
        }
    }
    return add_chars;
}
/**
 * @return
 */
function popup_remove_conditional() {
    if ($('sb_player')) {
        Shadowbox.close();
    }
}

/**
 * @param string title
 * @param string url
 * @param Object params
 * @return void
 */
function popup_show_conditional(title, theurl, params) {

    if (params) {
        if (typeof params == "string") {
            theurl += params;
        } else {
            for (field in params) {
                theurl += "&"+field+"="+params[field];
            }
        }
    }
    if ($('sb-player')) {
        
        var req = new Request.HTML({
            url : theurl,
            onSuccess : function(responseTree, responseElements, responseHTML) {
                Shadowbox.skin.dynamicResize(params.width, params.height);

                popup_change_content(title, responseHTML);
            }
        });
        req.get();
    } else {

        var req = new Request.HTML({
            url : theurl,
            onSuccess : function(responseTree, responseElements, responseHTML) {

                Shadowbox.open({
                    content:    responseHTML,
                    player:     "html",
                    title:      title,
                    height:     params.height,
                    width:      params.width
                    
                });
                $("sb-nav-close").set("html", "close");
            }
        });
        req.get();

        
        /*TB_show(title, url);  */
    }
}

/**
 * 
 * @return
 */
function popup_change_content(title, content) {

    $("sb-title-inner").set("html", title);
    var windowContent = "<div id='TB_ajaxContent'>"
    windowContent += content;
    windowContent += "</div>";
    $('sb-player').innerHTML = windowContent;
}

function popup_close() {
    Shadowbox.close();
}

/**
 * @return int
 */
function getScrollTop() {
    var ScrollTop = document.body.scrollTop;
    if (ScrollTop == 0)
    {
        if (window.pageYOffset)
            ScrollTop = window.pageYOffset;
        else
            ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
    }
    return ScrollTop;
}


function showSessionDescription(linkObj, session_id, cid) {
    
    if($('list').get("class") == "list_permalinks") {
        return false;
    }
    
    hideTooltip();
    var linkName = $(linkObj).id;
    var linkCoords = $(linkObj).getCoordinates();
    
    var json = null;
    if(cid == null) {
        json = {'session_id':session_id, 'action':'get_session_description'};
    } else {
        json = {'session_id':session_id, 'action':'get_session_description', 'cid': cid};
    }
    // log(json);
    
    
    jsonRequest(webServiceURL, function(data) {
        showTooltip(data.session_description, linkCoords);
        appendDebugData(data.debug_data);
    }, json);
}

/*
 * Append track description
 */
function appendTrackDescription(track_id) {
    /*
     * the application is displaying track information
     */
    track_info = 1;
    $('description_topic').setStyle("display", "block");
    jsonRequest(webServiceURL, function(data) {
        showTrackDescription(data.track_description);
        appendDebugData(data.debug_data);
    }, {'track_id':track_id, 'action':'get_track_description'});
}

/*
 * Set track description element
 */
function showTrackDescription(content) {
    $('description_topic').innerHTML = content;
}


/*
 * Append session description
 */
function appendSessionDescription(session_id, cid) {
    $('list').addClass('list_permalinks');
    $('session_wrapper').setStyle("display", "block");
    $('session_info').set("html", "");
    $('speakers_info').set("html", "");
    
    if(cid == null) {
        json = {'session_id':session_id, 'action':'get_session_description'};
    } else {
        json = {'session_id':session_id, 'action':'get_session_description', 'cid': cid};
    }
    // log(json);
    
    jsonRequest(webServiceURL, function(data) {
        showSessionInformation(data.session_description);
        appendDebugData(data.debug_data);
    }, json);
}

/**
 * @param string content
 */
function showSessionInformation(content) {
    $('session_info').innerHTML = content;
    
    sharing();
}

function showSpeakerDescription(linkObj, speaker_id) {
    hideTooltip();
    var linkName = $(linkObj).id;
    var linkCoords = $(linkObj).getCoordinates();
    
    jsonRequest(webServiceURL, function(data) {
        
        showTooltip(data.speaker_description, linkCoords);
        appendDebugData(data.debug_data);
    }, {'speaker_id':speaker_id, 'action':'get_speaker_description'});
}

/**
 * @param string content
 * @param object sourceCoords a mootools coordinates object
 * @return void
 */

function showTooltip(content, sourceCoords) {

    $('tooltip_content').innerHTML = content;               
    var tooltip = $("tooltip_smarthbox");
    tooltip.setStyle("display", "block");
    tooltip.setStyle("position", "absolute");
    var tooltipCoords = tooltip.getCoordinates();
    var scheduleBuilderCoords = $('ScheduleBuilder-application').getCoordinates();
    var tooltipLeft = Math.round(((scheduleBuilderCoords.width/2) - (tooltipCoords.width/2)) + scheduleBuilderCoords.left);
    
    //where tooltip should be placed, based on coords of link clicked, assume tooltip UP
    var tooltipTop =  sourceCoords.top - tooltipCoords.height - arrowCoords.height;
    var scrollTop = getScrollTop();
    var arrowTop = (sourceCoords.top - arrowCoords.height -3);
    var arrowName = 'tooltip-arrow-up';
    if (scrollTop > tooltipTop) {
        tooltipTop = (sourceCoords.bottom + arrowCoords.height);
        arrowName = 'tooltip-arrow-down';
        arrowTop = sourceCoords.bottom + 3;
    }
    tooltip.setStyle("top", tooltipTop);
    var arrowLeft = sourceCoords.left + Math.round(sourceCoords.width/2);
    if (arrowLeft > tooltipLeft + tooltipCoords.width - arrowCoords.width) {
        arrowLeft = tooltipLeft + tooltipCoords.width - arrowCoords.width - 3;
    } else if (arrowLeft < tooltipLeft) {
        tooltipLeft = arrowLeft - 50;
    }
    tooltip.setStyle("left", tooltipLeft);
    $(arrowName).setStyle("left", arrowLeft);
    $(arrowName).setStyle("top", arrowTop);
    $(arrowName).setStyle("display", "block");
    
    sharing();
    
}

function sharing() {
    /*
     * Twitter 
     */
    twitter();
    
    /*
     * Google+1 
     */
    google();
    
    /*
     * Facebook
     */
    facebook();
}



function twitter() {
    var twitterScript = document.createElement('script');
    twitterScript.type = 'text/javascript';
    twitterScript.src = 'http://platform.twitter.com/widgets.js';
    $('sharing').grab(twitterScript);
}

function facebook () {
    window.fbAsyncInit = function() {
        FB.init({
            appId: '225395940822812', 
            status: true, 
            cookie: true,
            xfbml: true
        });
    };
    (function() {
        var e = document.createElement('script');
        e.type = 'text/javascript';
        e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
        e.async = true;
        document.getElementById('fb-root').appendChild(e);
        log(e);
        
    }());
}

function google() {
    var googleScript = document.createElement('script');
    googleScript.type = 'text/javascript';
    googleScript.src = 'https://apis.google.com/js/plusone.js';
    $('sharing').grab(googleScript);
}



function appendSpeakerDescription(speaker_id) {
    
    jsonRequest(webServiceURL, function(data) {
        showSpeakerInformation(data.speaker_description);
        appendDebugData(data.debug_data);
    }, {'speaker_id':speaker_id, 'action':'get_speaker_description'});
}

function showSpeakerInformation(content) {
    var speaker = new Element('div');
    speaker.set("id", "speaker");
    speaker.innerHTML = content;
    
    $('speakers_info').adopt(speaker);
}

/**
 * @return void
 */
function hideTooltip() {
    $$("._smarthbox").setStyle("display", "none");
    $('tooltip-arrow-up').setStyle("display", "none");
    $('tooltip-arrow-down').setStyle("display", "none");
}

function showSmallTooltip(sourceObj, html) {
    var source = $(sourceObj);
    var sourceCoords = source.getCoordinates();
    var sourcePos = source.getPosition();
    var top = sourcePos.y;
    var left = sourcePos.x;

    tooltip  = $('tooltip-small');
    tooltip.innerHTML=html;
    tooltip.setStyle("display", "block");
    var tooltipCoords = tooltip.getCoordinates($('ScheduleBuilder-application'));
    height = tooltipCoords.height;
    width = tooltipCoords.width;

    
    // @TODO FIGURE OUT HOW TO GENERALIZE THIS
    //if (adjustLeft==undefined) { // a kludge. Can't figure out why this is necessary
        var adjustLeft = 0;
    //}
    
    var adjustTop = 8;
    
    tooltip.setStyle("top", top - adjustTop - height);
    tooltip.setStyle("left", left - adjustLeft + (sourceCoords.width/2) - (width/2));
    tooltip.setStyle("display", "block");
    
    var arrow = $('tooltip-small-arrow');
    arrow.setStyle("top", top - adjustTop - 1);
    arrow.setStyle("left", left - adjustLeft + (sourceCoords.width/2) - 5);
    arrow.setStyle("display", "block");
}

function hideSmallTooltip() {
    $('tooltip-small').setStyle("display", "none");
    $('tooltip-small-arrow').setStyle("display", "none");
}

/**
 * @param checkboxObj
 * @return
 */
function showAddTooltip(checkboxObj) {
    var checkboxDiv = $(checkboxObj);
    var checkbox = checkboxDiv.getChildren()[0];
    if (checkbox.checked) {
        html = "Remove from my schedule";
    } else {
        html = "Add to my schedule";
    }
    showSmallTooltip(checkboxObj, html);
}

/**
 * @return void
 */
function hideAddTooltip() {
    hideSmallTooltip();
}

/**
 * @param LinkObject link
 */
function activate(link) {
    if (!$(link).hasClass("inactive")) {
        return false;
    }
    var reg = /[^\s]*/;
    var classNames = $(link).className;
    var mainClass = reg.exec(classNames);
    //link.removeClass("inactive");
    var siblingLinks = $$('.'+mainClass);
    siblingLinks.each(function(item) {
        item.removeClass("active");
        if (!item.hasClass("inactive")) {
            item.addClass("inactive");
        }
    });
    $(link).addClass("active");
    $(link).removeClass("inactive");
}


function toggleActive(link) {
    if (link.hasClass("active")=="true") {
        link.removeClass("active");
        link.addClass("inactive");
        return false;   
    }
    link.addClass("active");
    link.removeClass("inactive");
    return true;
}

/**
 * @param string prefix
 * @param string suffix
 * @param object callbackParams
 * @return void
 */
function setDisplay(prefix, suffix, callbackParams) {
    
    resetView();
    
    
    if (prefix) {
        if (prefix=='speaker') {
            //collapse("filters");
            //disable('filters-wrapper');
            disable('calendar-view');
            //disable('days-wrapper');
            activate("list-view");
            setDisplay(false, 'list');
        } else if (display_prefix=='speaker'){
            enable('filters-wrapper');
            enable('calendar-view');
            enable('days-wrapper');
        }
        
        if (prefix == "user") {
            link_prefix = "session";
        } else {
            link_prefix = prefix;
        }
        
        $$(".filter .check a").each(function(item){
            href = item.href.replace(/speakers|sessions/, link_prefix+"s");
            item.href = href;
        });
        
        
        display_prefix = prefix;
        
    }
    if (suffix) {
        display_suffix = suffix;
    }
    
    getSessions();
}

/**
 * @param int speakerId
 * @return
 */
function showHideSpeakerSessions(speakerId) {
    toggleActive($('speaker-list-item-'+speakerId).getElements(".speaker-container"));
    if (toggleActive($('speaker-list-item-'+speakerId).getElements(".speaker-sessions-button"))) {
        $('speaker-list-item-'+speakerId).getElements(".speaker-sessions").set("html", loader);
        var params = {action:'get_speaker_sessions_list', speaker_id:speakerId, filters:getFilters()};
        var onResponseReceived = function(data) {
            $("speaker-sessions-"+speakerId).set("html", data.list+"<div style='clear:both;height:1px;'></div>");
            //$("speaker-sessions-"+speakerId).setStyle("display", "block");
            //truncate_speakers($("speaker-sessions-"+speakerId));
            //if (Browser.Engine.name == "gecko" || Browser.Engine.name=="unknown") {
            //  addEllipses();
            //}
        };
        jsonRequest(webServiceURL, onResponseReceived, params); 
    } else {
        //$("speaker-sessions-"+speakerId).setStyle("display", "none");
    }
}


var showSpeaker = function(callbackParams) {
    var link = $$("#speaker-list-item-"+callbackParams.speaker_id+" .speaker-name")[0];
    showSpeakerDescription(link, callbackParams.speaker_id);
    var y = link.getPosition().y;
    window.scrollTo(0, y)
}

/**
 * @param speaker_id
 * @return
 */
function openSpeaker(speaker_id) {
    activate($("tab-speaker"));
    if ($('speaker-list-item-'+speaker_id)) {
        showSpeaker({speaker_id:speaker_id});
    } else {
        clearSearchField();
        setDisplay("speaker", false, {callback:showSpeaker, speaker_id:speaker_id});
    }
}


/**
 * @return void
 */
function clearSearchField() {
    $('search_field').set('value', ''); 
    $('search_string').set('value', '');
}

/**
 * @param name
 * @return void
 */
function expandCollapse(name) {
    var displayExpanded = $(name+'-expanded').getStyle('display');
    if (displayExpanded == "none") {
        expand(name);
    } else {
        collapse(name);
    }
}


function expand(name) {
    $(name+"-expanded").setStyle("display", "block");
    $(name+"-collapsed").setStyle("display", "none");
}

function collapse(name) {
    $(name+"-expanded").setStyle("display", "none");
    $(name+"-collapsed").setStyle("display", "block");
}

function setCheckbox(container, OK) {
    if (!OK) {
        return false;
    }
    
    var checkboxDiv = $(container);
    var checkbox = checkboxDiv.getChildren()[0];
    if (checkbox.checked) {
        checkboxDiv.set("class", checkboxDiv.className.replace(/\schecked/, " unchecked"));
        checkbox.set("checked", false);
    } else {
        checkboxDiv.set("class", checkboxDiv.className.replace(/unchecked/, "checked"));
        checkbox.set("checked", true);
    }
}

/**
 * @param string className
 * @param boolean select true=select all  false=deselect all
 * @return void
 */
function selectDeselectCheckboxes(className, select) {
    var checkboxes = $$('.'+className+"_checkbox");
    var checkbox_wrappers = $$("."+className+"_checkbox_wrapper");
    if (select) {
        checkboxes.set('checked', true);
        checkbox_wrappers.each(function(checkbox_wrapper) {
            checkbox_wrapper.set("class", checkbox_wrapper.className.replace(/unchecked/, "checked"));
        });
    } else {
        checkboxes.set('checked', false);
        checkbox_wrappers.each(function(checkbox_wrapper) {
            checkbox_wrapper.set("class", checkbox_wrapper.className.replace(/\schecked/, " unchecked"));
        });
    }
}

/**
 * 
 */
Array.prototype.in_array = function (value) {
    for (var i=0; i < this.length; i++) {
        if (this[i] == value) {
            return true;
        }
    }
    return false;
}


/**
 * Finds selected items in filters
 * @return Object
 */
function getFilters() {
    var filters = new Object();

    $$('.filter').each(function(item){
        var name = item.id.replace("filter-", "");
        filters[name] = getFilter(name);
    });
    return filters;
}


function getFilter(name) {
    var filteritems = new Array();
    $$('input.'+name+'_checkbox').each ( function(item) {
        if (item.checked) {
            values = item.value.split(",");
            for (i=0; i<values.length; i++) {
                filteritems.push(values[i]);
            }
        } 
    });
//  log(filteritems);
    return filteritems;
}


/**
 * @param object callbackParams
 * @return void
 */
function getSessions(optionParams) {
    hideTooltip();
    
    $$('.user-options').each(function (item) {
        $(item).setStyle("display", "none");
    });
    if ($('user-options-'+display_prefix)) {
        $('user-options-'+display_prefix).setStyle("display", "block");
    }

    if(track_info) {
        track_info = 0;
    } else {
        /*
         * Hide track description to display the reqeusted elements
         */
        $('description_topic').setStyle("display", "none");
    }

    var additional_params = getAdditionalParams();
    
    var my_id=++response_count;

    $('list').innerHTML = loader;

    var filters = getFilters();

    var params = {
        sessions:'',
        'filters':filters,
        'search_string': $('search_string') ? $('search_string').value : '',
        'search_by': $('search_by').value,
        'order_by': $('sort_by') ? $('sort_by').value : '',
        'filter_by_day': $('filter_by_day') ? $('filter_by_day').value : '',
        'filter_by_time': $('filter_by_time') ? $('filter_by_time').value : ''
    }; 
    if (optionParams) {
        for (x in optionParams) {
            params[x] = optionParams[x];
        };  
    }
    
    if (additional_params) {
        for (x in additional_params) {
            params[x] = additional_params[x];
        }
    }
    
    var action = 'get_' + display_prefix + "_" + display_suffix;
    var url = webServiceURL + '&action=' + action;
    var defaultResponseReceived = function(data) {

        if (my_id==response_count) {
            timeout_queue.clear();
            $('list').innerHTML=data.list;
            
            if (data.header) {
                $('list-header-wrapper').innerHTML=data.header;
                $('list-header-wrapper').setStyle("display", "block");
                
                //Checks if session details is currently displayied
                if($('list').get("class") == "list_permalinks") {
                    $('list-header-wrapper').innerHTML = "";
                    $('list-header-wrapper').setStyle("height", "20px");
                }
            } else {
                $('list-header-wrapper').setStyle("display", "none");
            }
            
            appendDebugData(data.debug_data);
            
            
            
            //mooScroll.refresh();
        }       
    };

    /**
     * Callback for "get_speaker_list".
     */
    var speakerResponseReceived = function(data) {
        defaultResponseReceived(data);
        
        // Only show sessions for one speaker. This covers the case for one speaker search.
        if ($$('.speaker-sessions-button').length == 1) {
            var speakerId = ($$('.speaker-sessions-button')[0].id).substring('speaker-sessions-button-'.length);
            showHideSpeakerSessions(speakerId);
        }
        
    };
        
    // This is for the case if user is searching on a specific speaker. Response should have
    // all sessions showing.
    var onResponseReceived = (action == 'get_speaker_list') ? speakerResponseReceived : defaultResponseReceived;    
    jsonRequest(url, onResponseReceived, params);  
}

/**
 * @param debug_data
 * @return void
 */
function appendDebugData(debug_data) {
    //$('debug').innerHTML=$('debug').innerHTML+debug_data;
    
}

/**
 * @return void
 */
function refreshPage() {

        
    if (cid != null || cid.length != 0) {
        var optionParams = {
            'cid':cid
        }; 
    }
    
    getSessions(optionParams);

    addCookieToForm();
    
}



function chooseScheduleConflictAction() {
    
    var action = $('schedule-action').value;
    if (action=="append_user_sessions" || action=="replace_user_sessions") {
        reconcileConflictingUserSessions(action);
    } else {
        getSessions();
    }
    if (attempted_user_action != undefined) {
        eval(attempted_user_action);
    } else { 
        popup_close();
    }
}

/**
 * @return void
 */
function reconcileConflictingUserSessions(action) {
    var saved_sessions_array = new Array();
    $$('input.saved_user_session').each (function(saved_session) {
            saved_sessions_array.push(saved_session.value); 
    });
    //session_cookie = new Hash.Cookie('scheduler_session',{duration:false});
    var params = {
            action:action, 
            sessions:saved_sessions_array, 
            user_id:session_cookie.get('user_id'),
            user_key:session_cookie.get('user_key')
        };
    jsonRequest(webServiceURL, function(data) {
        addCookieToForm(); 

        getSessions();
}, params);  
}

/**
 * @return void
 */
function replaceUserSessions() {
        var saved_sessions_array=new Array();
        $$('input.saved_user_session').each (function(saved_session) {
                        saved_sessions_array.push(saved_session.value);
        });
        //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
        var params = {'sessions':saved_sessions_array, 'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')};
        jsonRequest(webServiceURL + '&action=replace_user_sessions', function(data) {
                addCookieToForm();

                getSessions();
}, params);
}



/**
 * @return void
 */
function popup_email_window() {


    //var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    var user_id=session_cookie.get('user_id');
    if (user_id) {
        popup_show_conditional(resourceBundle['emailPopup_title'], webServiceURL, {'width':emailPopup.width, 'height':emailPopup.height, action:'show_popup', popup_type:'email'});
        
        var now = new Date();

        try {
            //document.images.captcha.src = appURL+'/captcha.jpg?' + now.getTime();
            //document.getElementById('email_schedule_security_code').value="";
            document.getElementById('email_results').innerHTML='';
            document.getElementById('email_schedule_security_code').value="";
            document.getElementById('email_schedule_from').value="";
            document.getElementById('email_schedule_from_name').value="";
            document.getElementById('email_schedule_recipients').value="";
        }
        catch (e) {
            //alert(e);
        }
    }
    else {
        popup_login('popup_email_window()');
    }
}


/**
 * @param user_id
 * @return void
 */
function emailSchedule(user_id) {


        var emailResults = $('email_results');
        var fromEmail = $('email_schedule_recipients');
        var sendToEmail = $('email_schedule_from');
        var sendBtn = $('my_schedule_send');
        if ($('email_message')) {
            var email_message = $('email_message').get("html");
        } else {
            var email_message;
        }

    // Validate from email.
    var fromEmailValidated = validateEmailSchedule(fromEmail.value);
    
    if (!fromEmailValidated['validated']) {
        emailResults.innerHTML = '<span class="emailErrorText">' + fromEmailValidated['error'] + '</span>';
        return;
    }
    
    // Check if send to email addresses exist.
    if (!sendToEmail.value || sendToEmail.value == '') {
        emailResults.innerHTML = '<span class="emailErrorText">Please enter email addresses to send.</span>';
        return;
    }
    
    // Validate each send to email addresses.
    var sendToEmailAddys = sendToEmail.value.split(',');
    for (var i = 0; i < sendToEmailAddys.length; i++) {
        var sendToEmailValidated = validateEmailSchedule(sendToEmailAddys[i]);
        if (!sendToEmailValidated['validated']) {
            emailResults.innerHTML = '<span class="emailErrorText">' + sendToEmailValidated['error'] + '</span>';
            return;         
        }
    }
    
    //var session_cookie = new Hash.Cookie('scheduler_session',{duration:false});
    user_id = session_cookie.get('user_id');
    mail_data = new Hash();
    $$('input.email_schedule_input').each(function(el) { 
        if (el != undefined) {
            mail_data.set(el.name,el.value);
        }
    }); 

    sendBtn.value = "Sending...";
    sendBtn.disabled = true;
    
    if (user_id) {
        jsonRequest(webServiceURL + '&action=email_schedule', function(data) {

            // If data doesn't exist or is an object that doesn't contain
            // the 'results' property.
            emailResults.innerHTML = (data && data.results) 
                ? data.results 
                : '<span class="emailErrorText">Email failed to send. Please try again later.</span>';              

            try {
                appendDebugData(data.debug_data);
            }
            catch (e) {}
            
            sendBtn.value = "Send";
            sendBtn.disabled = false;
            
        }, {'mail_data':mail_data,'user_id':user_id,'email_message':email_message,'user_key':session_cookie.get('user_key')});
    }
    else {
        popup_login("emailSchedule("+user_id+")");
    }

}


/**
 * @param new_window
 * @param user_id
 * @return
 */
function printSchedule(new_window,user_id) {
    //var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    user_id=session_cookie.get('user_id');

    if (display_prefix=="session") {
        jsonRequest(webServiceURL + '&action=print_schedule', function(data){
            appendDebugData(data.debug_data);
            print_page=new_window.document;
            print_page.write(data.user_schedule_print);
            print_page.close(); 
        }, {});
    } else if (user_id) {
        
        print_sessions=session_cookie.get('sessions');
        user_name=session_cookie.get('user_name');
        jsonRequest(webServiceURL + '&action=print_schedule', function(data){
                appendDebugData(data.debug_data);
                print_page=new_window.document;
                print_page.write(data.user_schedule_print);
                print_page.close(); 
        },{'user_id':user_id,'user_key':session_cookie.get('user_key')});
    }
    else {
        var print_sessions = new Array();
        $$('input.saved_user_session').each (function(saved_session) {
            print_sessions.push(saved_session.value); 
        });
        //print_sessions=session_cookie.get('sessions');
        user_name=session_cookie.get('user_name');
        jsonRequest(webServiceURL + '&action=print_schedule', function(data){
                appendDebugData(data.debug_data);
                print_page=new_window.document;
                print_page.write(data.user_schedule_print);
                print_page.close(); 
        }, {'user_name':user_name,'sessions':print_sessions});
    }
    
}

/**
 * @return void
 */
function trackSaveButton() {
    jsonRequest(webServiceURL + '&action=track_save_button', function(data){},{'data':'hello'});
}


/**
 * @param track
 * @return void
 */
function saveMySchedule(track, dontShowWindow) {
    //var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    user_id=session_cookie.get('user_id');
    if (user_id) {
        if(track) {
            trackSaveButton();
        }
        if (!dontShowWindow) {
            popup_show_conditional("Schedule Saved", webServiceURL, {action:'show_popup', popup_type:'saved', width:300, height:50});
        } else {
            //popup_close();
        }
    }
    else {
        popup_login('saveMySchedule()');
    }
}

function getSessionDescription(session_id) {
    jsonRequest(webServiceURL, function(data) {
            
            $('tooltip_content').innerHTML=data.session_description;
            appendDebugData(data.debug_data);
        }, {'session_id':session_id, action:'get_session_description'});
}

/**
 * @return void
 */
function addCookieToForm() {
    var sessions; //declare to prevent errors (sessions can be undefined, if it is undeclared as well, we'll throw an error).
    //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    if (session_cookie.get('user_id')) {
        $('loginContainer').setStyle('display','none');
        $('logoutContainer').setStyle('display','inline');
        jsonRequest(webServiceURL + '&action=get_user_sessions', function(data){
            if (data.error != undefined) {
                alert(data.error);
            }
            if (data.sessions != undefined) {
                data.sessions.each( function(id) {
                if(!$('saved_session_'+id)){
                    var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
                    $('user_sessions').appendChild(saved_session_input);
                }
                });
            }
            appendDebugData(data.debug_data);
        },{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')});

    }
    else if (session_cookie.get('sessions') != undefined) {
        //get sessions from session cookie.
        sessions=session_cookie.get('sessions');
        if (sessions != undefined) {
            sessions.each(function(id) {
                if(!$('saved_session_' + id)) {
                    var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
                    $('user_sessions').appendChild(saved_session_input);
                }       
            });
        }
    }
}

/**
 * @return void
 */
function popup_clear() {
    popup_show_conditional("Attention", webServiceURL, {action:'show_popup', popup_type:'clear', width:200, height:150});
}

/**
 * 
 * @return void
 */
function clearSessions() {
    //session_cookie= new Hash.Cookie('scheduler_session',{duration:false});
    session_cookie.set('sessions',new Array());
        // Destroy the the hidden inputs.
        $$('input.saved_user_session').each(function (el) {
            el.destroy();
        });

        $$('img.cart_delete').each(function(el) {
            el.setProperties({'class':'',src:Images.btn_addToSchedule,title:"Add To My Schedule"});
        });

        if (session_cookie.get('user_id') != undefined) 
        {
            jsonRequest(webServiceURL + '&action=clear_sessions', function(data){
                if (data.error != undefined){
                    alert(data.error);
                }
                try {
                    appendDebugData(data.debug_data);
                }
                
                catch (e) {}
                
                // Update the user schedule and the session list after clearing.
                getSessions();
                
            },{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')});
        }
        else
        {
            //session_cookie.set("");
            getSessions();
        }           
}

/**
 * @param string action
 * @return void
 */
function popup_login(action) {
    checkLogin();

    if (session_cookie.get('user_id') == undefined) {
        if (action == 'email') {
            title = "To email your schedule, please login.";
        } else if (action == 'export') {
            title = "To export your schedule, please login.";
        } else if (action == 'save') {
            title = "To save your schedule, please login.";
        } else {
            title = resourceBundle['loginPopup_title'];
        }
        popup_show_conditional(title, webServiceURL , {action:'show_popup', popup_type:'login', width:loginPopup.width, height:loginPopup.height} );

        if (action != undefined) {
            attempted_user_action=action;
        }
    }
}

/**
 * @return void
 */
function loginUser() {
    var login_data=new Hash();
    $$('input.login_input').each(function(el) { if (el != undefined) login_data.set(el.name,el.value);});
    document.getElementById('login').value="Please Wait...";
    document.getElementById('login').disabled=true;
    
    //Stores and loads a Hash as a Cookie using JSON format and assigns it to a new variable.
    //var session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    
    //Grabs the session data from the cookie and passes it into a new variable.
    var sessions = session_cookie.get('sessions');
    
    //Executes the login_user case in the ajax.php file and appends the cookie data to the URL.
    jsonRequest(webServiceURL + '&action=login_user', function(data){

            if (data.valid_login) {
                document.getElementById('loginStatus').innerHTML= data.results;
                $('loginContainer').setStyle('display','none');
                $('logoutContainer').setStyle('display','inline');
                //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
                session_cookie.extend({'user_id':data.user_id,'user_key':data.user_key,'user_email':data.user_email});
                
                var saved_sessions_array = new Array();
                $$('input.saved_user_session').each (function(saved_session) {
                    saved_sessions_array.push(saved_session.value); 
                });

                if (saved_sessions_array.length>0) {

                    
                    if (data.sessions.length>0) {
                        
                        popup_show_conditional("You have a previously saved schedule", webServiceURL, {action:"show_popup", popup_type:"preexisting_sessions", height:270, width:350});
                    } else {
                        replaceUserSessions();
                        refreshPage();
                        //popup_remove_conditional();
                        if (attempted_user_action != undefined) {
                            
                            setTimeout("eval(attempted_user_action)", 200);
                        } else {
                            popup_remove_conditional();
                        }
                    }
                } else {
                    addCookieToForm();
                    refreshPage();
                    //popup_remove_conditional();
                    if (attempted_user_action != undefined) {
                        eval(attempted_user_action);
                    } else {
                        popup_remove_conditional();
                    }
                    
                    popup_close();
                    
                }
                
                
            }
            else {
                if (error_set == true)
                {
                    document.getElementById('sb_player').innerHTML= document.getElementById('sb_player').innerHTML+data.results;    
                    //document.getElementById('TB_ajaxContent').innerHTML= document.getElementById('TB_ajaxContent').innerHTML+data.results;    
                    error_set = false;
                }
            }
            

        },{'login':login_data});
}


/**
 * @return void
 */
function logoutUser() { 
    session_cookie.dispose();   
    //set session_cookie to null to clear out it's data
    session_cookie = null;
    Cookie.dispose('php121pw');
    Cookie.dispose('php121un');
    Cookie.dispose('phpfox_h');
    Cookie.dispose('phpfox_id');
    Cookie.dispose('PHPSESSID');
    $('user_sessions').empty();
    jsonRequest(webServiceURL + '&action=logout_user', function(data) {
            window.location = appURL;
    },{});

}

/**
 * @return void
 */
function checkLogin() {
    //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    jsonRequest(        webServiceURL + '&action=check_login', function(data){
        try {
            appendDebugData(data.debug_data);
        }
        
        catch (e) {
            
        }
        if (data.valid_login) 
        {   
            document.getElementById('loginStatus').innerHTML=data.results;
            $('loginContainer').setStyle('display','none');
            $('logoutContainer').setStyle('display','inline');
            session_cookie.extend({'user_id':data.user_id,'user_key':data.user_key,'user_email':data.user_email,'sessions':data.sessions, 'user_name':data.user_name});
            addCookieToForm();
            popup_remove_conditional();
            refreshPage();
            if (attempted_user_action != undefined)
            {
                eval(attempted_user_action);
            }
        } 
    },{});
    
}

/**
 * @param int id Session ID
 * @return void
 */
function addToMySchedule(id, OK) {
    if (!$('saved_session_'+id)) {
        var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
        $('user_sessions').appendChild(saved_session_input);
        var sessions = session_cookie.get("sessions");
        sessions.push(id);
        session_cookie.set("sessions", sessions);
        
        if (session_cookie.get('user_id') != undefined) {
            jsonRequest(webServiceURL + '&action=add_session', function(data){
                if(data.failure != true){
                    var saved_session_input= new Element('input',{'type':'hidden','value':id, 'name':'saved_session_'+id, 'id':'saved_session_'+id,'class':'saved_user_session'});
                    //$('user_sessions').appendChild(saved_session_input);
                }
                else {
                    alert("This session could not be added to your myE2 Schedule because it conflicts with the time of another class that you are already attending.");
                }
                try {
                    appendDebugData(data.debug_data);
                }
                
                catch (e) {}
                
                saveMySchedule(false, true);
            
            },{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key'),'session_id':id});
        }
    }
    else {
        var sessions = session_cookie.get("sessions");
        sessions.each(function(item){
            if (item==id) {
                sessions.erase(item);
            }
        });
        session_cookie.set("sessions", sessions);
        if (display_prefix == "user" && !OK) {
            $("remove-session-id").set("value", id);
            dialog("dialog-remove-session");
            return false;
        }
        
        $('saved_session_'+id).destroy();
        
        //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
        if (session_cookie.get('user_id') != undefined) {
            
            jsonRequest(webServiceURL + '&action=remove_session', function(data) {
                if(data.failure == true){
                    alert("You have already removed this session from your myE2 schedule.  Please refresh your page if you reached this error.");
                }
                appendDebugData(data.debug_data);
                saveMySchedule(false, true);
                
                if (display_prefix == "user") {
                    if (display_suffix == "list") {
                        $("session_listing_"+id).setStyle("display", "none");
                    } else {
                        getSessions();
                    }
                }
            },{'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key'),'session_id':id});
        } else {
            if (display_prefix == "user") {
                if (display_suffix == "list") {
                    $("session_listing_"+id).setStyle("display", "none");
                } else {
                    getSessions();
                }
            }
        }
    }
    return true;
}

/**
 * @return object
 */
function getAdditionalParams() {
    var saved_sessions_array=new Array();
    //session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    if (session_cookie.get('user_id') != undefined) {
        var params = {'user_id':session_cookie.get('user_id'),'user_key':session_cookie.get('user_key')};
    }
    else {
        $$('input.saved_user_session').each (function(saved_session) {
            saved_sessions_array.push(saved_session.value); 
        });
        session_cookie.extend({'sessions':saved_sessions_array});
        var params = {'sessions': saved_sessions_array};
    }
    return params;
}

/**
 * @param list
 * @return void
 */
function popup_export_menu() {
    session_cookie=new Hash.Cookie('scheduler_session',{duration:false});
    if(session_cookie.get('user_id')) {
        popup_show_conditional('Export Schedule', webServiceURL, {action:"show_popup", popup_type:"export_menu", width:160, height:110} );
    } else {
        popup_login('popup_export_menu()');
    }
}

function popup_export_all_menu() {
    popup_show_conditional('Export All Sessions', webServiceURL, {action:"show_popup", popup_type:"export_all_menu", width:160, height:110});
}


/**
 * @param string id
 * @return
 */
function dialog(id) {
    var dialogObj = $(id);
    dialogObj.setStyle("display", "block");
    var coords = dialogObj.getCoordinates();
    var wrapperCoords = $("ScheduleBuilder-application").getCoordinates();
    scrolltop = getScrollTop();
    dialogObj.setStyle("top", (window.getScrollTop() + (window.getHeight() - coords.height) / 2) - wrapperCoords.top);
    dialogObj.setStyle("left",(window.getScrollLeft() + (window.getWidth() - coords.width) / 2)- wrapperCoords.left);
}

/*************************/
/* BEGIN Util FUNCTIONS */
/*************************/

/**
 * 
 */
function checkSession(id) {
    $('session_'+id).checked=true;
}

/**
 * @param emailAddy
 * @return object
 */
function validateEmailSchedule(emailAddy) {
    var validateObj = {
        validated : true,
        error : ""
    }

    var re = new RegExp('^.+@[^\.].*\.[a-z]{2,}$');
    
    if (emailAddy == undefined || emailAddy == '') {
        validateObj['error'] = "Please enter an email address.";
        validateObj['validated'] = false;
    }
    else if (!emailAddy.match(re)) {
        validateObj['error'] = emailAddy + " is not a valid email address";
        validateObj['validated'] = false;
    }
    
    return validateObj;
}

/**
 * @param url
 * @param funct
 * @param json
 * @return void
 */
function jsonRequest(url, funct, json) {
        json = JSON.encode(json);
        new Request.JSON({'url':url, onComplete: funct}).post({'json':json});       
}

/**
 * @param object
 * @return void
 */
function printObject(object) {
    var str = '';
    for(prop in object) {
        if(object.hasOwnProperty(prop))
            str += prop + " : " + object[prop] + "\n";
    }
    alert(str);
}

function selectOneFilterCheckbox(filterName, filterItemId) {
    $$("#filter-"+filterName+" input").each(function(checkbox){ 
        var checkboxDiv = checkbox.getParent();
        if (checkbox.name != filterName+"_"+filterItemId) {
            checkboxDiv.set("class", checkboxDiv.className.replace(/\schecked/, " unchecked"));
            checkbox.set("checked", false);
        } else {
            checkboxDiv.set("class", checkboxDiv.className.replace(/unchecked/, "checked"));
            checkbox.set("checked", true);
        }   
    });
    refreshPage();
}


function resetView() {
    if($('list').get("class") == "list_permalinks") {
        $('list').removeClass("list_permalinks");
        $('list-header-wrapper').setStyle("height", "auto");
        $('session_wrapper').setStyle("display", "none");
    }
}

