$dom = YAHOO.util.Dom;
$event = YAHOO.util.Event;
function $(a) {
    return $dom.get(a);
}

/******** BEGIN HELPER FUNCTIONS ********/
var helpers = {};

helpers.COOKIE_PARAMS = {path: '/', expires: new Date("January 12, 2025")}

helpers.trim_string = function(string) {
    while (string.length > 0 && (string.charAt(0) == ' ' || string.charAt(0) == String.fromCharCode(10))) {
        string = string.substr(1);
    }
    while (string.length > 0 && (string.charAt(string.length - 1) == ' ' || string.charAt(string.length - 1) == String.fromCharCode(10))) {
        string = string.substr(0, string.length - 1);
    }
    return string;
}

helpers.get_url_fragment = function(url) {
    var url_parts = url.split('#');
    if (url_parts.length == 2) {
        return url_parts[1];
    } else {
        return '';
    }
}
/******** END HELPER FUNCTIONS ********/


/******** BEGIN TRACKING FUNCTIONS ********/
function search_form_submit(e) {
    var search_form = $event.getTarget(e);
    $event.preventDefault(e);
    if (search_form['q'].value) {
        try {
            pageTracker._trackPageview('/search?q=' + encodeURIComponent(search_form['q'].value));
        } catch(err) {}
        search_form.submit();
    }
}

function setup_custom_event_tracking() {
    $event.addListener('header_search_form', 'submit', search_form_submit);
    $event.addListener('search_page_search_form', 'submit', search_form_submit);
    $event.addListener(
        'ask-question-form',
        'submit',
        function (e) {
            if (! $('question').value) {
                $event.preventDefault(e);
            }
        }
    );
    $dom.getElementsByClassName(
        'compare-remove-form',
        'form',
        null,
        function (element) {
            $event.addListener(
                element, 
                'submit', 
                function(e) {
                    track_monetization_event('Compare', 'ComparePageRemoveProduct');
                }
            );
        }
    );
}

function track_monetization_event(event_category, event_action, event_label) {
    if (event_category && event_action && window.pageTracker) {
        if (! event_label) {
            event_label = null;
        }
        try {
            pageTracker._trackEvent(event_category, event_action, event_label);
        } catch(err) {}
    }
    return true;
}
/******** END TRACKING FUNCTIONS ********/


var timer = new Object;
timer.labels = new Object;
timer.indent = 0;
timer.start = function(label) {
    timer.labels[label] = new Array();
    timer.indent += 1; 
    timer.labels[label]['indent'] = timer.indent; 
    var dt = new Date();
    timer.labels[label]['start'] = dt.getTime(); 
}
timer.end = function(label) {
    var dt = new Date();
    timer.indent -= 1;
    timer.labels[label]['end'] = dt.getTime(); 
}
timer.report = function() {
    var data = "Times:\n";
    for (var label in timer.labels) {
        var report = timer.labels[label];
        var delta = report['end'] - report['start'];
        for (var i=0; i<report['indent']; i++) {
            data += '  ';
        } 
        data += label + ': ' + delta + "\n";
    }
    alert(data); 
}

var is_debug_alert_on = false;
function debug_alert(text) {
    if (is_debug_alert_on) {
        alert(text);
    }
}

function create_cookie(name, value, days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

function get_cookie(name) {
    var name = name + "=";
    var cookies = document.cookie.split(';');

    for (var i=0; i<cookies.length; i++) {
        var cookie = helpers.trim_string(cookies[i]);
        if (cookie.indexOf(name) == 0) {
            return cookie.substring(name.length, cookie.length);
        }
    }
    return null;
}

function erase_cookie(name) {
    create_cookie(name, "", -1);
}

/**
function set_products_per_page(products_per_page) {
    create_cookie("NP", products_per_page);
    return true;
}
*/


function setup_prices_zip_code() {
    var zip_code_form = $('prices_zip_code_form');
    var zip_code_field = $('prices_zip_code_field');
    if (zip_code_form && zip_code_field) {
        $event.addListener(zip_code_form, 'submit', function(e) {
            $event.preventDefault(e);
            YAHOO.util.Cookie.set('zip', zip_code_field.value, helpers.COOKIE_PARAMS);
            location.reload();
        });
        $event.addListener(zip_code_field, 'click', function(e) {
            if (zip_code_field.value == zip_code_field.defaultValue) {
                zip_code_field.value = '';
            }
        });
    }
}

/**
function submit_subscribe_form(e) {
    authenticate(
        e, 
        function(target) {
            var subscribe_form = $('subscribe-form');
            if (subscribe_form) {
                subscribe_form.submit();
            }
        }
    );
}

function visit_target_link(target) { 
    location.href = target.href; 
}

function go_to_answer_question(e) {
    authenticate(e, visit_target_link);
}

function setup_question_action_links() {
    $event.addListener(['subscribe-link1', 'subscribe-link2'], 'click', submit_subscribe_form);
    $event.addListener(['answer-link1', 'answer-link2'], 'click', go_to_answer_question);
}

function go_to_write_review(e) {
    authenticate(e, visit_target_link);
}

function submit_microcomment(e) {
    authenticate(
        e,
        function(target) {
            var parent_form = $dom.getAncestorByTagName(target, 'form');
            if (parent_form) {
                parent_form.submit();
            }
        }
    );
}


function setup_microcomment_links() {
    $dom.getElementsByClassName(
        'microcomment-link', 
        'a', 
        'all-microcomments', 
        function(element) {
            $event.addListener(element, 'click', submit_microcomment);
        }
    );
    $dom.getElementsByClassName(
        'product-microcomment-link', 
        'a', 
        'all-product-microcomments', 
        function(element) {
            $event.addListener(element, 'click', submit_microcomment);
        }
    );
    $event.addListener(['write-review-link1', 'write-review-link2'], 'click', go_to_write_review);
}

function setup_clickable_snippets() {
    $dom.getElementsByClassName(
        'clickable_snippet',
        'div', 
        'all_clickable_snippets',
        function(ctr) {
            $event.addListener(ctr, 'click', onclick_clickable_snippet);
        }
    );
}

function onclick_clickable_snippet(e) {
    var click_target = $event.getTarget(e);
    var is_a_link = false;
    var click_tag = click_target.tagName.toLowerCase()
    if (click_tag == 'a' || click_tag == 'button') {
        is_a_link = true;
    } else {
        is_a_link = $dom.getAncestorByTagName(click_target, 'a');
    }
    // If the clicked element is not surrounded by a link (and is not itself a link) 
    // then mimic the on-click functionality of a link for tracking purposes.
    if (! is_a_link) {
        var container = $dom.getAncestorByClassName(click_target, 'clickable_snippet_container');
        if (container) {
            var review_links = container.getElementsByTagName('a');
            if (review_links.length > 0) {
                location.assign(review_links[0].href);
                
                // CALL HEATMAP CODE HERE!!!
                
            }
        }
    }
}

function setup_snippet_containers() {
    foo = $dom.getElementsByClassName(
        'hoverable_snippet',
        'div', 
        'all_hoverable_snippets_container',
        function(ctr) {
            $event.addListener(ctr, 'click', onclick_snippet);
            $event.addListener(ctr, 'mouseover', onmouseover_snippet);
            $event.addListener(ctr, 'mouseout', onmouseout_snippet);
        }
    );
}

function onmouseover_snippet(e) {
    var ctr = $event.getTarget(e);
    ctr = $dom.getAncestorBy(ctr, 
        function(elt) { 
            return $dom.hasClass(elt, 'hoverable_snippet'); 
        }
    );
    if (ctr) {
        $dom.addClass(ctr, 'quoted_selected');
        $dom.removeClass(ctr, 'quoted');
    }
}

function onmouseout_snippet(e) {
    var ctr = $event.getTarget(e);
    ctr = $dom.getAncestorBy(ctr, 
        function(elt) { 
            return $dom.hasClass(elt, 'hoverable_snippet'); 
        }
    );
    if (ctr) {
        $dom.addClass(ctr, 'quoted');
        $dom.removeClass(ctr, 'quoted_selected');
    }
}

function onclick_snippet(e) {
    var click_target = $event.getTarget(e);
    var is_a_link = false;
    if (click_target.tagName.toLowerCase() == 'a') {
        is_a_link = true;
    } else {
        is_a_link = $dom.getAncestorByTagName(click_target, 'a');
    }
    // If the clicked element is not surrounded by a link (and is not itself a link) 
    // then mimic the on-click functionality of a link for tracking purposes.
    if (! is_a_link) {
        var container = $dom.getAncestorByClassName(click_target, 'hoverable_snippet');
        if (container) {
            var review_links = container.getElementsByTagName('a');
            if (review_links.length > 0) {
                location.assign(review_links[0].href);
                
                // CALL HEATMAP CODE HERE!!!
                
            }
        }
    }
}


function setup_flashing_message() {
    var flashing_message_animation = new YAHOO.util.ColorAnim(
        'flashing-message', 
        {backgroundColor: { to: '#fff' }}, 
        1.5, 
        YAHOO.util.Easing.easeIn
    );
    flashing_message_animation.animate();
}

function question_page_login(e) {
    authenticate(
        e, 
        function(target) {
            $dom.getElementsByClassName(
                'login_required_fields', 
                'div', 
                'post_question_form',
                function(element) {
                    $dom.setStyle(element, 'display', 'block');
                }
            );
            $dom.setStyle('signup_controls', 'display', 'none');
        }
    );
}

function question_form_submit(e) {
    authenticate(
        e, 
        function(target) {
            var post_question_form = $('post_question_form');
            if (post_question_form) {
                post_question_form.submit();
            }
        }
    );
}

function setup_q_and_a_form_authentication() {
    $event.addListener('post_question_form', 'submit', question_form_submit);
    $event.addListener(['signin_or_signup_link', 'signin_link', 'signup_link'], 'click', question_page_login);
}

function tip_form_submit(e) {
    authenticate(
        e, 
        function(target) {
            var tip_form = $('tip_form');
            if (tip_form) {
                tip_form.submit();
            }
        }
    );
}

function get_query_arguments_from_url() {
    var args = new Object();
    var query = location.search.substring(1);
    var pairs = query.split("&");
    
    for (var i=0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');
        if (pos == -1) {
            continue;
        }
        var argname = pairs[i].substring(0, pos);
        var value = pairs[i].substring(pos+1);
        value = decodeURIComponent(value)
        value = value.replace(/\+/g, ' ');
        args[argname] = value;
    }
    return args;    
}

function setup_search_textbox() {
    var args = get_query_arguments_from_url();
    if (args.q) {
        var search_field = $('header-search-field');
        if (search_field) {
            search_field.value = args.q;
            search_field.focus();
        }
    }
}

function logout() {
    create_cookie('show_logged_in_components', '0');
    return true;
}
function set_logged_in() {
    create_cookie('show_logged_in_components', '1');
    return true;
}
function is_logged_in() {
    return (get_cookie('show_logged_in_components') == 1);
}

function rate_as(rating_field_id, rating_object_id, rating_value, rating_name) {
    var rating_field = $(rating_field_id);
    rating_field.value = rating_value;
    var rating_object = $(rating_object_id);
    var images = rating_object.getElementsByTagName('img');
    for (var i=0; i<images.length; i++) {
        var image = images[i];
        if (i < rating_value) {
            image.src = '/images/ui/review_star_full.gif';
        } else {
            image.src = '/images/ui/review_star_empty.gif';
        }
    }
    $('rating-text').innerHTML = rating_name;
    return false;
}

function show_message(message_field_name, message, is_warning) {
    $(message_field_name).innerHTML = message;
    var message_color = is_warning ? 'red' : 'green';
    $dom.setStyle(message_field_name, 'color', message_color);
}
var TEXT_LENGTH_BUFFER_ZONE = 25;
function update_length_message(textarea_element, max_length) {
    var message = '';
    var is_warning = false;
    if (textarea_element.value.length > 0 && textarea_element.value.length > max_length - TEXT_LENGTH_BUFFER_ZONE) { 
        message = Math.abs(textarea_element.value.length - max_length) + ' Character';
        if (Math.abs(textarea_element.value.length - max_length) != 1) {
            message += 's';
        }
        if (textarea_element.value.length > max_length) {
            message += ' Too Many';
            is_warning = true;
        } else {
            message += ' Left';
            is_warning = false;
        }
    }
    show_message(textarea_element.id + '-length-message', message, is_warning);
}

function setup_reviews_and_comments() {
    var rating_field = $('rating-field');
    if (rating_field) {
        rating_field.value = '';
    }
}

function toggle_reply_form(parent_id) {
    var comment_container = $('comment-' + parent_id);
    var reply_form_container = $('reply-form-container');
    comment_container.appendChild(reply_form_container);
    $dom.setStyle(reply_form_container, 'display', 'block');
    $('reply-form-text').focus();
    $('reply-form-parent-id').value = parent_id;
    return false;
}

function moderate_posting(moderation_form_id) {
    if (confirm('Are you sure you want to remove this posting and any replies it may have?')) {
        moderation_form = $(moderation_form_id);
        moderation_form.submit();
    }
    return false;
}

function toggle_question_form_buttons(question_title_field) {
    var update_button = $('update-question-button');
    if (question_title_field.value != question_title_field.defaultValue) {
        update_button.disabled = false;
    } else {
        update_button.disabled = true;
    }
}

var WARNING = 'WARNING'
var SUCCESS = 'SUCCESS'
var ALERT = 'ALERT'
var background_colors = {SUCCESS: '#dfc', WARNING: '#fcd4d3', ALERT: '#ffec8e'}
function show_flashing_message(message_field_name, message, do_scroll) {
    if (! do_scroll) { var do_scroll = false; }
    show_flashing_message_cb(message_field_name, message, WARNING, null, do_scroll);
}
function show_flashing_message_cb(message_field_name, message, highlight_type, completion_function, do_scroll) {
    if (message) {
        $(message_field_name).innerHTML = message;
        $dom.setStyle(message_field_name, 'display', 'block');
        if (! do_scroll) { var do_scroll = false; }
        if (do_scroll) {
            var y = Math.max($dom.getY(message_field_name) - 15, 0);
            window.scrollTo($dom.getDocumentScrollLeft(), y);
        }
        var bgcolor = background_colors[highlight_type];
        $dom.setStyle(message_field_name, 'backgroundColor', bgcolor);
        var anim = new YAHOO.util.ColorAnim(
            message_field_name, 
            {backgroundColor: { to: '#fff' }}, 
            1.5, 
            YAHOO.util.Easing.easeIn
        );
        if(completion_function) {
            anim.onComplete.subscribe(completion_function);
        }
        anim.animate();
    } else {
        hide_flashing_message(message_field_name)
    }
}
function hide_flashing_message(message_field_name) {
    $(message_field_name).innerHTML = '';
    $dom.setStyle(message_field_name, 'display', 'none');
}

function submit_contact_form(is_warning, result_message) {
    highlight_type = (is_warning) ? WARNING : SUCCESS;
    show_flashing_message_cb('message-area', result_message, highlight_type);
    $('send-button').disabled = false;
    $dom.setStyle('sending', 'display', 'none');
    $('contact-message').value = '';
    $('contact-subject').value = '';
}
function setup_contact_form() {
    $event.addListener(
        'contact-form',
        'submit',
        function(e) {
            $event.preventDefault(e);
            $dom.setStyle('sending', 'display', 'block');
            $('send-button').disabled = true;
            YAHOO.util.Connect.setForm('contact-form');
            YAHOO.util.Connect.asyncRequest(
                'POST', 
                '/send_contact_email',
                {
                    success: function() {
                        on_tracked_action(EVENT_CONTACT_SEND_EMAIL);
                        submit_contact_form(false, 'Thank you for contacting Wize.');
                    },
                    failure: function() {
                        submit_contact_form(true, 'We were unable to send your message.  Please try again.');
                    }
                } 
            );
        }
    );
}

function setup_focus() {
    var field_names = [
        'feedback-textbox',
        'old_password', 
        'signup-email',
        'category_search_field'
    ];
    if (location.href.indexOf('forgot=1') != -1) {
        field_names.push('forgot-email');
    } else {
        field_names.push('signin-email');
    }
    if (wize.focus_field) {
        field_names.push(wize.focus_field);
    }
    for (var f in field_names) {
        field = $(field_names[f]);
        if (field && field.focus) {
            field.focus();
            break;
        }
    }
}

var is_authentication_panel_loaded = false;
var signin_panel = null;
var signin_success_function = null;
var signin_target = null;

var RecaptchaOptions = { theme: 'custom', lang: 'en', custom_theme_widget: 'recaptcha-container' };
var RECAPTCHA_PUBLIC_KEY = '6Lf0wQAAAAAAACduXxG-vbUaV66LEEkbsxqkG5vK';

function show_authentication_panel() {
    if (! is_authentication_panel_loaded) {
        create_signin_panel();
        is_authentication_panel_loaded = true;
    }
    signin_panel.show();
    $('midflow_auth_signin_email').focus();
}

function failure_function() {}
function load_authentication_panel() {
    if (! is_authentication_panel_loaded) {
        YAHOO.util.Get.script(
            [
                'http://yui.yahooapis.com/2.5.1/build/container/container-min.js',
                'http://api.recaptcha.net/js/recaptcha_ajax.js',
                '/javascripts/midflow_authentication.js?v=' + wize.EXTERNAL_FILE_VERSION_NUMBER
            ],
            {
                onSuccess: function() {
                    YAHOO.util.Connect.asyncRequest(
                        'GET', 
                        '/authentication-popup', 
                        {
                            success: function(o) {
                                $('ft').innerHTML += o.responseText;
                                Recaptcha.create(
                                    RECAPTCHA_PUBLIC_KEY,
                                    'recaptcha-container',
                                    RecaptchaOptions
                                );
                                show_authentication_panel();
                            },
                            failure: failure_function
                        } 
                    );
                },
                failure: failure_function
            }
        );
    } else {
        show_authentication_panel();
    }
}

function authenticate(e, success_function) {
    $event.preventDefault(e);
    signin_target = $event.getTarget(e);
    if (! is_logged_in()) {
        signin_success_function = success_function;
        load_authentication_panel();
    } else {
        if (success_function) {
            success_function(signin_target);
        }
    }
}

*/

/****************/
/** COMPARISON **/

/**
var product_list = null;

function clear_compare_list_if_category_has_changed() {
    if (wize.currentCategoryName) {
        var previousCategoryName = unescape(get_cookie("cpc"));
    
        if ((get_product_compare_list().length > 0)
            && (previousCategoryName != null)
            && (previousCategoryName != '')
            && (previousCategoryName != wize.currentCategoryName)) {
    
            remove_all_products_from_compare_list();
        }
    }
}

function get_product_compare_list() {
    if (product_list == null) {    
        var value = get_cookie("cp");
        if (value) {
            product_list = value.split(",");
        } else {
            product_list = new Array();
        }
    }
    return product_list;
}

function is_product_in_compare_list(product_id) {
    var products = get_product_compare_list();
    for (var i=0; i < products.length; i++) {
        if (product_id == products[i]) {
            return true;
        }
    }
    return false;    
}

function set_product_compare_list(products) {
    product_list = products;
    create_cookie("cp",  products.join(","));
}

function remove_all_products_from_compare_list() {
    product_list = null;
    erase_cookie("cp");
}

function add_product_to_compare_list(product_id) {
    var products = get_product_compare_list();
    for (var i=0; i < products.length; i++) {
        if (product_id == products[i]) {
            return;
        }
    }
    products.push(product_id);
    set_product_compare_list(products);
}

function remove_product_from_compare_list(product_id) {
    var products = get_product_compare_list();
    var mp = new Array();
    for (var i=0; i < products.length;i++) {
        if (product_id != products[i]) {
            mp.push(products[i]);
        }
    }
    set_product_compare_list(mp);
}

function go_to_compare_page_with_current_selection(products) {
    on_tracked_action(EVENT_COMPARE_EXECUTE);
    if (!products) {
        products = get_product_compare_list();
    }
    window.location = "/compare?cmp=" + products.join(",");
}

function setup_compare() {
    clear_compare_list_if_category_has_changed();

    if ($dom.inDocument('compared_products')) {
        $dom.getElementsByClassName(
            'grid-compare-checkbox',
            'input',
            null,
            function(elt) {
                $event.addListener(elt, 'click', on_click_compare_checkbox);
            }
        );
        $event.addListener('comparison_button', 'click', do_comparison);

        var product_ids = get_product_compare_list();
        for (var i=0; i<product_ids.length; i++) {
            highlight_and_check_product(product_ids[i], true);
        }

        $dom.setStyle('compared_products', 'display', 'block');
        $dom.getElementsByClassName(
            'product-container', 
            'div', 
            'bd',
            function(element) {
                checkbox_container_id = element.id.replace('product_container_', 'compare_checkbox_container_');
                $dom.setStyle(checkbox_container_id, 'display', 'block');
            }
        );
    }
}

function removeable(product_id) {
    $dom.setStyle('product-thumbnail-image-' + product_id, 'opacity', .3);
    $dom.setStyle('product-thumbnail-' + product_id, 'border', '2px solid #ccc');
    $dom.setStyle('product-thumbnail-' + product_id, 'padding', '1px 4px');
}
function not_removeable(product_id) {
    $dom.setStyle('product-thumbnail-image-' + product_id, 'opacity', 1);
    $dom.setStyle('product-thumbnail-' + product_id, 'border', '1px solid #f1f1f1');
    $dom.setStyle('product-thumbnail-' + product_id, 'padding', '2px 5px');
}

function add_compare_thumbnail(id) {
    var images = $('compared_products').getElementsByTagName('img');
    if (images.length == 0) {
        $dom.setStyle('compare_instructions', 'display', 'none');
    }
    var thumbnail = '<div class="product-thumbnail" id="product-thumbnail-' + id + '"><a href="#" onclick="update_checked_product(' + id + ', false); return false;" onmouseover="removeable(' + id + ');" onmouseout="not_removeable(' + id + ');" onmouseoff="not_removeable(' + id + ');" title="Remove this Product">Remove</a>'
    thumbnail += '<table><tr><td id="product-thumbnail-image-' + id + '"><img src="http://wize.com/photos/tiny/' + id + '.jpg" /></td></tr></table></div>'
    var existing_images = $('compared_products').innerHTML;
    $('compared_products').innerHTML = thumbnail + existing_images;
}
function remove_compare_thumbnail(id) {
    var images = $('compared_products').getElementsByTagName('img');
    if (images.length == 1) {
        $dom.setStyle('compare_instructions', 'display', 'block');
    }
    var thumb_container = $('product-thumbnail-' + id);
    thumb_container.parentNode.removeChild(thumb_container);
}

function on_click_compare_checkbox(e) {
    var checkbox = $event.getTarget(e);
    var product_id = checkbox.id.replace('compare_checkbox_', '');
    update_checked_product(product_id, checkbox.checked);
}

function update_checked_product(product_id, is_checked) {
    if (is_checked) {
        on_tracked_action(EVENT_COMPARE_ADD);
    } else {
        on_tracked_action(EVENT_COMPARE_REMOVE);
    }
    highlight_and_check_product(product_id, is_checked);
    remember_product_comparison(product_id, is_checked);
}

function highlight_and_check_product(product_id, is_checked) {
    var container = $('product_container_' + product_id);
    if (is_checked) {
        $dom.setStyle(container, 'border', '3px solid #ffbf00');
        $dom.setStyle(container, 'padding', '2px');
        $dom.setStyle(container, 'background-color', '#feF7c8');
        add_compare_thumbnail(product_id);
    } else {
        $dom.setStyle(container, 'border', '1px solid #ddd');
        $dom.setStyle(container, 'padding', '4px');
        $dom.setStyle(container, 'background-color', '#fff');
        remove_compare_thumbnail(product_id);
    }
    var checkbox = $('compare_checkbox_' + product_id);
    if (checkbox) {
        checkbox.checked = is_checked;
    }
}

function remember_product_comparison(product_id, is_checked) {
    create_cookie("cpc", escape(wize.currentCategoryName));
    if (is_checked) {
        add_product_to_compare_list(product_id);
    } else {
        remove_product_from_compare_list(product_id);
    }
}

function do_comparison(e) {
    var products = get_product_compare_list();
    $event.preventDefault(e);
    go_to_compare_page_with_current_selection(products);
}

*/

/** COMPARISON **/
/****************/


/**** BEGIN HOME PAGE NAVIGATION CLOUDS ******/
var cloud_navigation = {};

cloud_navigation.update_selected_link = function(link, container) {
    $dom.removeClass(container.getElementsByTagName('a'), 'selected');
    $dom.addClass(link, 'selected');
    cloud_navigation.current_link = link.href;
}
cloud_navigation.submit = function() {
    location.href = cloud_navigation.current_link;
}
cloud_navigation.on_interaction = function(e) {
    var target = $event.getTarget(e);
    var url_parts = target.href.split('/');
    var link_title = url_parts[url_parts.length - 2];
    $event.preventDefault(e);
    cloud_navigation.update_selected_link(target, cloud_navigation.category_cloud_contents);
    if (! cloud_navigation.can_submit) {
        cloud_navigation.can_submit = true;
        $event.addListener(cloud_navigation.go_button, 'click', cloud_navigation.submit);
        cloud_navigation.go_button.src = '/images/v4/button/cloud_go_on.png';
    }
    var topic_cloud_key = 'topic_cloud_links_' + link_title.replace(/\-/g, '_');
    cloud_navigation.topic_cloud_html = wize[topic_cloud_key];
    cloud_navigation.fade_topics_out.animate();
}
cloud_navigation.on_first_click = function(e) {
    $event.removeListener(cloud_navigation.category_cloud_contents.getElementsByTagName('a'), 'mouseover', cloud_navigation.on_interaction);
    $event.removeListener(cloud_navigation.category_cloud_contents.getElementsByTagName('a'), 'click', cloud_navigation.on_first_click);
}
cloud_navigation.setup = function() {
    if ($dom.inDocument('home_category_cloud')) {
        cloud_navigation.category_cloud_contents = $('home_category_cloud').getElementsByTagName('div')[0];
        cloud_navigation.topic_cloud_contents = $('home_topic_cloud').getElementsByTagName('div')[0];
        cloud_navigation.topic_cloud_links = $('home_topic_cloud').getElementsByTagName('div')[0].firstChild;
        cloud_navigation.go_button = $('home_cloud_navigation_button');
        cloud_navigation.no_uses_yet = "We don't have any uses for this category yet.<br />Try typing in a new one.";
        cloud_navigation.current_link = null;
        cloud_navigation.can_submit = false;
        cloud_navigation.topic_cloud_html = '&nbsp;';
        var category_cloud_html = '<p>' + wize['category_cloud_links'] + '</p>';
        cloud_navigation.category_cloud_contents.innerHTML = category_cloud_html;
        cloud_navigation.fade_topics_out = new YAHOO.util.Anim(
            cloud_navigation.topic_cloud_links, 
            {opacity: { to: 0 }}, 
            .1, 
            YAHOO.util.Easing.easeInStrong
        );
        cloud_navigation.fade_topics_in = new YAHOO.util.Anim(
            cloud_navigation.topic_cloud_links, 
            {opacity: { to: 1 }}, 
            .3, 
            YAHOO.util.Easing.easeOutStrong
        );
        cloud_navigation.unhighlight_topics = new YAHOO.util.ColorAnim(
            cloud_navigation.topic_cloud_contents, 
            {borderBottomColor: {to: '#d0e4ef' },
             borderLeftColor: {to: '#d0e4ef' },
             borderRightColor: {to: '#d0e4ef' },
             borderTopColor: {to: '#d0e4ef' }}, 
            .3, 
            YAHOO.util.Easing.easeBoth
        );
        cloud_navigation.fade_topics_out.onComplete.subscribe(function() {
            cloud_navigation.topic_cloud_links.innerHTML = cloud_navigation.topic_cloud_html;
            $event.addListener(cloud_navigation.topic_cloud_links.getElementsByTagName('a'), 'click', function(e) {
                var target = $event.getTarget(e);
                cloud_navigation.update_selected_link(target, cloud_navigation.topic_cloud_contents);
            });
            $dom.setStyle(cloud_navigation.topic_cloud_contents, 'border-color', '#9ac');
            cloud_navigation.fade_topics_in.animate();
        });
        cloud_navigation.fade_topics_in.onComplete.subscribe(function() {
            cloud_navigation.unhighlight_topics.animate();
        });
        $event.addListener(cloud_navigation.category_cloud_contents.getElementsByTagName('a'), 'mouseover', cloud_navigation.on_interaction);
        $event.addListener(cloud_navigation.category_cloud_contents.getElementsByTagName('a'), 'click', cloud_navigation.on_interaction);
        $event.addListener(cloud_navigation.category_cloud_contents.getElementsByTagName('a'), 'click', cloud_navigation.on_first_click);
        $dom.removeClass(cloud_navigation.category_cloud_contents.getElementsByTagName('p'), 'hide');
    }
}
/**** END HOME PAGE NAVIGATION CLOUDS ******/


/**** BEGIN PRODUCT REVIEW READER ******/
var review_reader = {};

review_reader.setup_clickable_ajax_snippets = function() {
    /** Must be setup each time the AJAX snippets load */
    $dom.getElementsByClassName(
        'hoverable_review',
        'div', 
        'product_reviews_container',
        function(ctr) {
            $event.addListener(ctr, 'click', review_reader.onclick_review);
            $event.addListener(ctr, 'mouseover', review_reader.onmouseover_review);
            $event.addListener(ctr, 'mouseout', review_reader.onmouseout_review);
        }
    );
}

review_reader.onmouseover_review = function(e) {
    var ctr = $event.getTarget(e);
    ctr = $dom.getAncestorBy(ctr, 
        function(elt) { 
            return $dom.hasClass(elt, 'hoverable_review'); 
        }
    );
    if (ctr) {
        $dom.addClass(ctr, 'hovered_review');
    }
}

review_reader.onmouseout_review = function(e) {
    var ctr = $event.getTarget(e);
    ctr = $dom.getAncestorBy(ctr, 
        function(elt) { 
            return $dom.hasClass(elt, 'hoverable_review'); 
        }
    );
    if (ctr) {
        $dom.removeClass(ctr, 'hovered_review');
    }
}

review_reader.onclick_review = function(e) {
    var click_target = $event.getTarget(e);
    var is_a_link = false;
    if (click_target.tagName.toLowerCase() == 'a') {
        is_a_link = true;
    } else {
        is_a_link = $dom.getAncestorByTagName(click_target, 'a');
    }
    // If the clicked element is not surrounded by a link (and is not itself a link) 
    // then mimic the on-click functionality of a link for tracking purposes.
    if (! is_a_link) {
        var container = $dom.getAncestorByClassName(click_target, 'hoverable_review');
        if (container) {
            var review_links = $dom.getElementsByClassName('hoverable_review_url', null, container);
            if (review_links.length > 0) {
                review_links[0].onclick();
                window.open(review_links[0]);
                
                // CALL HEATMAP CODE HERE!!!
                
            }
        }
    }
}

review_reader.onclick_display_next_product_reviews = function(e) {
    $event.preventDefault(e);
    review_reader.display_next_product_reviews();
}

review_reader.display_next_product_reviews = function() {
    if (review_reader.reviews.length) {
        $('product_reviews_container').innerHTML += review_reader.reviews.pop();
    }
    if (! review_reader.reviews.length) {
        review_reader.no_more_reviews_available();
    } else {
        review_reader.more_reviews_available();
    }
    review_reader.setup_clickable_ajax_snippets();
}

review_reader.no_more_reviews_available = function() {
    $dom.setStyle('review_reader_more_link', 'display', 'none')
}
review_reader.more_reviews_available = function() {
    $dom.setStyle('review_reader_more_link', 'display', 'block')
}

review_reader.update_filter_highlighting = function() {
    var filters_container = $('product_review_reader');
    if (filters_container) {
        $dom.getElementsByClassName('review_filter', 'a', filters_container, function(element) {
            var query_string = helpers.get_url_fragment(element.href);
            if (query_string == review_reader.query_string) {
                $dom.addClass(element, 'selected');
            } else {
                $dom.removeClass(element, 'selected');
            }
        });
    }
}

/** FIXME: Remove is_first_load, consolidate code */
review_reader.update_reviews = function(query_string, is_first_load) {
    var reviews_container = $('product_reviews_container');
    if (reviews_container) {
        if (is_first_load) {
            review_reader.query_string = location.hash.replace('#', '');
        } else {
            review_reader.no_more_reviews_available();
            reviews_container.innerHTML = '<div style="text-align:center;"><img src="/images/v3/other/spinner.gif" alt="fetching reviews ..." width="54" height="55" /></div>';
            review_reader.query_string = query_string;
        }
        review_reader.update_filter_highlighting();

        var url = '/fragment/reviews/' + wize.current_product_id + '?' + review_reader.query_string;
        YAHOO.util.Connect.asyncRequest(
            'GET',
            url,
            {
                // FIX FOR PROTOTYPE: WaynePrototype - revisit caching here
                cache: wize.cache_review_fragments,
                success: function(o) {
                    if (o.responseText != '') {
                        review_reader.update_filter_highlighting();
                        review_reader.reviews = [];
                        review_reader.reviews = o.responseText.split('<!-- PAGE SEPARATOR -->').reverse();
                        reviews_container.innerHTML = '';
                        review_reader.display_next_product_reviews();
                    } else {
                        review_reader.no_more_reviews_available();
                    }
                }, 
                failure: review_reader.no_more_reviews_available
            }
        );
    }
}

review_reader.setup = function() {
    var filters_container = $('product_review_reader');
    if (filters_container) {
        var filter_links = $dom.getElementsByClassName('review_filter', 'a', filters_container);
        $event.addListener(filter_links, 'click', function(e) {
                var click_target = $event.getTarget(e);
                var query_string = helpers.get_url_fragment(click_target.href);
                review_reader.update_reviews(query_string);
        });

        $event.addListener('review_reader_more_link', 'click', review_reader.onclick_display_next_product_reviews);
        $event.addListener('review_keyword_search', 'submit', function(e) {
            $event.preventDefault(e);
            var search_field = $('review_keyword_search_field');
            var search_value = helpers.trim_string(search_field.value);
            if (search_value) {
                location.hash = '#k=' + encodeURIComponent(search_value);
                var query_string = helpers.get_url_fragment(location.href);
                review_reader.update_reviews(query_string);
            } else {
                location.hash = '#';
                review_reader.update_reviews();
            }
        });
    }
    var is_first_load = true;
    review_reader.update_reviews(null, is_first_load);
}
/**** END PRODUCT REVIEW READER ******/


/**** BEGIN SURVEY ******/
function do_survey() {
    if ($dom.inDocument('survey') && $dom.inDocument('survey_link') && $dom.inDocument('survey_no_thanks') && $('survey_link').href) {
        var survey = new Object;
        survey.bottom = 300;
        survey.padding = 5;
        survey.X = 5;
        survey.Y = 0;
        survey.height = 85; // needs to match the height in the div
        survey.container = document.all ? document.all["survey"] : $("survey");
        
        survey.COOKIE_LENGTH_IN_DAYS = 5000
        survey.MAX_TIME_DELTA_CONSIDERED_RECENT = 60*60*12;
        survey.NUM_CLICKS_TO_TRIGGER_SURVEY = 10;

        
        survey.attempt = function() {
            survey_url = $('survey_link').href;

            if (! this.is_user_opted_out()) {
                if (! this.has_survey_been_offered(survey_url)) {
                    if (this.last_click_time_is_recent()) {
                        this.increment_num_clicks();
                    } else {
                        this.reset_num_clicks();
                    }
                    if (this.has_user_exceeded_minimum_clicks()) {
                        this.launch();
                        this.set_survey_offered(survey_url)
                        this.reset_num_clicks();
                    }
                } else {
                    this.reset_num_clicks();
                }
            }
        }
        
        survey.is_user_opted_out = function() {
            return get_cookie('survey_never_show_again');
        }
        
        survey.has_survey_been_offered = function(survey_url) {
            var previously_offered = get_cookie('survey_previously_offered_urls');
            return (previously_offered!=null) && previously_offered.indexOf(survey_url) != -1;
        }
        
        survey.last_click_time_is_recent = function() {
            var last_click_time = parseInt(get_cookie('survey_last_click_time'));
            var time_delta = this.get_time_in_seconds() - last_click_time;
            return time_delta < survey.MAX_TIME_DELTA_CONSIDERED_RECENT
        }
        
        survey.update_last_click_time = function() {
            create_cookie('survey_last_click_time', this.get_time_in_seconds(), survey.COOKIE_LENGTH_IN_DAYS)
        }
        
        survey.increment_num_clicks = function() {
            var num_recent_clicks = parseInt(get_cookie('survey_num_recent_clicks'));
            create_cookie('survey_num_recent_clicks', num_recent_clicks + 1, survey.COOKIE_LENGTH_IN_DAYS)
            this.update_last_click_time();
        }
        
        survey.reset_num_clicks = function() {
            create_cookie('survey_num_recent_clicks', 1, survey.COOKIE_LENGTH_IN_DAYS);
            this.update_last_click_time();
        }
        
        survey.has_user_exceeded_minimum_clicks = function() {
            var num_recent_clicks = parseInt(get_cookie('survey_num_recent_clicks'));
            return num_recent_clicks > survey.NUM_CLICKS_TO_TRIGGER_SURVEY;
        }
        
        survey.set_survey_offered = function(survey_url) {
            var offered_surveys = get_cookie('survey_previously_offered_urls');
            if (! offered_surveys) {
                offered_surveys = survey_url;
            } else {
                offered_surveys += ',' + survey_url;
            }
            create_cookie('survey_previously_offered_urls', offered_surveys, survey.COOKIE_LENGTH_IN_DAYS);
        }
        
        survey.launch = function() {
            $event.addListener('survey_no_thanks', 'click', function(e) {
                $event.preventDefault(e);
                survey.close(); 
                survey.never_show_again();
            });

            var scrolledY;
            if (self.pageYOffset) {
                scrolledY = self.pageYOffset;
            } else if (document.documentElement && document.documentElement.scrollTop) {
                scrolledY = document.documentElement.scrollTop;
            } else if (document.body) {
                scrolledY = document.body.scrollTop;
            }
        
            var centerY;
            if (self.innerHeight) {
                centerY = self.innerHeight;
            } else if (document.documentElement && document.documentElement.clientHeight) {
                centerY = document.documentElement.clientHeight;
            } else if (document.body) {
                centerY = document.body.clientHeight;
            }
            
            // dividing by 4 here to stop in the first 25% of the page
            survey.bottom = ( scrolledY + centerY - survey.padding - survey.height ) / 4;
          
            survey.Y = scrolledY;
        
            survey.container.style.right = (survey.X + 200) + "px";
            survey.container.style.top   = (survey.Y + 25) + "px";
            survey.container.style.display = "block";
        }
        
        survey.close = function() {
            survey.container.style.display = "none";
            survey.Y = survey.bottom; // if it was closed, make sure extra computations are done in dropMyPopup()
        }
        
        survey.get_time_in_seconds = function() {
            var date = new Date();
            return parseInt(date.getTime() / 1000);
        }
        
        survey.never_show_again = function() {
            create_cookie('survey_never_show_again', 'true', survey.COOKIE_LENGTH_IN_DAYS);
        }

        survey.attempt();
    }
}
/****** END SURVEY ******/


/****** BEGIN STASH TRAY ******/
var stash_tray = {};
stash_tray.TRAY_ID = 'tray';
stash_tray.TRAY_HANDLE_ID = 'tray_handle';
stash_tray.TRAY_CONTENT_ID = 'tray_content';
stash_tray.TRAY_IS_UP_COOKIE = 'tray_is_up';
stash_tray.SAVED_PRODUCTS_COOKIE = 'saved_products';
stash_tray.tray_animations = [new YAHOO.util.Anim(stash_tray.TRAY_ID, {bottom: { to: 0 }}, .5, YAHOO.util.Easing.backIn), 
                              new YAHOO.util.Anim(stash_tray.TRAY_ID, {bottom: { to: -196 }}, .8, YAHOO.util.Easing.elasticOut)];
stash_tray.tray_animations[0].onComplete.subscribe(function() { $dom.get(stash_tray.TRAY_HANDLE_ID).innerHTML = 'Close'; });
stash_tray.tray_animations[1].onComplete.subscribe(function() { $dom.get(stash_tray.TRAY_HANDLE_ID).innerHTML = 'Favorites'; });
stash_tray.is_up = 0;

stash_tray.product_ids = YAHOO.util.Cookie.getSub(stash_tray.SAVED_PRODUCTS_COOKIE, 'ids');
stash_tray.product_ids = (stash_tray.product_ids == null) ? [] : stash_tray.product_ids.split(',');

stash_tray.toggle = function() {
    stash_tray.tray_animations[stash_tray.is_up].animate();
    stash_tray.is_up = 1 - stash_tray.is_up;
    // YAHOO.util.Cookie.setSub(stash_tray.SAVED_PRODUCTS_COOKIE, stash_tray.TRAY_IS_UP_COOKIE, stash_tray.is_up, helpers.COOKIE_PARAMS);
}
stash_tray.update = function() {
    YAHOO.util.Connect.asyncRequest(
        'GET', 
        '/fragment/saved_products',
        {
            success: function(o) {
                $('tray_content').innerHTML = o.responseText;
            },
            failure: function() {}
        } 
    );
}
stash_tray.remove = function(product_id) {
    reduced_product_ids = [];
    for (var i=0; i<stash_tray.product_ids.length; i++) {
        if (stash_tray.product_ids[i] != product_id) {
            reduced_product_ids.push(stash_tray.product_ids[i]);
        }
    }
    stash_tray.product_ids = reduced_product_ids;
    YAHOO.util.Cookie.setSub(stash_tray.SAVED_PRODUCTS_COOKIE, 'ids', stash_tray.product_ids.join(','), helpers.COOKIE_PARAMS);
    stash_tray.update();
}
stash_tray.setup = function() {
    $event.addListener(
        stash_tray.TRAY_HANDLE_ID,
        'click',
        function(e) {
            $event.preventDefault(e);
            stash_tray.toggle();
        }
    );
    stash_tray.update();
    // var open_tray = YAHOO.util.Cookie.getSub(stash_tray.SAVED_PRODUCTS_COOKIE, stash_tray.TRAY_IS_UP_COOKIE);
    // if (open_tray == 1 && ! wize.suppress_stash_tray) {
    //     stash_tray.toggle();
    // }
    $dom.getElementsByClassName('add_to_favorites_button', 'img', null, function (element) {
        $event.addListener(element, 'click', function(e) {
            var product_id = element.id.replace('favorites_button_', '');
            // Trim to a unique list
            unique_product_ids = [product_id];
            for (var i=0; i<stash_tray.product_ids.length; i++) {
                var already_exists = false;
                for (var j=0; j<unique_product_ids.length; j++) {
                    if (stash_tray.product_ids[i] == unique_product_ids[j]) {
                        already_exists = true;
                        break;
                    }
                }
                if (! already_exists) {
                    unique_product_ids.push(stash_tray.product_ids[i]);
                }
            }
            stash_tray.product_ids = unique_product_ids;
            YAHOO.util.Cookie.setSub(stash_tray.SAVED_PRODUCTS_COOKIE, 'ids', stash_tray.product_ids.join(','), helpers.COOKIE_PARAMS);

            if (! stash_tray.is_up) { stash_tray.toggle(); }
            stash_tray.update();
        });
    });
}
/****** END STASH TRAY ******/


/****** BEGIN MODAL FILTERS PANEL ******/
var modal_filters = {};
modal_filters.setup = function() {
    if ($dom.inDocument('modal_filters')) {
        modal_filters.panel = new YAHOO.widget.Panel(
            'modal_filters', 
            {width:'400px',
             modal:true, 
             fixedcenter: true, 
             constraintoviewport: true, 
             underlay:"shadow", 
             close:true, 
             visible:false, 
             draggable:true} 
        );
        modal_filters.panel.render();
        $event.addListener('modal_filters_trigger_brand', 'click', function(e) {
            $event.preventDefault(e);
            modal_filters.tabs.selectTab(0);
            modal_filters.panel.show();
        });
        $event.addListener('modal_filters_trigger_feature', 'click', function(e) {
            $event.preventDefault(e);
            modal_filters.tabs.selectTab(1);
            modal_filters.panel.show();
        });
        modal_filters.tabs = new YAHOO.widget.TabView('modal_filters_tabs');
        $dom.setStyle('modal_filters', 'display', 'block');

        if (wize.max_price_possible) {
            modal_filters.PRICE_SLIDER_PIXEL_WIDTH = 200;
            modal_filters.DOLLARS_PER_PIXEL = wize.max_price_possible / modal_filters.PRICE_SLIDER_PIXEL_WIDTH;
            modal_filters.price_slider = YAHOO.widget.Slider.getHorizDualSlider(
                'modal_filters_price_slider', 
                'modal_filters_price_slider_min_thumb', 
                'modal_filters_price_slider_max_thumb', 
                modal_filters.PRICE_SLIDER_PIXEL_WIDTH);
            modal_filters.price_slider.minRange = -10;
            modal_filters.update_prices = function() {
                min_price = Math.round(modal_filters.price_slider.minVal * modal_filters.DOLLARS_PER_PIXEL);
                max_price = Math.round(modal_filters.price_slider.maxVal * modal_filters.DOLLARS_PER_PIXEL);
                $('modal_filters_price_slider_values').innerHTML = '$' + min_price + ' - $' + max_price;
            }
            modal_filters.price_slider.subscribe('ready', function() {
                if (wize.min_price_filtered != -1) {
                    modal_filters.price_slider.setMinValue(wize.min_price_filtered / modal_filters.DOLLARS_PER_PIXEL, true, true, true);
                }
                if (wize.max_price_filtered != -1) {
                    modal_filters.price_slider.setMaxValue(wize.max_price_filtered / modal_filters.DOLLARS_PER_PIXEL, true, true, true);
                }
                modal_filters.update_prices();
                modal_filters.price_slider.subscribe('change', modal_filters.update_prices);
            });
            $event.addListener('modal_filters_price_slider_link', 'click', function(e) {
                $event.preventDefault(e);
                min_price = Math.round(modal_filters.price_slider.minVal * modal_filters.DOLLARS_PER_PIXEL);
                max_price = Math.round(modal_filters.price_slider.maxVal * modal_filters.DOLLARS_PER_PIXEL);
                location.href = wize.sample_price_filter_url.replace('111', min_price).replace('222', max_price);
            });
        }
    }
}
/****** END MODAL FILTERS PANEL ******/


/****** BEGIN CAROUSEL WIDGETS ******/
var carousel_widgets = {};

/** 
HACK: Fixing a bug/feature of the YUI carousel.
Prevents carousel scrolling when clicking a link with a hash.
Pulled code from YUI and modified one line (noted below).
http://yui.yahooapis.com/2.7.0/build/carousel/carousel.js
*/
var Carousel = function (el, cfg) {
    Carousel.superclass.constructor.call(this, el, cfg);
};
var Dom         = YAHOO.util.Dom,
    Event       = YAHOO.util.Event,
    JS          = YAHOO.lang;
YAHOO.extend(Carousel, YAHOO.widget.Carousel, {
        _pagerClickHandler: function (ev) {
            var carousel = this,
                pos,
                target   = Event.getTarget(ev),
                val;

            function getPagerNode(el) {
                var itemEl = carousel.get("carouselItemEl");

                if (el.nodeName.toUpperCase() == itemEl.toUpperCase()) {
                    el = Dom.getChildrenBy(el, function (node) {
                        // either an anchor or select at least
                        return node.href || node.value;
                    });
                    if (el && el[0]) {
                        return el[0];
                    }
                } else if (el.href || el.value) {
                    return el;
                }

                return null;
            }

            if (target) {
                target = getPagerNode(target);
                if (!target) {
                    return;
                }
                val = target.href || target.value;
                // HACK: changed this line only.  
                // if (JS.isString(val) && val) {
                if (JS.isString(val) && val && val.indexOf('yui') != -1) {
                    pos = val.lastIndexOf("#");
                    if (pos != -1) {
                        val = carousel.getItemPositionById(
                                val.substring(pos + 1));
                        carousel._selectedItem = val;
                        carousel.scrollTo(val);
                        if (!target.value) { // not a select element
                            carousel.focus();
                        }
                        Event.preventDefault(ev);
                    }
                }
            }
        }
});


carousel_widgets.setup = function() {
    var ANIMATION = { speed: .6, effect: YAHOO.util.Easing.easeBoth };

    var configs = [
        [[$('related_products_carousel')],
         {'numVisible':4, 'scrollIncrement':4, 'animation': ANIMATION}],
        [[$('list_alternate_products_carousel')],
         {'numVisible':4, 'scrollIncrement':4, 'animation': ANIMATION}],
        [$dom.getElementsByClassName('snippet_cycler', 'div', 'list_of_products'), 
         {'isCircular': true, 'numVisible': 1}],
        [$dom.getElementsByClassName('topic_cycler', 'div', 'home_news_box'), 
         {'isCircular': true, 'numVisible':1, 'revealAmount':0}]
    ];

    for (var c=0; c<configs.length; c++) {
        var elements = configs[c][0];
        for (var e=0; e<elements.length; e++) {
            if (elements[e]) {
                var carousel = new Carousel(elements[e]);
                carousel.initAttributes(configs[c][1]);
                carousel.set('selectOnScroll', false); 
                $dom.batch(elements[e].getElementsByTagName('li'), function(element) {
                    if (! $dom.hasClass(element, 'first')) {
                        $dom.setStyle(element, 'display', 'inline');
                    }
                });
                carousel.render();
                carousel.show();
            }
        }
    }
}
/****** END CAROUSEL WIDGETS ******/


/****** BEGIN PRODUCT SWITCHER ******/
var products_switcher = {};
products_switcher.setup = function() {
    $event.addListener(
        $dom.getElementsByClassName('product_cycler_link', 'a', 'leaf_products_switcher_navigation'), 
        'mouseover', 
        products_switcher.toggle_on_hover);
}

products_switcher.toggle_on_hover = function(e) {
    $event.preventDefault(e);
    var target = $event.getTarget(e);
    var carousels = $dom.getElementsByClassName('product_cycler', 'div', 'leaf_products_switcher', function(element) {
        $dom.setStyle(element, 'display', 'none');
    });
    $dom.setStyle($(target.id.replace('_link', '')), 'display', 'block');
    var carousels = $dom.getElementsByClassName('product_cycler_link', 'a', 'leaf_products_switcher_navigation', function(element) {
        $dom.removeClass(element, 'selected');
    });
    $dom.addClass(target, 'selected');
}
/****** END PRODUCT SWITCHER ******/


/****** EXPANDO LINKS ******/
var expando_links = {};
expando_links.links = {'buying_guide_expando_link': ['block', ''],
                       'leaf_subcategory_expando_link': ['inline', ''],
                       'leaf_derived_importance_expando_link': ['inline', ''],
                       'list_related_topics_expando_link': ['block', ''],
                       'leaf_brand_expando_link': ['block', ''],
                       'leaf_topics_expando_link': ['block', 'reversible'],
                       'list_topics_expando_link': ['block', 'reversible'],
                       'product_description_expando_link': ['block', ''],
                       'related_searches_expando_link': ['block', 'reversible']};

expando_links.toggle = function(e) {
    $event.preventDefault(e);
    var target = $event.getTarget(e);
    if (target.tagName.toLowerCase() != 'a') {
        target = $dom.getAncestorByTagName(target, 'a');
    }

    var display_type = expando_links.links[target.id][0];
    var is_reversible = expando_links.links[target.id][1] == 'reversible';
    var link_content_is_visible = expando_links.link_states[target.id];
    if (display_type) {
        if (link_content_is_visible) {
            expando_links.link_states[target.id] = 0;
            $dom.getElementsByClassName('expando_content', null, target.parentNode, function(element) {
                $dom.setStyle(element, 'display', 'none');
            });
        } else {
            if (! is_reversible) {
                $dom.setStyle(target, 'display', 'none');
            }
            expando_links.link_states[target.id] = 1;
            $dom.getElementsByClassName('expando_content', null, target.parentNode, function(element) {
                $dom.setStyle(element, 'display', display_type);
            });
        }
    }
}

expando_links.setup = function() {
    expando_links.link_states = {};
    for (var link in expando_links.links) {
        expando_links.link_states[link] = 0;
        if ($dom.inDocument(link)) {
            $event.addListener(link, 'click', expando_links.toggle);
            if ($dom.inDocument(link.replace('expando', 'retracto'))) {
                $event.addListener(link.replace('expando', 'retracto'), 'click', expando_links.toggle);
            }
            $dom.setStyle(link, 'visibility', 'visible');
        }
    }
}

function toggle_visibility(id) {
    var section = $(id);
    if (section) {
        if ($dom.getStyle(id, 'display') == 'none') {
            $dom.setStyle(id, 'display', 'block');
        } else {
            $dom.setStyle(id, 'display', 'none');
        }
    }
}
/****** END EXPANDO LINKS ******/


/****** BEGIN AMBIENT PRICES ******/
var ambient_prices = {};
ambient_prices.setup = function() {
    if (wize.offer_product_ids) {
        var url_parts = ['/fragment/ambient_offers?pids=',
                         wize.offer_product_ids,
                         '&ref=',
                         wize.list_page_type];
        YAHOO.util.Connect.asyncRequest(
            'GET',
            url_parts.join(''),
            {
                success: function(o) {
                    var offers = o.responseText.split('\n');
                    for (var i=0; i<offers.length; i++) {
                        var offer_line = helpers.trim_string(offers[i]);
                        if (offer_line) {
                            var offer_parts = offer_line.split('|');
                            var product_id = offer_parts[0];
                            var offer_html = offer_parts[1];
                            var price_link = $('best_price_' + product_id);
                            if (price_link) {
                                price_link.innerHTML = offer_html;
                            }
                        }
                    }
                },
                failure: function() {
                    $dom.getElementsByClassName('best_price_fallback', 'div', 'content', function(element) {
                        $dom.setStyle(element, 'display', 'block');
                        element.parentNode.removeChild(element.parentNode.getElementsByTagName('img')[0]);
                    });
                }
            } 
        );
    }
}
/****** END AMBIENT PRICES ******/


/****** BEGIN INTERSTITIAL ******/
var interstitial = {};
interstitial.run_duration = 3.5;
interstitial.finish = function() {
    /** Delay carousel setup to prevent visual artifacts during interstitial animation. */
    carousel_widgets.setup();
}

interstitial.setup = function() {
    if (! $dom.inDocument('list_interstitial')) {
        interstitial.finish();
    } else {
        interstitial.abort = function() {
            $dom.setStyle('list_fade_in', 'visibility', 'visible');
            $dom.setStyle('list_fade_in', 'opacity', 1);
            interstitial.finish();
        }

        if (! $dom.inDocument('list_fade_in')) {
            interstitial.abort();
        } else {
            interstitial.logo_cloud = $('list_interstitial_logo_cloud').getElementsByTagName('img')[0];
            interstitial.count_field = $('list_interstitial_wize_products').getElementsByTagName('big')[0];

            interstitial.run = function() {
                var remaining_interstitials = YAHOO.util.Cookie.get('remaining_interstitials');
                var remaining_value = 'none';
                if (! remaining_interstitials) {
                    remaining_value = '1';
                }
                YAHOO.util.Cookie.set('remaining_interstitials', remaining_value, helpers.COOKIE_PARAMS);
                interstitial.wize_choice_count = parseInt(interstitial.count_field.innerHTML);
                interstitial.count_field.innerHTML = '0';
                $dom.setStyle('list_interstitial', 'display', 'block');
                interstitial.load.animate();
                interstitial.slide.animate();
                if (! interstitial.wize_choice_count) {
                    $dom.setStyle('list_interstitial_product_counter', 'display', 'none');
                } else {
                    var number_of_switches = Math.min(20.0, interstitial.wize_choice_count);
                    for (var i=1; i<=number_of_switches; i++) {
                        setTimeout("interstitial.count_field.innerHTML='" + parseInt(i * interstitial.wize_choice_count / number_of_switches) + "';", i * 1000 * interstitial.run_duration / number_of_switches);
                    }
                }
                setTimeout("interstitial.logo_cloud.src='/images/v4/logo/best_buy_cloud.png';", 500 * interstitial.run_duration);
                setTimeout("interstitial.logo_cloud.src='/images/v4/logo/sears_cloud.png';", 800 * interstitial.run_duration);
                setTimeout("interstitial.logo_cloud.src='/images/v4/logo/walmart_cloud.png';", 750 * interstitial.run_duration);
                setTimeout("interstitial.logo_cloud.src='/images/v4/logo/target_cloud.png';", 925 * interstitial.run_duration);
            }
            interstitial.load = new YAHOO.util.Anim(
                $('list_interstitial_progress_bar').getElementsByTagName('div')[0], 
                {width: { to: 100, unit: '%' }}, 
                interstitial.run_duration,
                YAHOO.util.Easing.easeIn
            );
            interstitial.slide = new YAHOO.util.Anim(
                $('list_interstitial_logo_cloud').getElementsByTagName('div')[0], 
                {left: { to: 519 }}, 
                interstitial.run_duration,
                YAHOO.util.Easing.easeIn
            );
            interstitial.fade_out = new YAHOO.util.Anim(
                'list_interstitial',
                {opacity: { to: .0 }},
                .5,
                YAHOO.util.Easing.easeInStrong
            );
            interstitial.fade_in = new YAHOO.util.Anim(
                'list_fade_in',
                {opacity: { to: 1 }},
                .5,
                YAHOO.util.Easing.easeOutStrong
            );

            interstitial.load.onComplete.subscribe(function() {
                setTimeout("interstitial.fade_out.animate();", 600);
            });
            interstitial.fade_out.onComplete.subscribe(function() {
                $dom.setStyle('list_interstitial', 'display', 'none');
                $dom.setStyle('list_fade_in', 'opacity', 0);
                $dom.setStyle('list_fade_in', 'visibility', 'visible');
                interstitial.fade_in.animate();
            });
            interstitial.fade_in.onComplete.subscribe(interstitial.finish);

            interstitial.run();
        }
    }
}
/****** END INTERSTITIAL ******/


/****** BEGIN PRODUCT TABS ******/
var product_tabs = {};
product_tabs.setup = function() {
    if ($dom.inDocument('product_reviews_tab_link') && $dom.inDocument('product_specs_tab_link')) {
        product_tabs.show_specs = function() {
            $dom.setStyle('product_reviews_tab_content', 'display', 'none');
            $dom.setStyle('product_specs_tab_content', 'display', 'block');
            $dom.addClass($('product_specs_tab_link').parentNode, 'selected');
            $dom.removeClass($('product_reviews_tab_link').parentNode, 'selected');
        }
        product_tabs.show_reviews = function() {
            $dom.setStyle('product_specs_tab_content', 'display', 'none');
            $dom.setStyle('product_reviews_tab_content', 'display', 'block');
            $dom.addClass($('product_reviews_tab_link').parentNode, 'selected');
            $dom.removeClass($('product_specs_tab_link').parentNode, 'selected');
        }
        if (helpers.get_url_fragment(location.href) == 'specs') {
            product_tabs.show_specs();
        }
        $event.addListener('product_reviews_tab_link', 'click', product_tabs.show_reviews);
        $event.addListener('product_specs_tab_link', 'click', product_tabs.show_specs);
    }
}
/****** END PRODUCT TABS ******/


/****** BEGIN BRAND ADJECTIVES ******/
var brand_adjectives = {};
brand_adjectives.setup = function() {
    if ($dom.inDocument('leaf_brand_adjectives')) {
        $dom.getElementsByClassName('brand_hover_link', 'a', 'leaf_brand_adjectives', function(element) {
            $event.addListener(element, 'mouseover', function(e) {
                brand_adjectives.clear_all_hovers();
                brand_adjectives.on_hover(element);
            });
        });
    }
}
brand_adjectives.clear_all_hovers = function() {
    $dom.removeClass($('leaf_brand_adjectives').getElementsByTagName('ol'), 'highlight');
    $dom.removeClass($('leaf_brand_adjectives').getElementsByTagName('a'), 'highlight');
}
brand_adjectives.on_hover = function(element) {
    var adjectives_container = $(element.id.replace('brand_hover_', 'brand_adjectives_'));
    if (adjectives_container) {
        $dom.addClass(element, 'highlight');
        $dom.addClass(adjectives_container, 'highlight');
    }
}
/****** END BRAND ADJECTIVES ******/


var offer_tooltips = function() {}
offer_tooltips.setup = function() {
    if ($dom.inDocument('prices_table')) {
        $dom.getElementsByClassName('has_tooltip', 'div', 'prices_table', function(element) {
            var text_containers = $dom.getElementsByClassName('tooltip', 'div', element);
            if (text_containers.length) {
                var tt = new YAHOO.widget.Tooltip('price_tooltip', 
                                                  {context: element, 
                                                   text: text_containers[0].innerHTML,
                                                   showDelay:500} );
            }
        });
    }
}

function setup_product_prices_teaser() {
    if ($dom.inDocument('product_prices_teaser')) {
        var url_parts = ['/fragment/prices/', wize.current_product_id, '?ref=', wize.product_page_type];
        YAHOO.util.Connect.asyncRequest(
            'GET',
            url_parts.join(''),
            {
                success: function(o) {
                    $('product_prices_teaser').innerHTML = o.responseText;
                },
                failure: function() {
                    $('product_prices_teaser').innerHTML = '<p>There are currently no offers for this product.</p>';
                }
            }
        );
    }
}

var MAX_RECENT_PRODUCTS = 4;
function setup_recently_visited_products() {
    // Handled in JS to bypass caching logic
    if (wize.current_product_id) {
        var recent_product_ids = YAHOO.util.Cookie.get('recent_product_ids');
        recent_product_ids = (recent_product_ids == null) ? [] : recent_product_ids.split(',');
        var updated_ids = []
        updated_ids.push(wize.current_product_id);
        for (var i=0; i<recent_product_ids.length && i<MAX_RECENT_PRODUCTS; i++) {
            if (recent_product_ids[i] != wize.current_product_id) {
                updated_ids.push(recent_product_ids[i]);
            }
        }
        YAHOO.util.Cookie.set('recent_product_ids', updated_ids.join(','), helpers.COOKIE_PARAMS);
    }
    if ($dom.inDocument('recent_products')) {
        YAHOO.util.Connect.asyncRequest(
            'GET', 
            '/fragment/recent_products',
            {
                success: function(o) {
                    $('recent_products').innerHTML = o.responseText;
                },
                failure: function() {}
            } 
        );
    }
}

/** Core Wize Setup */
function setup_wize_page() {
    interstitial.setup();
    setup_custom_event_tracking();
    setup_product_prices_teaser();
    review_reader.setup();
    modal_filters.setup();
    cloud_navigation.setup();
    products_switcher.setup();
    brand_adjectives.setup();
    expando_links.setup();
    product_tabs.setup();

    /**
    setup_compare();
    setup_clickable_snippets();
    setup_reviews_and_comments();
    setup_search_textbox();
    setup_flashing_message();
    setup_question_action_links();
    setup_microcomment_links();
    setup_contact_form();
    setup_focus();
    setup_q_and_a_form_authentication();
    setup_snippet_containers();
    */

    setup_prices_zip_code();
    stash_tray.setup();
    setup_recently_visited_products();
    ambient_prices.setup();
    do_survey();
    offer_tooltips.setup();
}
