/////////////////////////////////////////////////////////////////////////////
//
// includes/segwaysocial.js
//
/////////////////////////////////////////////////////////////////////////////

var SITE_PREFIX = "/";

var LEFT_TABS_DIR = SITE_PREFIX+'images/left_tabs/';
var RIGHT_TABS_DIR = SITE_PREFIX+'images/right_tabs/';

var FLICKR_GROUP_URL = 'http://flickr.com/groups/segwaysocial/pool/';

var ERROR_PREFIX = "<li>";
var ERROR_SUFFIX = "</li>\n";

var AJAX_SUCCESS = 0;
var AJAX_FAILURE = 1;

var ajaxRunning = false;
var mapIsReady = false;

/////////////////////////////////////////////////////////////////////////////
// Cookie functions
/////////////////////////////////////////////////////////////////////////////

function getCookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
        end = dc.length;
    }

    return unescape(dc.substring(begin + prefix.length, end));
}

/////////////////////////////////////////////////////////////////////////////

function sessionID() {
    return (getCookie('PHPSESSID') || '');
}


/////////////////////////////////////////////////////////////////////////////
// Pop-up functions
/////////////////////////////////////////////////////////////////////////////

var popUpWindow = null;

function popUp(url, wCustom, hCustom) {
    var w = 760;
    var h = 560;

    if (wCustom != null) {
        w = wCustom;
    }
    if (hCustom != null) {
        h = hCustom;
    }

    w += 20; // include scrollbar
    var scrollbars = 'yes';

    var l = ( (screen.width-w) >>1 );
    var t = ( (screen.height-h) >>1 );

    if (popUpWindow) {
        popUpWindow.close();
    }
    popUpWindow = window.open(SITE_PREFIX+url, 'segwaySocialPopUp', 'toolbar=no,scrollbars='+scrollbars+',menubar=no,width='+w+',height='+h+',top='+t+',left='+l);
    popUpWindow.focus();
}


/////////////////////////////////////////////////////////////////////////////
// Form helpers
/////////////////////////////////////////////////////////////////////////////

// escape text for use in a query string
function escapeForURL(s) {
  if (s != null) {
    var t = new String(escape(s));
    // JS escape() doesn't touch plus signs
    t = t.replace(/\+/g, '%2B');
  
    return t;
  } else {
    return '';
  }
}

/////////////////////////////////////////////////////////////////////////////

function submitOnEnter(fieldObj, formObj, e) {
    var keycode = 0;

    if (window.event) {
        keycode = window.event.keyCode;
    } else if (e) {
        keycode = e.which;
    }

    if (keycode == 13) {
        if (formObj.onsubmit()) {
            formObj.submit();
            return false;
        }
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function queryString(formObj) {
    var query = '';

    for (var i=0; i<formObj.childNodes.length; i++) {
        if (formObj.childNodes[i].tagName == 'INPUT') {
            if ((formObj.childNodes[i].type == 'text') ||
                (formObj.childNodes[i].type == 'password') ||
                (formObj.childNodes[i].type == 'hidden')) {
                query += formObj.childNodes[i].name + '=' + escapeForURL(formObj.childNodes[i].value) + '&';
            }
            if (formObj.childNodes[i].type == 'checkbox') {
                if (formObj.childNodes[i].checked) {
                    query += formObj.childNodes[i].name + '=' + escapeForURL(formObj.childNodes[i].value) + '&';
                } else {
                    query += formObj.childNodes[i].name + '=&';
                }
            }
            if (formObj.childNodes[i].type == 'radio') {
                if (formObj.childNodes[i].checked) {
                    query += formObj.childNodes[i].name + '=' + escapeForURL(formObj.childNodes[i].value) + '&';
                }
            }
        } else if (formObj.childNodes[i].tagName == 'TEXTAREA') {
            query += formObj.childNodes[i].name + '=' + escapeForURL(formObj.childNodes[i].value) + '&';
        } else if (formObj.childNodes[i].tagName == 'SELECT') {
            var sel = formObj.childNodes[i];
            query += sel.name + '=' + escapeForURL(sel.options[sel.selectedIndex].value) + '&';
        } else if (formObj.childNodes[i].tagName == 'FIELDSET') {
            query += queryString(formObj.childNodes[i]);
        }
    }

    return query;
}

/////////////////////////////////////////////////////////////////////////////

function scrollToTop(id) {
    document.getElementById(id).scrollTop = 0;
}

/////////////////////////////////////////////////////////////////////////////

function getCheckboxStatus(formObj, checkboxName) {
    var anyChecked = false;

    if (formObj.elements[checkboxName].length === undefined) {
        if (formObj.elements[checkboxName].checked) {
            anyChecked = true;
        }
    } else {
        for (var i=0; i<formObj.elements[checkboxName].length; i++) {
            if (formObj.elements[checkboxName][i].checked) {
                anyChecked = true;
                break;
            }
        }
    }

    return anyChecked;
}

/////////////////////////////////////////////////////////////////////////////

function getRadioValue(radioObj) {
    var radioValue = null;

    for (var i=0; i<radioObj.length; i++) {
        if (radioObj[i].checked) { radioValue = radioObj[i].value; }
    }

    return radioValue;
}

/////////////////////////////////////////////////////////////////////////////

function getSelectValue(selectObj) {
    var selectValue = '';

    if (selectObj.selectedIndex >= 0) {
        selectValue = selectObj[selectObj.selectedIndex].value;
    }

    return selectValue;
}

/////////////////////////////////////////////////////////////////////////////

function limitTextarea(textareaObj, countName, limit) {
    if (document.getElementById) {
        var countObj = document.getElementById(countName);
    	if (textareaObj.value.length > limit) {
    		textareaObj.value = textareaObj.value.substring(0, limit);
    	} else {
    		countObj.innerHTML = limit - textareaObj.value.length;
    	}
    }
}

/////////////////////////////////////////////////////////////////////////////

function watermarkOff(fieldObj) {
    if (document.getElementById) {
        fieldObj.style.backgroundImage = 'none';
    }
}

/////////////////////////////////////////////////////////////////////////////

function watermarkOn(fieldObj, imgName) {
    if (document.getElementById) {
        if (!fieldObj.value.length) {
            fieldObj.style.backgroundImage = 'url("'+SITE_PREFIX+'images/'+imgName+'")';
        }
        fieldObj.onfocus = function() { watermarkOff(fieldObj); }
    }
}


/////////////////////////////////////////////////////////////////////////////
// Math functions
/////////////////////////////////////////////////////////////////////////////

function kmToMiles(kmName, milesName) {
    var km_per_mile = 1.60934721869;
    if (document.getElementById) {
        if (document.getElementById(kmName) && document.getElementById(kmName).value.length) {
            var km = parseFloat(document.getElementById(kmName).value);
            if (document.getElementById(milesName)) {
                document.getElementById(milesName).value = Math.round(km / km_per_mile);
                document.getElementById(kmName).value = '';
            }
        }
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Form validation
/////////////////////////////////////////////////////////////////////////////

function validateLoginForm(formObj) {
    var errorText = '';

    if (formObj.login_username.value.length < 1) {
        errorText += "Please enter your username in the appropriate field.\n";
    }
    if (formObj.login_password.value.length < 1) {
        errorText += "Please enter your password in the appropriate field.\n";
    }

    if (errorText.length > 0) {
        alert("To proceed:\n\n" + errorText);
        return false;
    }

    // encrypt password before transmitting to the server
    formObj.login_password_md5.value = hex_md5(formObj.login_password.value);
    formObj.login_password.value = '';

    pageTracker._trackPageview("/user/login");

    return true;
}

/////////////////////////////////////////////////////////////////////////////

// city, state, postal_code, country, timezone_gmt_offset, email, modelid,
// packageid, serial_number, segway_avg_weekly_miles, usertypeid, testimonial,
// flickr_username
function validateCommonProfileFields(formObj, ajaxErrorTextName) {
    var emailPat = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,5}|[0-9]{1,3})(\]?)$/;

    var errorText = '';

    var maxlength_testimonial = 500;

    if (formObj.city.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your city in the appropriate field."+ERROR_SUFFIX;
    }
    var state = getSelectValue(formObj.state);
    if ((state.length < 1) && (formObj.country.value.length < 1)) {
        errorText += ERROR_PREFIX+"Please select your state (U.S. users) or enter your country in the appropriate field (non-U.S. users)."+ERROR_SUFFIX;
    } else if (state.length && (formObj.postal_code.value.length != 5) &&
        (formObj.postal_code.value.length != 9)) {
        errorText += ERROR_PREFIX+"Please enter your 5- or 9-digit ZIP code in the appropriate field."+ERROR_SUFFIX;
    } else if (formObj.country.value.length && (formObj.postal_code.value.length < 1)) {
        errorText += ERROR_PREFIX+"Please enter your postal code in the appropriate field."+ERROR_SUFFIX;
    }
    // timezone_gmt_offset enforced by drop-down
    if (formObj.email.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your email address in the appropriate field."+ERROR_SUFFIX;
    } else if (!emailPat.test(formObj.email.value)) {
        errorText += ERROR_PREFIX+"Please check your email address entry to make sure it's correct."+ERROR_SUFFIX;
    } else {
        // check for duplicate email
        new Ajax.Request( SITE_PREFIX+"partials/user/dupe_check.php", {
                method: 'post',
                parameters: 'email='+escapeForURL(formObj.email.value),
                asynchronous: false,
                onFailure: function() {
                    document.getElementById(ajaxErrorTextName).innerHTML += ERROR_PREFIX+"There was an error verifying your entries. Please try again later."+ERROR_SUFFIX;
                },
                onSuccess: function(response) {
                    if (response.responseText == AJAX_FAILURE) {
                        document.getElementById(ajaxErrorTextName).innerHTML += ERROR_PREFIX+"That email address is already associated with an existing account."+ERROR_SUFFIX;
                    }
                }
            });
    }

    var modelid = getSelectValue(formObj.modelid);
    if (modelid.length < 1) {
        errorText += ERROR_PREFIX+"Please select your Segway PT model from the list. If you don't see your model listed, please contact us for assistance."+ERROR_SUFFIX;
    }
    // packageid optional
    if (formObj.serial_number.value.length) {
        if ((formObj.serial_number.value.length < 12) ||
            (formObj.serial_number.value == '000000000000') ||
            (formObj.serial_number.value == '111111111111') ||
            (formObj.serial_number.value == '999999999999')) {
            errorText += ERROR_PREFIX+"Please double-check your serial number entry to be sure you have typed it correctly."+ERROR_SUFFIX;
        }
    }
    var purchase_date_Month = getSelectValue(formObj.elements['purchase_date[Month]']);
    var purchase_date_Year = getSelectValue(formObj.elements['purchase_date[Year]']);
    if (purchase_date_Month.length || purchase_date_Year.length) {
        if (!purchase_date_Month.length || !purchase_date_Year.length) {
            errorText += ERROR_PREFIX+"Please indicate the approximate month and year you purchased your Segway PT."+ERROR_SUFFIX;
        }
    }
    // segway_avg_weekly_miles optional
    var usertypeid = getSelectValue(formObj.usertypeid);
    if (usertypeid.length < 1) {
        errorText += ERROR_PREFIX+"Please select the option that best describes your primary use of your Segway PT."+ERROR_SUFFIX;
    }
    if (formObj.testimonial.value.length > maxlength_testimonial) {
        errorText += ERROR_PREFIX+"Your entry for 'How I use my Segway PT' is too long. It may be a maximum of "+maxlength_testimonial+" characters."+ERROR_SUFFIX;
    }
	// flickr_username optional

    return errorText;
}

/////////////////////////////////////////////////////////////////////////////

function validateProspectForm(formObj) {
    var emailPat = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,5}|[0-9]{1,3})(\]?)$/;

    var errorText = '';
    document.getElementById('prospectErrorDiv').style.display = 'none';
    document.getElementById('prospectErrorText').innerHTML =
    document.getElementById('prospectAjaxErrorText').innerHTML = '';

    if (formObj.email.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your email address in the appropriate field."+ERROR_SUFFIX;
    } else if (!emailPat.test(formObj.email.value)) {
        errorText += ERROR_PREFIX+"Please check your email address entry to make sure it's correct."+ERROR_SUFFIX;
    }
    // commute, commute_miles, modelid, purchase_timeframe optional

    if (errorText.length > 0) {
        document.getElementById('prospectErrorText').innerHTML = errorText;
        document.getElementById('prospectErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateSignupForm(formObj) {
    var usernamePat = /^[a-zA-Z0-9\_]+$/;
    var passwordPat = /^[a-zA-Z0-9\_\.\-]+$/;

    var errorText = '';
    document.getElementById('signupErrorDiv').style.display = 'none';
    document.getElementById('signupErrorText').innerHTML =
    document.getElementById('signupAjaxErrorText').innerHTML = '';

    if (formObj.first_name.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your first name in the appropriate field."+ERROR_SUFFIX;
    }
    if (formObj.last_name.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your last name in the appropriate field."+ERROR_SUFFIX;
    }
    // city, state, postal_code, country, timezone_gmt_offset, email,
    // modelid, packageid, serial_number, segway_avg_weekly_miles, usertypeid,
    // flickr_username
    errorText += validateCommonProfileFields(formObj, 'signupAjaxErrorText');

    if (formObj.username.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a username in the appropriate field."+ERROR_SUFFIX;
    } else if (formObj.username.value.length < 3) {
        errorText += ERROR_PREFIX+"Your username must be between 3 and 16 characters long."+ERROR_SUFFIX;
    } else if (!usernamePat.test(formObj.username.value)) {
        errorText += ERROR_PREFIX+"Your username must contain only letters, numbers and underscores. Spaces and other characters are not allowed."+ERROR_SUFFIX;
    } else {
        // check for duplicate username
        new Ajax.Request( SITE_PREFIX+"partials/user/dupe_check.php", {
                method: 'post',
                parameters: 'username='+escapeForURL(formObj.username.value),
                asynchronous: false,
                onFailure: function() {
                    document.getElementById('signupAjaxErrorText').innerHTML += ERROR_PREFIX+"There was an error verifying your entries. Please try again later."+ERROR_SUFFIX;
                },
                onSuccess: function(response) {
                    if (response.responseText == AJAX_FAILURE) {
                        document.getElementById('signupAjaxErrorText').innerHTML += ERROR_PREFIX+"That username is already in use.  Please choose another."+ERROR_SUFFIX;
                    }
                }
            });
    }
    if (formObj.password.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a password in the appropriate field."+ERROR_SUFFIX;
    } else if (formObj.password.value.length < 4) {
        errorText += ERROR_PREFIX+"Your password must be between 4 and 16 characters long."+ERROR_SUFFIX;
    } else if (!passwordPat.test(formObj.password.value)) {
        errorText += ERROR_PREFIX+"Your password must contain only letters, numbers, underscores, periods, and dashes. Spaces and other characters are not allowed."+ERROR_SUFFIX;
    } else if (formObj.password2.value.length < 1) {
        errorText += ERROR_PREFIX+"Please re-enter your password in the appropriate field for verification."+ERROR_SUFFIX;
    } else if (formObj.password2.value != formObj.password.value) {
        errorText += ERROR_PREFIX+"Your password entries do not match.  Please retype your password to confirm."+ERROR_SUFFIX;
        formObj.password.value = formObj.password2.value = '';
    }

    var agreed = getCheckboxStatus(formObj, 'agreed');
    if (!agreed) {
        errorText += ERROR_PREFIX+"To proceed, you must check the box to indicate that you agree to the terms and conditions."+ERROR_SUFFIX;
    }

    var ajaxErrorText_length = document.getElementById('signupAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('signupErrorText').innerHTML = errorText;
        document.getElementById('signupErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validatePasswordResetForm(formObj) {
    var emailPat = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,5}|[0-9]{1,3})(\]?)$/;

    var errorText = '';
    document.getElementById('resetErrorDiv').style.display = 'none';
    document.getElementById('resetErrorText').innerHTML = '';

    if ((formObj.username.value.length < 1) &&
        (formObj.email.value.length < 1)) {
        errorText += ERROR_PREFIX+"Please enter either your username or email address in the appropriate field."+ERROR_SUFFIX;
    } else {
        if (formObj.email.value.length &&
            !emailPat.test(formObj.email.value)) {
            errorText += ERROR_PREFIX+"Please check your email address entry to make sure it's correct."+ERROR_SUFFIX;
        }
    }

    if (errorText.length > 0) {
        document.getElementById('resetErrorText').innerHTML = errorText;
        document.getElementById('resetErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateMessageForm(formObj) {
    var errorText = '';
    document.getElementById('messageErrorDiv').style.display = 'none';
    document.getElementById('messageErrorText').innerHTML =
    document.getElementById('messageAjaxErrorText').innerHTML = '';

    var maxlength_message = 1024;

    if (formObj.subject.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your message subject."+ERROR_SUFFIX;
    }
    if (formObj.message.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your message text."+ERROR_SUFFIX;
    } else if (formObj.message.value.length > maxlength_message) {
        errorText += ERROR_PREFIX+"Your message text is too long. It may be a maximum of "+maxlength_message+" characters."+ERROR_SUFFIX;
    }

    var ajaxErrorText_length = document.getElementById('messageAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('messageErrorText').innerHTML = errorText;
        document.getElementById('messageErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateNoteForm(formObj) {
    var errorText = '';
    document.getElementById('noteErrorDiv').style.display = 'none';
    document.getElementById('noteErrorText').innerHTML =
    document.getElementById('noteAjaxErrorText').innerHTML = '';

    var maxlength_note = 500;

    if (formObj.note.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your note text."+ERROR_SUFFIX;
    } else if (formObj.note.value.length > maxlength_note) {
        errorText += ERROR_PREFIX+"Your note text is too long. It may be a maximum of "+maxlength_note+" characters."+ERROR_SUFFIX;
    }

    var ajaxErrorText_length = document.getElementById('noteAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('noteErrorText').innerHTML = errorText;
        document.getElementById('noteErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateProfileForm(formObj) {
    var passwordPat = /^[a-zA-Z0-9\_\.\-]+$/;

    var errorText = '';
    document.getElementById('profileErrorDiv').style.display = 'none';
    document.getElementById('profileErrorText').innerHTML =
    document.getElementById('profileAjaxErrorText').innerHTML = '';

    // city, state, postal_code, country, timezone_gmt_offset, email, modelid,
    // packageid, serial_number, segway_avg_weekly_miles, usertypeid, testimonial,
    // flickr_username
    errorText += validateCommonProfileFields(formObj, 'profileAjaxErrorText');

    if (formObj.old_password.value.length > 1) {
        if (formObj.password.value.length < 1) {
            errorText += ERROR_PREFIX+"Please enter a new password in the appropriate field."+ERROR_SUFFIX;
        } else if (formObj.password.value.length < 4) {
            errorText += ERROR_PREFIX+"Your new password must be between 4 and 16 characters long."+ERROR_SUFFIX;
        } else if (!passwordPat.test(formObj.password.value)) {
            errorText += ERROR_PREFIX+"Your new password must contain only letters, numbers, underscores, periods, and dashes. Spaces and other characters are not allowed."+ERROR_SUFFIX;
        } else if (formObj.password2.value.length < 1) {
            errorText += ERROR_PREFIX+"Please re-enter your new password for verification."+ERROR_SUFFIX;
        } else if (formObj.password2.value != formObj.password.value) {
            errorText += ERROR_PREFIX+"Your new password entries do not match.  Please retype your new password to confirm."+ERROR_SUFFIX;
            formObj.password.value = formObj.password2.value = '';
        } else {
            // verify current password
            new Ajax.Request( SITE_PREFIX+"partials/user/password_check.php", {
                    method: 'post',
                    parameters: 'password_md5='+escapeForURL(hex_md5(formObj.old_password.value)),
                    asynchronous: false,
                    onFailure: function() {
                        document.getElementById('profileAjaxErrorText').innerHTML += ERROR_PREFIX+"There was an error verifying your entries. Please try again later."+ERROR_SUFFIX;
                    },
                    onSuccess: function(response) {
                        if (response.responseText == AJAX_FAILURE) {
                            document.getElementById('profileAjaxErrorText').innerHTML += ERROR_PREFIX+"Your current password entry is incorrect.  Please double-check and enter it again."+ERROR_SUFFIX;
                            formObj.old_password.value = '';
                        }
                    }
                });
        }
    } else if ((formObj.password.value.length > 1) ||
        (formObj.password2.value.length > 1)) {
        errorText += ERROR_PREFIX+"Please enter your current password to confirm your password change."+ERROR_SUFFIX;
    }

    var ajaxErrorText_length = document.getElementById('profileAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('profileErrorText').innerHTML = errorText;
        document.getElementById('profileErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateProfilePhotoForm(formObj) {
    var errorText = '';

    var max_profile_photo_size = "2,048,000"; // 2MB

    if (formObj.profile_photo.value.length < 1) {
        errorText = "Please choose a photo from your hard disk in JPG, GIF or PNG format (maximum size "+max_profile_photo_size+" bytes).";
    } else {
        var ext = formObj.profile_photo.value;
        ext = ext.substring(ext.length-4, ext.length);
        ext = ext.toLowerCase();
        if ((ext != '.jpg') && (ext != 'jpeg') && (ext != '.gif') && (ext != '.png')) {
            errorText = "Your photo '"+formObj.profile_photo.value+"' does not appear to be a JPG, GIF or PNG file. Only JPG, GIF and PNG images are accepted.";
        }
    }

    if (errorText.length > 0) {
        alert(errorText);
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateFeedbackForm(formObj) {
    var errorText = '';
    document.getElementById('feedbackErrorDiv').style.display = 'none';
    document.getElementById('feedbackErrorText').innerHTML = '';

    var maxlength_message = 1024;

    if (formObj.subject.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your message subject."+ERROR_SUFFIX;
    }
    if (formObj.message.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter your message text."+ERROR_SUFFIX;
    } else if (formObj.message.value.length > maxlength_message) {
        errorText += ERROR_PREFIX+"Your message text is too long. It may be a maximum of "+maxlength_message+" characters."+ERROR_SUFFIX;
    }

    if (errorText.length > 0) {
        document.getElementById('feedbackErrorText').innerHTML = errorText;
        document.getElementById('feedbackErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateCreateGroupForm(formObj) {
    var flickrtagPat = /^[a-zA-Z0-9]+$/;

    var errorText = '';
    document.getElementById('groupErrorDiv').style.display = 'none';
    document.getElementById('groupErrorText').innerHTML =
    document.getElementById('groupAjaxErrorText').innerHTML = '';

    var maxlength_intro = 512;

    if (formObj.group_name.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a group name in the appropriate field."+ERROR_SUFFIX;
    } else {
        // check for duplicate group name
        new Ajax.Request( SITE_PREFIX+"partials/group/dupe_check.php", {
                method: 'post',
                parameters: 'group_name='+escapeForURL(formObj.group_name.value),
                asynchronous: false,
                onFailure: function() {
                    document.getElementById('groupAjaxErrorText').innerHTML += ERROR_PREFIX+"There was an error verifying your entries. Please try again later."+ERROR_SUFFIX;
                },
                onSuccess: function(response) {
                    if (response.responseText == AJAX_FAILURE) {
                        document.getElementById('groupAjaxErrorText').innerHTML += ERROR_PREFIX+"That group name is already taken. Please choose another."+ERROR_SUFFIX;
                    }
                }
            });
    }
    if (formObj.tagline.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a tagline (slogan) in the appropriate field."+ERROR_SUFFIX;
    }
    if (formObj.intro.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a group introduction in the appropriate field."+ERROR_SUFFIX;
    } else if (formObj.intro.value.length > maxlength_intro) {
        errorText += ERROR_PREFIX+"Your introduction text is too long. It may be a maximum of "+maxlength_intro+" characters."+ERROR_SUFFIX;
    }
    var usertypeid = getSelectValue(formObj.usertypeid);
    if (usertypeid.length < 1) {
        errorText += ERROR_PREFIX+"Please select the option that best describes your group's primary audience."+ERROR_SUFFIX;
    }
    if (formObj.flickr_tags.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a keyword (tag) that will identify your group's photos on Flickr."+ERROR_SUFFIX;
    } else if (!flickrtagPat.test(formObj.flickr_tags.value)) {
        errorText += ERROR_PREFIX+"Your Flickr tag must contain only letters and numbers. Spaces and other characters are not allowed."+ERROR_SUFFIX;
    } else {
        // check for duplicate Flickr tag
        new Ajax.Request( SITE_PREFIX+"partials/group/dupe_check.php", {
                method: 'post',
                parameters: 'flickr_tags='+escapeForURL(formObj.flickr_tags.value),
                asynchronous: false,
                onFailure: function() {
                    document.getElementById('groupAjaxErrorText').innerHTML += ERROR_PREFIX+"There was an error verifying your entries. Please try again later."+ERROR_SUFFIX;
                },
                onSuccess: function(response) {
                    if (response.responseText == AJAX_FAILURE) {
                        document.getElementById('groupAjaxErrorText').innerHTML += ERROR_PREFIX+"That Flickr tag is already reserved for another group. Please choose a different tag."+ERROR_SUFFIX;
                    }
                }
            });
    }

    if (formObj.city.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter the group's city in the appropriate field."+ERROR_SUFFIX;
    }
    var state = getSelectValue(formObj.state);
    if ((state.length < 1) && (formObj.country.value.length < 1)) {
        errorText += ERROR_PREFIX+"Please select a state (U.S. groups) or enter a country in the appropriate field (non-U.S. users)."+ERROR_SUFFIX;
    }
    // postal_code optional

    var ajaxErrorText_length = document.getElementById('groupAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('groupErrorText').innerHTML = errorText;
        document.getElementById('groupErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateEditGroupForm(formObj) {
    var errorText = '';
    document.getElementById('groupErrorDiv').style.display = 'none';
    document.getElementById('groupErrorText').innerHTML =
    document.getElementById('groupAjaxErrorText').innerHTML = '';

    var maxlength_intro = 512;
    var maxlength_announcement = 1024;

    if (formObj.tagline.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a tagline (slogan) in the appropriate field."+ERROR_SUFFIX;
    }
    if (formObj.intro.value.length < 1) {
        errorText += ERROR_PREFIX+"Please enter a group introduction in the appropriate field."+ERROR_SUFFIX;
    } else if (formObj.intro.value.length > maxlength_intro) {
        errorText += ERROR_PREFIX+"Your introduction text is too long. It may be a maximum of "+maxlength_intro+" characters."+ERROR_SUFFIX;
    }
    if (formObj.announcement.value.length > maxlength_announcement) {
        errorText += ERROR_PREFIX+"Your announcement text is too long. It may be a maximum of "+maxlength_announcement+" characters."+ERROR_SUFFIX;
    }

    var ajaxErrorText_length = document.getElementById('groupAjaxErrorText').innerHTML.length;
    if ((errorText.length > 0) || (ajaxErrorText_length > 0)) {
        document.getElementById('groupErrorText').innerHTML = errorText;
        document.getElementById('groupErrorDiv').style.display = '';
        scrollToTop('bodyRight');
        return false;
    }
    return true;
}

/////////////////////////////////////////////////////////////////////////////

function validateSearchForm(formObj) {
    var errorText = '';

    if (formObj.search_query.value.length < 1) {
        errorText += "Please enter one or more keywords in the search box.\n";
    }

    if (errorText.length > 0) {
        alert("To proceed:\n\n" + errorText);
        return false;
    }

    return true;
}


/////////////////////////////////////////////////////////////////////////////
// Form submission
/////////////////////////////////////////////////////////////////////////////

function ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn) {
    if (document.getElementById) {
        if (onFailure_fn === undefined) {
            var onFailure_fn = ajaxError;
        }
        var formAction = document.getElementById(formName).action;
        var params = queryString(document.getElementById(formName));
        new Ajax.Request( formAction, {
                method: 'post',
                parameters: params,
                asynchronous: false,
                onFailure: onFailure_fn,
                onSuccess: onSuccess_fn
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitProspectForm(formName) {
    if (document.getElementById) {
        if (validateProspectForm(document.getElementById(formName))) {
            document.getElementById('prospectSubmitLink').style.display = 'none';
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                    document.getElementById('prospectSubmitLink').style.display = '';
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                    document.getElementById('prospectSubmitLink').style.display = '';
                } else {
                    showCustomRight(SITE_PREFIX+"partials/sign_up/confirm.php");
                    pageTracker._trackPageview("/user/sign-up/prospect/confirm");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
                document.getElementById('prospectSubmitLink').style.display = '';
            }
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitSignupForm(formName) {
    if (document.getElementById) {
        if (validateSignupForm(document.getElementById(formName))) {
            document.getElementById('signupSubmitLink').style.display = 'none';
            // encrypt password before transmitting to the server
            document.getElementById(formName).password_md5.value = hex_md5(document.getElementById(formName).password.value);
            document.getElementById(formName).password.value = '';
            document.getElementById(formName).password2.value = '';
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                    document.getElementById('signupSubmitLink').style.display = '';
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                    document.getElementById('signupSubmitLink').style.display = '';
                } else {
                    showCustomRight(SITE_PREFIX+"partials/user/create/confirm.php");
                    pageTracker._trackPageview("/user/sign-up/owner/confirm");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
                document.getElementById('signupSubmitLink').style.display = '';
            }
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitPasswordResetForm(formName) {
    if (document.getElementById) {
        if (validatePasswordResetForm(document.getElementById(formName))) {
            document.getElementById('resetSubmitLink').style.display = 'none';
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                    document.getElementById('resetSubmitLink').style.display = '';
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                    document.getElementById('resetSubmitLink').style.display = '';
                } else {
                    showCustomRight(SITE_PREFIX+"partials/user/reset/confirm.php");
                    pageTracker._trackPageview("/user/reset-password/confirm");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
                document.getElementById('resetSubmitLink').style.display = '';
            }
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitMessageForm(formName, groupid) {
    if (document.getElementById) {
        if (validateMessageForm(document.getElementById(formName))) {
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                } else {
                    showMessageBoard(groupid, 1, true);
                    pageTracker._trackPageview("/group/messages/group"+encodeURIComponent(groupid)+"/post");
                }
            };
            ajaxSubmitForm(formName, onSuccess_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitNoteForm(formName, userid) {
    var maxlength_note = 500;

    if (document.getElementById) {
        if (validateNoteForm(document.getElementById(formName))) {
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                } else {
                    showUserNotes(userid, 1, true);
                    // clear notes entry box
                    document.getElementById('note').value = '';
                    // reset character count
                    limitTextarea(document.getElementById('note'), 'note_limit', maxlength_note);
                    pageTracker._trackPageview("/user/notes/user"+encodeURIComponent(userid)+"/post");
                }
            };
            ajaxSubmitForm(formName, onSuccess_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitProfileForm(formName) {
    if (document.getElementById) {
        if (validateProfileForm(document.getElementById(formName))) {
            document.getElementById('profileSubmitLink').style.display = 'none';
            // encrypt passwords before transmitting to the server
            if (document.getElementById(formName).old_password.value.length &&
                document.getElementById(formName).password.value.length &&
                document.getElementById(formName).password2.value.length) {
                document.getElementById(formName).old_password_md5.value = hex_md5(document.getElementById(formName).old_password.value);
                document.getElementById(formName).old_password.value = '';
                document.getElementById(formName).password_md5.value = hex_md5(document.getElementById(formName).password.value);
                document.getElementById(formName).password.value = '';
                document.getElementById(formName).password2.value = '';
            }
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                    document.getElementById('profileSubmitLink').style.display = '';
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                    document.getElementById('profileSubmitLink').style.display = '';
                } else {
                    showCustomRight(SITE_PREFIX+"partials/user/edit/confirm.php");
                    updateDashboard();
                    pageTracker._trackPageview("/user/profile/edit/confirm");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
                document.getElementById('profileSubmitLink').style.display = '';
            }
            // set form action (may be changed when submitting profile photo)
            document.getElementById(formName).action = document.getElementById(formName).action_processor.value;
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitProfilePhotoForm(formName) {
    if (document.getElementById) {
        if (validateProfilePhotoForm(document.getElementById(formName))) {
            var onComplete_fn = function(response) {
                if ((response == AJAX_FAILURE) || !response.length) {
                    ajaxError();
                } else if (response.substr(0,1) == '/') {
                	if (document.getElementById('profilePhotoRight')) {
	                    document.getElementById('profilePhotoRight').src = response;
	                }
                    pageTracker._trackPageview("/user/profile/upload-photo");
                } else {
                    alert(response);
                }
                // hide loading indicator
                if (document.getElementById('profilePhotoRightLoading')) {
	            	document.getElementById('profilePhotoRightLoading').style.display = 'none';
	            }
	            if (document.getElementById('profilePhotoRight')) {
	            	document.getElementById('profilePhotoRight').style.display = '';
	            }
            };
            // set form action (may be changed when submitting profile photo)
            document.getElementById(formName).action = document.getElementById(formName).action_photo.value;
            // show loading indicator
            if (document.getElementById('profilePhotoRightLoading')) {
	           	document.getElementById('profilePhotoRightLoading').style.display = '';
	        }
	        if (document.getElementById('profilePhotoRight')) {
           		document.getElementById('profilePhotoRight').style.display = 'none';
           	}
            AIM.submit(document.getElementById(formName), { 'onComplete' : onComplete_fn });
            document.getElementById(formName).submit();
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitFeedbackForm(formName) {
    if (document.getElementById) {
        if (validateFeedbackForm(document.getElementById(formName))) {
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                } else {
                    showCustomRight(SITE_PREFIX+"partials/feedback/confirm.php");
                    pageTracker._trackPageview("/feedback/confirm");
                }
            };
            ajaxSubmitForm(formName, onSuccess_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitCreateGroupForm(formName, userid) {
    if (document.getElementById) {
        if (validateCreateGroupForm(document.getElementById(formName))) {
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                } else {
                    showCustomRight(SITE_PREFIX+"partials/group/create/confirm.php");
                    showUserGroups(userid);
                    pageTracker._trackPageview("/group/create/confirm");
                }
            };
            ajaxSubmitForm(formName, onSuccess_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitEditGroupForm(formName, userid) {
    if (document.getElementById) {
        if (validateEditGroupForm(document.getElementById(formName))) {
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else if (response.responseText != AJAX_SUCCESS) {
                    alert(response.responseText);
                } else {
                    showCustomRight(SITE_PREFIX+"partials/group/edit/confirm.php");
                    showUserGroups(userid);
                    pageTracker._trackPageview("/group/edit/confirm");
                }
            };
            ajaxSubmitForm(formName, onSuccess_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitSearchForm(formName, page) {
    if (document.getElementById) {
        if (validateSearchForm(document.getElementById(formName))) {
            if (!(page === undefined)) {
                document.getElementById(formName).page.value = page;
            }
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else {
                    document.getElementById('bodyLeft').innerHTML = response.responseText;
                    document.getElementById('search_query').select();
                    document.getElementById('search_query').focus();
                    pageTracker._trackPageview("/search");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
            }
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function submitSearchFormRight(formName, page) {
    if (document.getElementById) {
        if (validateSearchForm(document.getElementById(formName))) {
            if (!(page === undefined)) {
                document.getElementById(formName).page.value = page;
            }
            var onSuccess_fn = function(response) {
                if (response.responseText == AJAX_FAILURE) {
                    ajaxError();
                } else {
                    // update tabs
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides-other_on.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    scrollToTop('bodyLeft');
                    document.getElementById('bodyLeft').innerHTML = response.responseText;
                    document.getElementById('search_query_right').value = '';
                    document.getElementById('search_query_right').onblur();
                    document.getElementById('search_query').select();
                    document.getElementById('search_query').focus();
                    pageTracker._trackPageview("/search");
                }
            };
            var onFailure_fn = function(response) {
                ajaxError();
            }
            ajaxSubmitForm(formName, onSuccess_fn, onFailure_fn);
        }
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// AJAX functions
/////////////////////////////////////////////////////////////////////////////

function noAjax() {
    alert("Your browser does not support the modern JavaScript features needed to use this web site.  We apologize for the inconvenience.");
}

/////////////////////////////////////////////////////////////////////////////

function ajaxError() {
    alert("There was an error processing your request.  Please try again later.  We apologize for the inconvenience.");
}

/////////////////////////////////////////////////////////////////////////////

function setAjaxRunning(status) {
    ajaxRunning = status;
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - General
/////////////////////////////////////////////////////////////////////////////

function showCustomLeft(url, tabs_src_user, tabs_usemap_user, tabs_src_public, tabs_usemap_public) {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, url, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        if (!(tabs_src_user === undefined)) {
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+tabs_src_user;
                            if (!(tabs_usemap_user === undefined)) {
                                document.getElementById('leftTabsImage').useMap = tabs_usemap_user;
                            }
                        }
                    } else {
                        if (!(tabs_src_public === undefined)) {
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+tabs_src_public;
                            if (!(tabs_usemap_public === undefined)) {
                                document.getElementById('leftTabsImage').useMap = tabs_usemap_public;
                            }
                        }
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showCustomRight(url, tabs_src_user, tabs_usemap_user, tabs_src_public, tabs_usemap_public) {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, url, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    if (logged_in) {
                        if (!(tabs_src_user === undefined)) {
                            document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+tabs_src_user;
                            if (!(tabs_usemap_user === undefined)) {
                                document.getElementById('rightTabsImage').useMap = tabs_usemap_user;
                            }
                        }
                    } else {
                        if (!(tabs_src_public === undefined)) {
                            document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+tabs_src_public;
                            if (!(tabs_usemap_public === undefined)) {
                                document.getElementById('rightTabsImage').useMap = tabs_usemap_public;
                            }
                        }
                    }
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - News
/////////////////////////////////////////////////////////////////////////////

function showNews(category, page) {
    if (document.getElementById) {
        var params = '';
        if (!(category === undefined) && category.length) {
            params += '?category='+encodeURIComponent(category);
        }
        if (!(page === undefined)) {
        	params += (params.length ? '&' : '?');
            params += 'p='+encodeURIComponent(page);
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/news.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    if (logged_in) {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news_on-map-photos-message_board-members-welcome.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    } else {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news_on-map-photos-sign_up-welcome.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    }
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    scrollToTop('bodyRight');
                    var newsAddress = '/news';
                    if (!(category === undefined) && category.length) {
                    	newsAddress += '/'+encodeURIComponent(category);
                    }
                    if (!(page === undefined)) {
                        newsAddress += '/'+encodeURIComponent(page);
                    }
                    pageTracker._trackPageview(newsAddress);
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Map
/////////////////////////////////////////////////////////////////////////////

// called by Flash when map init is complete
function setMapIsReady(status) {
	mapIsReady = status;
}

/////////////////////////////////////////////////////////////////////////////

function showMap(params) {
    if (document.getElementById) {
        // prepare commands to set map mode
        if (params === undefined) {
            var params = '';
        }
        if (!params.length) {
            // see if a particular group is selected
            if (document.getElementById('groupMapLink')) {
                document.getElementById('groupMapLink').onclick();
                return;
            } else {
                params = 'userMode=private';
            }
        }
        // hide right content
        document.getElementById('bodyRight').style.display = 'none';
        // update tabs
        if (logged_in) {
            document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map_on-photos-message_board-members-welcome.gif';
            document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
        } else {
            document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map_on-photos-sign_up-welcome.gif';
            document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
        }
        // show content
        document.getElementById('bodyRightMap').style.display = '';
        setMapMode(params);
        pageTracker._trackPageview("/map?"+params);
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function getMapObject() {
    if (document.getElementById) {
        var wrapperObj = document.getElementById('bodyRightMap');
        for (var i=0; i<wrapperObj.childNodes.length; i++) {
            if (wrapperObj.childNodes[i].tagName == 'EMBED') {
                return wrapperObj.childNodes[i];
            }            
        }
    }
	var isIE = (navigator.appName.indexOf("Microsoft") != -1);
	return (isIE) ? window['mapFlash'] : document['mapFlash'];
}

/////////////////////////////////////////////////////////////////////////////

function setMapMode(params) {
    // available variables are as follows
    //   userMode=private
    //   userMode=group
    //   userMode=public
    //   typeMode=glides
    //   typeMode=places
    //   groupID=
    //   userID=
    //   sessionID=
    //   glideID=
    //   placeID=
    //   city=
    //   state=
    //   postalCode=
    //   country=
    var mapObj = getMapObject();
    if (!mapObj || !mapObj.reInitFlash || !mapIsReady) {
        // Flash not initialized yet; retry in a moment
        var mapModeTimer = setTimeout("setMapMode('"+params+"')", 250);
        return;
    }

    if (params === undefined) {
        params = '';
    }
    // Flash app requires leading ampersand
    params = '&sessionID='+encodeURIComponent(sessionID())+'&'+params;
    mapObj.reInitFlash(params);
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Photos
/////////////////////////////////////////////////////////////////////////////

function showPhotos(kind, id) {
    if (document.getElementById) {
        var params = '';
        if (!(kind === undefined) && !(id === undefined)) {
        	if (kind == 'group') {
            	params = '?groupid='+encodeURIComponent(id);
            } else if (kind == 'user') {
            	params = '?userid='+encodeURIComponent(id);
            }
        } else if ((kind === undefined) || (kind == 'all')) {
            // see if a particular group is selected
            if (document.getElementById('groupPhotosLink')) {
                document.getElementById('groupPhotosLink').onclick();
                return;
            }
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/photos.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    if (logged_in) {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos_on-message_board-members-welcome.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    } else {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos_on-sign_up-welcome.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    }
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    if (!(kind === undefined) && !(id === undefined)) {
                       	if (kind == 'group') {
                            pageTracker._trackPageview("/group/photos/group"+encodeURIComponent(id));
                        } else if (kind == 'user') {
                            pageTracker._trackPageview("/user/photos/user"+encodeURIComponent(id));
                        } else {
                            pageTracker._trackPageview("/photos");
                        }
                    } else {
                        pageTracker._trackPageview("/photos");
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function updatePhoto(src, href, owner, title) {
    var htmlReplacements = {
        "<": "&lt;",
        ">": "&gt;",
        "&": "&amp;",
        "\"": "&quot;"
    };

    if (document.getElementById) {
        if (href === undefined) {
            document.getElementById('photoLink').href = '#';
            document.getElementById('photoTitle').href = '#';
            document.getElementById('photoOwner').href = '#';
        } else {
            document.getElementById('photoLink').href = href+'/in/pool-segwaysocial';
            document.getElementById('photoTitle').href = href+'/in/pool-segwaysocial';
            document.getElementById('photoOwner').href = href;
        }
        if (!(owner === undefined)) {
            owner = owner.replace(/[<>&"]/g, function(char) { return htmlReplacements[char]; });
        } else {
            owner = '';
        }
        if (!(title === undefined)) {
            title = title.replace(/[<>&"]/g, function(char) { return htmlReplacements[char]; });
        } else {
            title = '';
        }
        document.getElementById('photoTitle').innerHTML = title;
        document.getElementById('photoOwner').innerHTML = owner;
        if (!title.length && !owner.length) {
            // special case for "add photos" frame
            document.getElementById('photoInfo').style.display = 'none';
            document.getElementById('photoLink').href = href;
        } else {
            document.getElementById('photoInfo').style.display = '';
        }
        if (!(src === undefined)) {
            document.getElementById('photo').src = src;
        }
    }
}

/////////////////////////////////////////////////////////////////////////////

function showPhotoPage(page, kind, id) {
    if (document.getElementById) {
    	var params = '?';
        if (!(kind === undefined) && !(id === undefined)) {
        	if (kind == 'group') {
            	params += 'groupid='+encodeURIComponent(id);
            } else if (kind == 'user') {
            	params += 'userid='+encodeURIComponent(id);
            }
        }
		if (params.length) {
			params += '&';
		}
        params += 'page='+encodeURIComponent(page);
        // retrieve content
        new Ajax.Updater( { success: 'bodyRightBottom' }, SITE_PREFIX+"partials/photos.php"+params, {
                asynchronous: false,
                onFailure: ajaxError
            });
        if (!(kind === undefined) && !(id === undefined)) {
        	if (kind == 'group') {
        		if (page) {
	                pageTracker._trackPageview("/group/photos/group"+encodeURIComponent(id)+"/page/"+encodeURIComponent(page));
	            } else {
	                pageTracker._trackPageview("/group/photos/group"+encodeURIComponent(id));
        		}
            } else if (kind == 'user') {
        		if (page) {
	                pageTracker._trackPageview("/user/photos/user"+encodeURIComponent(id)+"/page/"+encodeURIComponent(page));
	            } else {
	                pageTracker._trackPageview("/user/photos/user"+encodeURIComponent(id));
        		}
            }
        } else if (!(page === undefined)) {
            pageTracker._trackPageview("/photos/page/"+encodeURIComponent(page));
        } else {
            pageTracker._trackPageview("/photos");
        }
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Sign Up, Password Reset
/////////////////////////////////////////////////////////////////////////////

// show sign-up intro page
function showSignUp() {
    if (document.getElementById) {
        var params = '';
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/sign_up/intro.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when not logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-sign_up_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    // show content
                    document.getElementById('bodyRight').style.overflow = 'hidden';
                    document.getElementById('bodyRight').style.display = '';
                    scrollToTop('bodyRight');
                    document.getElementById('bodyRight').style.overflow = 'auto';
                    pageTracker._trackPageview("/user/sign-up/intro");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

// show future owner sign-up form
function showSignUpProspectForm() {
    if (document.getElementById) {
        var params = '';
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/sign_up/form.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when not logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-sign_up_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/user/sign-up/prospect/form");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

// show existing owner sign-up form
function showSignUpOwnerForm() {
    if (document.getElementById) {
        // set time zone from browser automatically
        var userDate = new Date();
        var timezone_gmt_offset = -1 * userDate.getTimezoneOffset() / 60;
        var params = '?timezone_gmt_offset='+encodeURIComponent(timezone_gmt_offset);
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/user/create/form.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when not logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-sign_up_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/user/sign-up/owner/form");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showPasswordReset() {
    if (document.getElementById) {
        var params = '';
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/user/reset/form.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when not logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-sign_up_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/user/reset-password/form");
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Message Board
/////////////////////////////////////////////////////////////////////////////

function showMessageBoard(groupid, page, posted) {
    if (document.getElementById) {
        var params = '';
        if (!(groupid === undefined)) {
            params = '?groupid='+encodeURIComponent(groupid);
            if (!(page === undefined)) {
                params += '&p='+encodeURIComponent(page);
            }
            if (!(posted === undefined)) {
                params += '&posted=1';
            }
        } else {
            // see if a particular group is selected
            if (document.getElementById('groupMessagesLink')) {
                document.getElementById('groupMessagesLink').onclick();
                return;
            }
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/group/messages/view.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board_on-members-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    if (params.length) {
                        if (!(page === undefined)) {
                            pageTracker._trackPageview("/group/messages/group"+encodeURIComponent(groupid)+"/page/"+encodeURIComponent(page));
                        } else {
                            pageTracker._trackPageview("/group/messages/group"+encodeURIComponent(groupid));
                        }
                    } else {
                        pageTracker._trackPageview("/group/messages");
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function postReply(messageid) {
    if (document.getElementById) {
        var subject = document.getElementById('subject'+messageid).innerHTML;
        if (subject.substring(0, 4) == "Re: ") {
            subject = subject.substring(4);
        }
        if (subject.length) {
            document.getElementById('subject').value = "Re: "+subject;
        } else {
            document.getElementById('subject').focus();
        }
        var author = document.getElementById('author'+messageid).innerHTML;
        if (author.length) {
            document.getElementById('message').focus();
            document.getElementById('message').value = "@"+author+": ";
        } else {
            if (subject.length) {
                document.getElementById('message').focus();
            }
        }
        scrollToTop('bodyRight');
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Members
/////////////////////////////////////////////////////////////////////////////

function showMembers() {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/members.php", {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/members");
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Welcome
/////////////////////////////////////////////////////////////////////////////

function showWelcome() {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/welcome.php", {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    if (logged_in) {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members-welcome_on.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    } else {
                        document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-sign_up-welcome_on.gif';
                        document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_signup_welcome';
                    }
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/welcome");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

// select a specified content area within the Welcome tab
function showWelcomeArea(areaName) {
    var welcomeAreas = new Array(
        'welcome',
        'map',
        'groups',
        'photos',
        'members'
    );

    // hide other content areas
    for (var i=0; i<welcomeAreas.length; i++) {
        if (welcomeAreas[i] != areaName) {
            document.getElementById('welcomeArea_'+welcomeAreas[i]).style.display = 'none';
        }
    }
    // show specified area
    document.getElementById('welcomeArea_'+areaName).style.display = '';
}

/////////////////////////////////////////////////////////////////////////////

function calculateWelcomeSavings(formObj) {
    formObj.savings_total.value = '';

    var price = formObj.savings_price.value;
    var days = formObj.savings_days.value;

    if (price.length && days.length &&
        !isNaN(price) && !isNaN(days)) {
        price = parseFloat(price);
        days = parseInt(days);

        var total = Math.round(price * days * 100) / 100;
        formObj.savings_total.value = total.toFixed(2);
    }
}

/////////////////////////////////////////////////////////////////////////////
// Content functions - Dashboard
/////////////////////////////////////////////////////////////////////////////

function updateDashboard() {
    if (document.getElementById) {
        // retrieve content
		new Ajax.Updater( { success: 'dashboard' }, SITE_PREFIX+"partials/dashboard.php", {
				asynchronous: false,
				onFailure: ajaxError
		});
	}
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Feedback
/////////////////////////////////////////////////////////////////////////////

function showFeedback() {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/feedback/form.php", {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members-welcome-other_on.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/feedback/form");
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - User Profiles
/////////////////////////////////////////////////////////////////////////////

function editProfile() {
    if (document.getElementById) {
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/user/edit/form.php", {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members-welcome-other_on.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/user/profile/edit/form");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function sendVerificationCode() {
    if (document.getElementById) {
        new Ajax.Request( SITE_PREFIX+"partials/user/send_verification_code.php", {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function(response) {
                    if (response.responseText == AJAX_FAILURE) {
                        ajaxError();
                    } else if (response.responseText != AJAX_SUCCESS) {
                        alert(response.responseText);
                    } else {
                        pageTracker._trackPageview("/user/send-verification");
                        alert("A verification message has been sent to your email address.\n"+
                        "You must click the verification link in the email in order to fully activate your account.\n"+
                        "If you don't see the email in your inbox, be sure to look in your junk mail folder.");
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showUserProfileBasic(userid) {
    var basic = 1;
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid)
        + '&basic='+encodeURIComponent(basic);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/user/profile.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides-quick_profile_on.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    scrollToTop('bodyLeft');
                    pageTracker._trackPageview("/user/profile/user"+encodeURIComponent(userid)+"/quick");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showUserProfileFull(userid) {
    var basic = 0;
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid)
        + '&basic='+encodeURIComponent(basic);
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/user/profile.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members_on-welcome.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
			        scrollToTop('bodyRight');
                    document.getElementById('note').focus();
                    pageTracker._trackPageview("/user/profile/user"+encodeURIComponent(userid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showUserNotes(userid, page, posted) {
    if (document.getElementById) {
        var params = '';
        if (!(userid === undefined)) {
            params = '?userid='+encodeURIComponent(userid);
            if (!(page === undefined)) {
                params += '&p='+encodeURIComponent(page);
            }
            if (!(posted === undefined)) {
                params += '&posted=1';
            }
        }
        // retrieve content
        new Ajax.Updater( { success: 'userNotes' }, SITE_PREFIX+"partials/user/notes/view.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    if (params.length) {
                        if (!(page === undefined)) {
                            pageTracker._trackPageview("/user/notes/user"+encodeURIComponent(userid)+"/page/"+encodeURIComponent(page));
                        } else {
                            pageTracker._trackPageview("/user/notes/user"+encodeURIComponent(userid));
                        }
                    } else {
                        pageTracker._trackPageview("/user/notes");
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function deleteUserNote(noteid, userid, page) {
    if (document.getElementById) {
        if (confirm("Are you sure you wish to delete this note?")) {
            new Ajax.Request( SITE_PREFIX+"partials/user/notes/delete.php", {
                    method: 'post',
                    parameters: 'noteid='+encodeURIComponent(noteid),
                    asynchronous: false,
                    onFailure: ajaxError,
                    onSuccess: function(response) {
                        if (response.responseText == AJAX_SUCCESS) {
//                            alert("The note has been deleted.");
                            pageTracker._trackPageview("/user/notes/delete/note"+encodeURIComponent(noteid));
							showUserNotes(userid, page);
                        } else {
                            alert("There was an error deleting the note. Please try again later.");
                        }
                    }
                });
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showUserSphere(userid) {
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/user/sphere.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides-other_on.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    scrollToTop('bodyLeft');
                    pageTracker._trackPageview("/user/profile/user"+encodeURIComponent(userid)+"/quick");
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Groups
/////////////////////////////////////////////////////////////////////////////

function showUserGroups(userid) {
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/user/groups.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    // only available when logged in
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups_on-places-glides.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    pageTracker._trackPageview("/user/groups/user"+encodeURIComponent(userid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showGroup(groupid) {
    var basic = 0;
    if (!logged_in) {
        basic = 1;
    }
    if (document.getElementById) {
        var params = '?groupid='+encodeURIComponent(groupid)
        + '&basic='+encodeURIComponent(basic);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/group/details.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups_on-places-glides.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    } else {
                        if ((featured_groupid === undefined) ||
                            (groupid != featured_groupid)) {
                            // show details tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-featured_group-details_on.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        } else {
                            // show featured group tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tab-featured_group.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        }
                    }
                    scrollToTop('bodyLeft');
                    pageTracker._trackPageview("/group/details/group"+encodeURIComponent(groupid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showCreateGroup() {
    if (document.getElementById) {
        var params = '';
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/group/create/form.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members-welcome-other_on.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/group/create/form");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function joinGroup(groupid, userid, goToMyGroups) {
    if (goToMyGroups === undefined) {
    	if (userid === undefined) {
    		goToMyGroups = false;
    	} else {
        	goToMyGroups = true;
        }
    }
    if (document.getElementById) {
        new Ajax.Request( SITE_PREFIX+"partials/group/join.php", {
                method: 'post',
                parameters: 'groupid='+encodeURIComponent(groupid),
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function(response) {
                    if (response.responseText == AJAX_SUCCESS) {
                        alert("You are now a member of the group. Welcome!\n\n"
                            + "You can keep track of your group memberships through the Groups tab.");
                        if (goToMyGroups) {
                            showUserGroups(userid);
                        }
                        updateDashboard();
                        pageTracker._trackPageview("/group/join/group"+encodeURIComponent(groupid));
                    } else {
                        ajaxError();
                    }
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function leaveGroup(groupid, group_name, userid) {
    if (document.getElementById) {
        if (confirm("Are you sure you wish to leave the '"+group_name+"' group?\n\n"
            + "You may rejoin the group later if you change your mind.")) {
            new Ajax.Request( SITE_PREFIX+"partials/group/leave.php", {
                    method: 'post',
                    parameters: 'groupid='+encodeURIComponent(groupid),
                    asynchronous: false,
                    onFailure: ajaxError,
                    onSuccess: function(response) {
                        if (response.responseText == AJAX_SUCCESS) {
                            alert("You are no longer a member of the group.");
                            showUserGroups(userid);
                            updateDashboard();
                            pageTracker._trackPageview("/group/leave/group"+encodeURIComponent(groupid));
                        } else {
                            ajaxError();
                        }
                    }
                });
        }
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function editGroup(groupid) {
    if (document.getElementById) {
        var params = '';
        if (!(groupid === undefined)) {
            params = '?groupid='+encodeURIComponent(groupid);
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyRight' }, SITE_PREFIX+"partials/group/edit/form.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // hide map content
                    document.getElementById('bodyRightMap').style.display = 'none';
                    // update tabs
                    // only available when logged in
                    document.getElementById('rightTabsImage').src = RIGHT_TABS_DIR+'tabs-news-map-photos-message_board-members-welcome-other_on.gif';
                    document.getElementById('rightTabsImage').useMap = '#rightMap_news_map_photos_messageboard_members_welcome';
                    // show content
                    document.getElementById('bodyRight').style.display = '';
                    pageTracker._trackPageview("/group/edit/form");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function deleteGroup(groupid, group_name, userid) {
    if (document.getElementById) {
        if (confirm("Are you sure you wish to disband the '"+group_name+"' group?\n\n"
            + "The group and its message board will be deleted.")) {
            new Ajax.Request( SITE_PREFIX+"partials/group/delete.php", {
                    method: 'post',
                    parameters: 'groupid='+encodeURIComponent(groupid),
                    asynchronous: false,
                    onFailure: ajaxError,
                    onSuccess: function(response) {
                        if (response.responseText == AJAX_SUCCESS) {
                            alert("The group has been removed.");
                            showUserGroups(userid);
                            pageTracker._trackPageview("/group/delete/group"+encodeURIComponent(groupid));
                        } else {
                            alert("There was an error deleting the group. Please try again later.\n\n"
                                + "Groups may only be deleted if no other users have joined.");
                        }
                    }
                });
        }
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Places
/////////////////////////////////////////////////////////////////////////////

function showUserPlaces(userid) {
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/user/places.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    // only available when logged in
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places_on-glides.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    pageTracker._trackPageview("/user/places/user"+encodeURIComponent(userid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showPlace(placeid) {
    if (document.getElementById) {
        var params = '?placeid='+encodeURIComponent(placeid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/place/details.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places_on-glides.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    } else {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-featured_group-details_on.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                    }
                    scrollToTop('bodyLeft');
                    pageTracker._trackPageview("/place/details/place"+encodeURIComponent(placeid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showGroupPlaces(groupid) {
    if (document.getElementById) {
        var params = '?groupid='+encodeURIComponent(groupid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/group/places.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places_on-glides.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    } else {
                        if ((featured_groupid === undefined) ||
                            (groupid != featured_groupid)) {
                            // show details tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-featured_group-details_on.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        } else {
                            // show featured group tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tab-featured_group.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        }
                    }
                    pageTracker._trackPageview("/group/places/group"+encodeURIComponent(groupid));
                }
            });
    } else {
        noAjax();
    }
}


/////////////////////////////////////////////////////////////////////////////
// Content functions - Glides
/////////////////////////////////////////////////////////////////////////////

function showUserGlides(userid) {
    if (document.getElementById) {
        var params = '?userid='+encodeURIComponent(userid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/user/glides.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    // only available when logged in
                    document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides_on.gif';
                    document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    pageTracker._trackPageview("/user/glides/user"+encodeURIComponent(userid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showGlide(glideid) {
    if (document.getElementById) {
        var params = '?glideid='+encodeURIComponent(glideid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/glide/details.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides_on.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    } else {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-featured_group-details_on.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                    }
                    scrollToTop('bodyLeft');
                    pageTracker._trackPageview("/glide/details/glide"+encodeURIComponent(glideid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showGroupGlides(groupid) {
    if (document.getElementById) {
        var params = '?groupid='+encodeURIComponent(groupid);
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/group/glides.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // update tabs
                    if (logged_in) {
                        document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-groups-places-glides_on.gif';
                        document.getElementById('leftTabsImage').useMap = '#leftMap_groups_places_glides';
                    } else {
                        if ((featured_groupid === undefined) ||
                            (groupid != featured_groupid)) {
                            // show details tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tabs-featured_group-details_on.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        } else {
                            // show featured group tab
                            document.getElementById('leftTabsImage').src = LEFT_TABS_DIR+'tab-featured_group.gif';
                            document.getElementById('leftTabsImage').useMap = '#leftMap_featuredgroup';
                        }
                    }
                    pageTracker._trackPageview("/group/glides/group"+encodeURIComponent(groupid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////
// Content functions - Search
/////////////////////////////////////////////////////////////////////////////

function searchGroupDetails(groupid) {
    if (document.getElementById) {
        var params = '?groupid='+encodeURIComponent(groupid);
        // retrieve content
        new Ajax.Updater( { success: 'group'+groupid+'details' }, SITE_PREFIX+"partials/group/details-search.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    pageTracker._trackPageview("/group/details/group"+encodeURIComponent(groupid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function searchPlaceDetails(placeid) {
    if (document.getElementById) {
        var params = '?placeid='+encodeURIComponent(placeid);
        // retrieve content
        new Ajax.Updater( { success: 'place'+placeid+'details' }, SITE_PREFIX+"partials/place/details-search.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    pageTracker._trackPageview("/place/details/place"+encodeURIComponent(placeid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function searchGlideDetails(glideid) {
    if (document.getElementById) {
        var params = '?glideid='+encodeURIComponent(glideid);
        // retrieve content
        new Ajax.Updater( { success: 'glide'+glideid+'details' }, SITE_PREFIX+"partials/glide/details-search.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    pageTracker._trackPageview("/glide/details/glide"+encodeURIComponent(glideid));
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////
// Content functions - Show All
/////////////////////////////////////////////////////////////////////////////

function showAllGroups(page) {
    if (document.getElementById) {
        var params = '?show_all=1';
        if (!(page === undefined)) {
            params += '&page='+encodeURIComponent(page);
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/search/groups.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // no change to tabs
                    pageTracker._trackPageview("/search/show-all/groups");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showAllPlaces(page) {
    if (document.getElementById) {
        var params = '?show_all=1';
        if (!(page === undefined)) {
            params += '&page='+encodeURIComponent(page);
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/search/places.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // no change to tabs
                    pageTracker._trackPageview("/search/show-all/places");
                }
            });
    } else {
        noAjax();
    }
}

/////////////////////////////////////////////////////////////////////////////

function showAllGlides(page) {
    if (document.getElementById) {
        var params = '?show_all=1';
        if (!(page === undefined)) {
            params += '&page='+encodeURIComponent(page);
        }
        // retrieve content
        new Ajax.Updater( { success: 'bodyLeft' }, SITE_PREFIX+"partials/search/glides.php"+params, {
                asynchronous: false,
                onFailure: ajaxError,
                onSuccess: function() {
                    // no change to tabs
                    pageTracker._trackPageview("/search/show-all/glides");
                }
            });
    } else {
        noAjax();
    }
}
