if (!Array.prototype.indexOf) { // for old versions of IE
    Array.prototype.indexOf = function (obj, fromIndex) {
        for ( var i = (fromIndex == null ? 0 : fromIndex), length = this.length; i < length; i++ ) {
            if ( this[i] === obj ) {
                return i;
            }
        }
        
        return -1;
    }
}

var momcom = function(){
    
    var validator = {
        regex :
            {
                email : /^[^@\s]+@[^@\s]+[.][^.@\s]+$/i,
                zip : /^[0-9]{5}$/,
                fullname : /[\w]+/,
                subject : /[\w]+/,
                bodyfield : /[\w]+/
            },
        
        valid :
            function(type, value)
            {
                if (typeof this.regex[type] === 'undefined')
                    return false;
                
                return this.regex[type].test(value);
            }
        
        
    };
    
    var events = {
    
        isReady : false,
        isLoaded : false,
        
        listen :
            function (listener, name, handler)
            {
                if (!listener)
                    return;
                else if (listener.addEventListener)
                    listener.addEventListener(name, handler, false);
                else if (listener.attachEvent)
                    listener.attachEvent('on'+name, handler);
            },
        
        onLoad :
            function (handler)
            {
                if (events.isLoaded)
                    handler.call();
                else
                    events.listen(window, 'load', handler);
            },
        
        onReady :
            function (handler)
            {
                if (events.isReady)
                    handler.call();
                else if (window.addEventListener)
                    events.listen(document, "DOMContentLoaded", handler);
                else
                    events.onLoad(handler);
            },
        
        fixEvent :
            function (ev)
            {
                if (ev.preventDefault)
                    return ev;
                
                return {
                    type : window.event.type,
                    target : window.event.srcElement,
                    stopPropagation : function() {window.event.cancelBubble = true},
                    preventDefault : function() {window.event.returnValue = false}
                };
                
            }
    };
    events.onReady(function(){events.isReady = true;});
    events.onLoad(function(){events.isReady = events.isLoaded = true;});

    // dom mangling utils
    var dom = {
        
        getEl :
            function (el)
            {
                if (typeof el.nodeName === 'undefined')
                    return document.getElementById(el);
                return el;
            },
            
        getTags :
            function (tn,p)
            {
                return (p||document).getElementsByTagName(tn||'*');
            },
        
        addEl :
            function (el,p)
            {
                return (p?p:document.body).appendChild(el);
            },
        
        removeEl :
            function (el,p) {
                var rem = null;
                try {
                    rem = (p?p:(el.parentNode?el.parentNode:document.body)).removeChild(el);
                }
                catch (err) {}
                return rem;
            },
        
        makeEl :
            function (tagName, className, html, attrs)
            {
                var el = document.createElement(tagName||'div');
                if (className != null)
                    dom.addClass(el, className);
                if (html != null)
                    dom.html(el,html);
                if (attrs != null)
                    dom.attr(el,attrs);
                return el;
            },
            
        hasClass :
            function (el,cn)
            {
                return el.className && el.className.indexOf(cn) > -1;
            },
    
        addClass :
            function (el,cn)
            {
                if (cn && !dom.hasClass(el,cn))
                    el.className = el.className + ' ' +cn;
            },
            
        insertAfter :
            function (el, t)
            {
                var p = t.parentNode?t.parentNode:document.body, n = dom.nextNode(t);
                if (n)
                    p.insertBefore(el,dom.nextNode(t));
                else
                    dom.addEl(el, p);
            },
            
        insertBefore :
            function (el, t)
            {
                var p = t.parentNode?t.parentNode:document.body;
                p.insertBefore(el,t);
            },
            
        // skips over empty text nodes made from whitespace between tags
        canIgnoreNode :
            function (n) {
                return ( n.nodeType == 8) || ( (n.nodeType == 3) && !/[^\t\n\r ]/.test(n.data) );
            },
            
        nextNode :
            function (n)
            {
                while ((n = n.nextSibling))
                    if (!dom.canIgnoreNode(n))
                        return n;
                return null;
            },
            
        prevNode :
            function (n)
            {
                while ((n = n.previousSibling))
                    if (!dom.canIgnoreNode(n))
                        return n;
                return null;
            },
            
        replace :
            function (oldNode, newNode)
            {
                document.body.parentNode.replaceChild(newNode, oldNode);
            },    
    
        removeClass:
            function (el,cn)
            {
                if (cn && dom.hasClass(el,cn))
                    el.className = el.className.replace(new RegExp('\\b'+cn+'\\b'),'');
            },
            
        toggleClass:
            function (el,cn)
            {
                if (dom.hasClass(el,cn))
                    dom.removeClass(el,cn);
                else
                    dom.addClass(el,cn);
            },
            
        attr :
            function (el,attrs,val)
            {
                if (el && attrs) {
                    if (typeof attrs == 'string') {
                        if (arguments.length == 2)
                            return el.getAttribute(attrs);
                        else if (val === null)
                            el.removeAttribute(attrs);
                        else
                            el.setAttribute(attrs,val);
                    }
                    else
                        for (p in attrs) {
                            if (attrs[p] === null)
                                el.removeAttribute(p);
                            else
                                el.setAttribute(p, attrs[p]);
                        }
                }                
            },
    
        css :
            function (el,styles,val)
            {
                if (styles) {
                    if (typeof styles == 'string')
                        el.style[styles] = val;
                    else
                        for (p in styles)
                            el.style[p] = styles[p];
                }
            },
        
        html :
            function (el,html)
            {
                if (html != null)
                    el.innerHTML = html;
                return el.innerHTML;
            }
            
    };
    
    // base obj with util functions
    var ui = {

        getPos :
            function (width,height,left,top)
            {
                var pos ={
                        width : width ? parseInt(width, 10) : 500,
                        height : height ? parseInt(height, 10) : 400
                    };
                pos.left = left
                    ? parseInt(left, 10)
                    : Math.max(1, Math.floor((ui.getBodyDim('clientWidth','min')  - pos.width)/2 + ui.getBodyDim('scrollLeft')));
                pos.top = top
                    ? parseInt(top, 10)
                    : Math.max(1, Math.floor((ui.getBodyDim('clientHeight','min') - pos.height)/2 + ui.getBodyDim('scrollTop')));
                pos.right = pos.left + pos.width;
                pos.bottom = pos.top + pos.height;
                return pos;
            },
            
        getBodyDim :
            function (dim,scale)
            {
                if (!scale)
                    scale = 'max';
                return Math[scale](document.body[dim], document.documentElement[dim]);
            },
        
        setPos :
            function(el,pos,units)
            {
                if (!units)
                    units = 'px';
                    
                if (pos)
                    for (p in pos) 
                        el.style[p] = pos[p] + units;
            }
    };

    // modal popups
    var modal = {
        
        current : null,
        
        open :
            function(content, width, height, opt)
            {
                modal.close();
                    
                if (opt == null)
                    opt = {};
                    
                var pop = dom.makeEl('div', 'modalPopup rounded shadow', (opt.noCloseButton ?'':'<a class="modalClose" href="#" onclick="return momcom.modal.close()">[x] close</a>')+content, {'id':'modalPopupWindow'}),
                    frame = dom.makeEl('div', 'modalFrame', '<div class="modalBackground"></div>');
                dom.css(frame, 'height', ui.getBodyDim('scrollHeight')+'px');
                if (opt.className)
                    dom.addClass(pop,opt.className);
                ui.setPos(pop, ui.getPos(width,height));
                dom.css(pop,opt.styles);
                dom.addEl(pop,frame);
                modal.current = dom.addEl(frame);
            },
            
        openURL :
            function(url, width, height, opt)
            {
                modal.open('<iframe border="0" frameborder="0" allowTransparency="true" class="modalIframe" src="'+url+'"></iframe>', width, height, opt);
            },
            
        close :
            function()
            {
                if (modal.current)
                    dom.removeEl(modal.current);
                    return false;
            },
            
        resize :
            function(width, height)
            {
                if (modal.current)
                    ui.setPos(dom.getEl('modalPopupWindow'), ui.getPos(width,height));
            }
            
    };
    
    // interactive dialogs, including workalikes for alert(), confirm(), and prompt()
    var dialog = {
        
        _buttons : {}, 
        
        open :
            function(message, buttons, width, height, opt)
            {
                if (opt == null)
                    opt = {};
                opt.noCloseButton = true;
                dialog._buttons = buttons;
                var i, bo = '';
                for (i in buttons)
                    bo += '<a class="button standard '+(buttons[i].className?buttons[i].className:'')+'" href="javascript:momcom.dialog.click(\''+i+'\')">'+ buttons[i].label +'</a>';
                
                message = '<div class="dialogMessage">'+message+'</div><div class="dialogButtons">'+bo+'</div>';
                modal.open(message, width?width:300, height?height:100, opt);
            },
            
        confirm :
            function(message, callback, returnVal, width, height, opt)
            {
                opt = opt||{};
                dialog.open(message, {'confirm':{label:opt.confirm_label||'OK',callback:callback,params:[returnVal?returnVal:true]},'cancel':{label:opt.cancel_label||'Cancel',callback:callback,params:[false]}}, width, height, opt)
            },
            
        alert : 
            function(message, width, height, opt)
            {
                opt = opt||{};
                dialog.open(message, {'confirm':{label:opt.confirm_label||'OK'}}, width, height, opt); 
            },
            
        prompt :
            function(message, defaultText, callback, width, height, opt)
            {
                opt = opt||{};
                message += '<input type="text" class="dialogPrompt rounded" id="simpleUI-dialogPrompt" value="'+(defaultText?defaultText:'')+'"/>';
                buttons = {'confirm':{label:opt.confirm_label||'OK',callback:dialog._handlePrompt,params:[true,callback]},'cancel':{label:opt.cancel_label||'Cancel',callback:dialog._handlePrompt,params:[false,callback]}};
                dialog.open(message, buttons, width, height, opt);
                dom.getEl('simpleUI-dialogPrompt').focus();
            },
        
        click :
            function(idx)
            {
                var button = dialog._buttons[idx], cb = button?button.callback:null;
                if (button) {
                    if (cb)
                        dialog._doCallback(cb, button.params?button.params:[idx], button, idx);
                    modal.close(); 
                }
            },
            
        _doCallback:
            function(cb, params, button, value)
            {
                if (cb.apply)
                    cb.apply(button?button:null, params?params:[value]);
                else
                    eval(cb);
            },
        
        _handlePrompt:
            function(getVal, cb)
            {
                var value = getVal ? dom.getEl('simpleUI-dialogPrompt').value : null;
                dialog._doCallback(cb, [value], this, value);
            }
    }
    
    var ajax = {
        get :
            function(url, handler)
            {
                ajax.open(url, handler, 'GET', null);
            },
        
        post :
            function(url, handler, postData)
            {
                ajax.open(url, handler, 'POST', postData);
            },
        
        open :
            function(url, handler, method, postData)
            {
                var xhr = ajax.xhr();
                xhr.open(method, url, true);
                if (postData != null) {
                    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    if (typeof postData != 'string')
                        postData = ajax.encodeParams(postData);
                }
                if (handler) {
                    xhr.onreadystatechange = function() {
                        if (xhr.readyState==4)
                            handler(xhr.responseText, {url:url, method:method, postData:postData});
                    };
                }
                xhr.send(postData);
            },
            
        parseXML :
            function(xml)
            {
                if (window.DOMParser)
                    return new DOMParser().parseFromString(xml, "text/xml");
                else {
                    var parser = new ActiveXObject("Microsoft.XMLDOM");
                    parser.async="false";
                    return parser.loadXML(xml);
                }
            },
            
        parseJSON :
            function(text)
            {
                text = String(text);
                if (typeof JSON !== 'undefined')
                    return JSON.parse(text);
                    
                var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
                if (cx.test(text)) {
                    text = text.replace(cx, function (a) {
                        return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                    });
                }
                if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
                    return eval('(' + text + ')');
                }
                return false;
            },

        xhr :
            function()
            {
                if (window.XMLHttpRequest)
                    return new XMLHttpRequest();
                else
                    return new ActiveXObject("Microsoft.XMLHTTP");
            },
            
        encodeParams :
            function(params)
            {
                var p, o = [];
                for (p in params) {
                    o.push([p, window.encodeURIComponent(params[p])].join('='));
                }
                return o.join('&');
            }
    };
            
    // for setting messages
    
    var messages = {
        
        clear :
            function(type, loc, msgs)
            {
                
            },
        
        set :
            function(type, loc, msgs)
            {
                
            }
        
    };
    
    // localStorage interface
    var storage = {enabled:false}, _hasLocalStorage = 'localStorage' in window && window['localStorage'] !== null;
    if (_hasLocalStorage) {
        storage = {
            
            enabled : true,
            
            put :
                function(k, v)
                {
                    localStorage.setItem(k, v);
                },
            
            get :
                function(k)
                {
                    return localStorage.getItem(k);
                },
            
            remove :
                function(k)
                {
                    localStorage.removeItem(k);
                },

            clear :
                function()
                {
                    localStorage.clear();
                },
                
            size :
                function()
                {
                    return localStorage.length;
                }
                
        };
    };
    
    var _momcom =
        {
            
            'dom' : dom,
            'events' : events,
            'ajax' : ajax,
            
            'modal' : modal,
            'dialog' : dialog,
            
            'validator' : validator,
            
            'storage' : storage,
            
            'foo' : 'bar'
        };
        
    return _momcom;
}();
with (momcom) {
    events.onReady(    
        function() {
            // ensure we post actions to secure host
            var postHost = isSecureUrl?hosts.secure:hosts.http;
            
            // adds placeholder js for browsers that don't support the html5 attr
            var signupEmailField = dom.getEl('signup_email_field'), sefPlaceholder;
            if (signupEmailField && !('placeholder' in dom.makeEl('input'))) {
                sefPlaceholder = dom.attr(signupEmailField, 'placeholder');
                signupEmailField.value = sefPlaceholder;
                events.listen(signupEmailField, 'focus', function(ev){
                    if (signupEmailField.value == sefPlaceholder)
                        signupEmailField.value = '';
                });
                events.listen(signupEmailField, 'blur', function(ev){
                    if (signupEmailField.value == '')
                        signupEmailField.value = sefPlaceholder;
                });
            }
            
            // add modal popup handling
            events.listen(document, 'click', function (ev){
                ev = events.fixEvent(ev);
                ev.stopPropagation();
                
                if (dom.hasClass(ev.target, 'popup')) {
                    ev.preventDefault();
                    var href = ev.target.getAttribute('href');
                    modal.openURL(href + (/[?]/.test(href) ? '&':'?') + 'modal=true');
                }

                if (signupEmailField && dom.hasClass(ev.target, 'topsignup')) {
                    ev.preventDefault();
                    var email = signupEmailField.value;
                    ajax.post(postHost+'/actions/reg_flow', function(val){ modal.openURL(postHost+'/signup?modal=true', 807, 478, {className:'signup', noCloseButton:true}); }, {'submit':'ajax','email':email});
                }
                
            });
            
            // handle region dropdown
            var region = dom.getEl('region_id_select');
            if (region)
                events.listen(region, 'change', function (ev){
                    ev = events.fixEvent(ev);
                    ev.stopPropagation();
                    region.parentNode.submit();
                });
            
            // start countdown on deal page
            var countdown = dom.getEl('countdown');
            if (countdown && window.countdownDuration != null) {
                var countdownInterval = window.setInterval(
                    function() {
                        var secs = window.countdownDuration--, durs = [1,60,3600,86400], i, j = 0, newCount, times = [], fl = Math.floor;
                        
                        if (secs == 0) {
                            dom.addClass(countdown.parentNode, 'expired');
                            window.clearInterval(countdownInterval);
                        }
                        else {
                            times = [fl(secs/86400), fl((secs%86400)/3600), fl((secs%3600)/60), secs%60];
                            
                            if (times[2] < 10)
                                times[2] = "0"+times[2];
                                                      
                            if (times[3] < 10)
                                times[3] = "0"+times[3];
                                                      
                            newCount = document.createTextNode((times[0] > 0?times[0]+' days ':'')+times[1]+':'+times[2]+':'+times[3]);
                            countdown.replaceChild(newCount, countdown.firstChild);
                        }
                    }
                , 1000);
            }
            
            var mydeals = dom.getEl('mydeals');
            if (mydeals) {
                events.listen(mydeals, 'click', function (ev){
                    ev = events.fixEvent(ev);
                    ev.stopPropagation();

                    if (dom.hasClass(ev.target, 'use_voucher')) {
                        var tId = ev.target.getAttribute('id');
                        ev.preventDefault();
                        ajax.post(
                            '/actions/use_voucher', 
                            function(val){ 
                                modal.openURL('/contact/order_survey?modal=true&voucher_id='+tId, 600); 
                                dom.html(dom.getEl('used_'+tId), 'Already Used');
                            }, 
                            'submit=ajax&voucher_id='+tId
                        );
                    }
                });
            }
            
            var checkout = dom.getEl('checkout_form'), discountCodeRow = dom.getEl('discountCodeRow'), codeUsed = dom.getEl('codeUsed'),
                codeValue = dom.getEl('codeValue'), codeField = dom.getEl('discount_code'), cart = window.cartObject, offerId,
                isManageCards = false;
            if (checkout) {
                isManageCards = dom.hasClass(checkout, 'manage-cards');
                function updateCart() {
                    var i, item, sub, gSubs = {};
                    cart.subtotal = 0;
                    for (i in cart.items) {
                        item = cart.items[i];
                        item.subtotal = item.price * item.quantity;
                        cart.subtotal += item.subtotal;

                        if (item.group_id > 0 ) {
                            if (gSubs['sub-group-'+item.group_id] == null) {
                                gSubs['sub-group-'+item.group_id] = item.subtotal;
                            }
                            else {
                                gSubs['sub-group-'+item.group_id] = Math.max(item.subtotal, gSubs['sub-group-'+item.group_id]);
                            }
                        }
                        else {
                            sub = dom.getEl('sub-'+item.offer_id);
                            if (sub) {
                                dom.html(sub, '$'+item.subtotal.toFixed(2));
                            }
                        }
                    }
                    
                    for (i in gSubs) {
                        if (sub = dom.getEl(i)) {
                            dom.html(sub, '$'+gSubs[i].toFixed(2));
                        }
                    }
                    
                    if (cart.discount_code) {
                        cart.subtotal -= cart.discount_value;
                        dom.removeClass(discountCodeRow, 'hidden');
                        dom.removeClass(codeUsed, 'error');
                        dom.html(codeUsed, 'Discount code '+ cart.discount_code +' used.');
                        dom.html(codeValue, '-$'+cart.discount_value.toFixed(2));
                        codeField.value = cart.discount_code;
                    }
                    else if (cart.invalid_code) {
                        dom.removeClass(discountCodeRow, 'hidden');
                        dom.addClass(codeUsed, 'error');
                        if (cart.invalid_reason == 'used_code')
                            dom.html(codeUsed, 'You used this code on a prior order: '+cart.invalid_code);
                        else
                            dom.html(codeUsed, 'Sorry, this is not a valid discount code.');
                        dom.html(codeValue, '');
                        codeField.value = '';
                    }
                    if (cart.credit_available) {
                        cart.credit_applied = Math.min(cart.credit_available, cart.subtotal);
                        cart.subtotal -= cart.credit_applied;
                        dom.html(dom.getEl('creditApplied'), '-$'+cart.credit_applied.toFixed(2));
                        if (cart.credit_applied == 0)
                            dom.addClass(dom.getEl('momDollarsRow'), 'hidden');
                        else
                            dom.removeClass(dom.getEl('momDollarsRow'), 'hidden');
                        
                    }
                    dom.html(dom.getEl('cartTotal'), '$'+cart.subtotal.toFixed(2));
                    dom.html(dom.getEl('finalTotal'), '$'+cart.subtotal.toFixed(2));
                    if (cart.subtotal == 0)
                        dom.addClass(dom.getEl('payment-block'), 'hidden');
                    else
                        dom.removeClass(dom.getEl('payment-block'), 'hidden');
                }
                
                function applyCode(res) {
                    if (res.error) {
                        cart.invalid_code = res.code_html
                        cart.invalid_reason = res.msg;
                        cart.discount_code = null;
                        cart.discount_value = 0;
                        updateCart();
                    }
                    else {
                        cart.discount_code = res.code;
                        cart.discount_value = res.discount*-1;
                        updateCart();
                    }
                }
                function handleQuantityChange(field){
                    var item, newQty;
                    offerId = field.name.match(/[0-9]+/)[0];
                    newQty = parseInt(field.value, 10) || 0;
                    if (newQty == 0)
                        field.value = 0;
                        
                    if (cart.items[offerId]) {
                        item = cart.items[offerId];
                        if (item.is_gift && newQty > item.max_gift_quantity) {
                            dom.html(dom.getEl('order_errors'), '<ul class="error"><li>You may only purchase '+ item.max_gift_quantity +' of this item as a gift.</li></ul>');
                        }
                        else if (!item.is_gift && newQty > item.max_user_quantity) {
                            dom.html(dom.getEl('order_errors'), '<ul class="error"><li>You may only purchase '+ item.max_user_quantity +' of this item.</li></ul>');
                        }
                        else {
                            dom.html(dom.getEl('order_errors'), '');
                            item.quantity = newQty;
                            updateCart();
                        }
                    }
                }
                function handleGroupChange(field) {
                    var newItemId = field.value, groupId =  field.name.match(/[0-9]+/)[0],
                        group = cart.groups[groupId] || null, oldItemId, newPrice, renameField, i = 0,
                        renameFields = ['group-qty-', 'group-gift-from-', 'group-gift-to-', 'group-gift-email-', 'group-gift-msg-', 'group-is-gift-'];
                    if (group && cart.items[newItemId]) {
                        oldItemId = group.selected;
                        group.selected = newItemId;
                        if (oldItemId != 0) {
                            cart.items[newItemId].quantity = cart.items[oldItemId].quantity;
                            cart.items[oldItemId].quantity = 0;
                        }
                        else {
                            cart.items[newItemId].quantity = 0;
                        }
                        
                        // changes id of subtotal field
                        //dom.attr(dom.getEl('sub-'+oldItemId), 'id', 'sub-'+newItemId);
                        
                        // changes names of fields
                        for (; i < renameFields.length; i++) {
                            if (renameField = dom.getEl(renameFields[i]+groupId)) {
                                dom.attr(renameField, {'name': dom.attr(renameField, 'name').replace(oldItemId, newItemId), 'disabled': null});
                            }
                        }
                                
                        // updates price display
                        newPrice = cart.items[newItemId].price;
                        if (Math.floor(newPrice) != newPrice)
                            newPrice = newPrice.toFixed(2);
                            
                        dom.html(dom.getEl('group-per-'+groupId), '$'+newPrice);

                        updateCart();
                    }
                }
                if (window.addEventListener) {
                    events.listen(checkout, 'change', function (ev){
                        ev = events.fixEvent(ev);
                        var field = ev.target;
                        if (/^quantity/.test(field.name)) {
                            ev.stopPropagation();
                            ev.preventDefault();
                            handleQuantityChange(field);
                        }
                        else if(/^group/.test(field.name)) {
                            ev.stopPropagation();
                            ev.preventDefault();
                            handleGroupChange(field);
                        }
                    });
                }
                var disableClick = {};
                events.listen(checkout, 'click', function (ev){
                    ev = events.fixEvent(ev);
                    var tId = ev.target.getAttribute('id');
                    
                    if (disableClick[tId]) {
                        ev.stopPropagation();
                        ev.preventDefault();
                        return;
                    }
                    else if (dom.hasClass(ev.target, 'pleaseWait')) {
                        disableClick[tId] = true;
                        ev.target.value = 'Please wait...';
                    }
                    
                    // IE7/8 don't bubble up onchange events, so capture it on click here
                    if (!window.addEventListener) {
                        if (/^quantity/.test(ev.target.getAttribute('name'))) {
                            ev.stopPropagation();
                            ev.preventDefault();
                            handleQuantityChange(ev.target);
                        }
                        else if (/^group/.test(ev.target.getAttribute('name'))) {
                            ev.stopPropagation();
                            handleGroupChange(ev.target);
                        }
                    }
                    
                    // discount code
                    else if (tId == 'discount_code_submit') {
                        ev.stopPropagation();
                        ev.preventDefault();
                        var code = dom.getEl('discount_code_entry').value;
                        if (code.length) 
                            ajax.post(postHost+'/actions/apply_discount_code', function(res){applyCode(ajax.parseJSON(res));}, {'code':code});
                    }
                    
                    // add new credit card
                    else if (tId == 'add_new_card' || tId == 'cancel_new_card' || tId == 'save_card_submit') {
                        ev.stopPropagation();
                        ev.preventDefault();
                        var paymentInfo = dom.getEl('payment_info'), errorClass = 'hasError', expDate = dom.getEl('card_exp'), errorDiv = dom.getEl('new_payment_errors'), messageDiv = dom.getEl('payment_messages');
                        
                        function walkCardForm (fn)
                        {
                            var inputs = checkout.elements,
                                p = {}, i = 0, m = inputs.length, field, prefix = /^bill_/;
                                
                            for (; i < m; i++)
                                if (prefix.test(inputs[i].name))
                                    fn(inputs[i]);

                        }
                        
                        function blankCardForm()
                        {
                            walkCardForm(function(field){
                                field.value='';
                                dom.removeClass(field, 'hasError');
                            });
                            dom.removeClass(expDate, errorClass);
                            dom.html(errorDiv, '')
                            
                        }
                        
                        function uncheckCards()
                        {
                            if (isManageCards)
                                return;
                                
                            var radios = checkout.elements['saved_card'], i = 0, m = radios.length || 0;
                            if (m == 0)
                                radios.checked = false;
                            else
                                for (; i < m; i++)
                                    radios[i].checked = false;
                        }
                        
                        function handleSaveCard(res)
                        {
                            if (res.error) {
                                dom.html(errorDiv, '<ul class="error"><li>'+ res.errors.join('</li><li>') + '</li></ul>');
                                // set hasError class on fields
                                walkCardForm(function(field){
                                    if (res.fields.indexOf(field.id) > -1)
                                        dom.addClass(field, errorClass);
                                    else
                                        dom.removeClass(field, errorClass);
                                });
                                if (res.fields.indexOf('card_exp') > -1)
                                    dom.addClass(expDate, errorClass);
                                else
                                    dom.removeClass(expDate, errorClass);

                            }
                            else {
                                if(res.messages) {
                                    dom.html(messageDiv, '<ul class="success"><li>'+ res.messages.join('</li><li>') + '</li></ul>');
                                }
                                var list = dom.getEl('saved-cards'),
                                    
                                    html = '<input type="radio" name="saved_card" id="saved_card_CARDID" value="CARDID" checked="checked"/> <label class="dark-brown" for="saved_card_CARDNUM">CARDTYPE ending in ****LAST4</label>';
                                    
                                if (isManageCards) {
                                    html = '<span class="dark-brown">CARDTYPE ending in ****LAST4</span> <a href="/profile/edit_credit_card.php?id=CARDID">Edit Card</a> | <a href="/actions/delete_credit_card.php?id=CARDID" onclick="return confirm(\'Are you sure you want to delete this card?\');">Delete Card</a>';
                                }
                                html = html.replace(/CARDID/g, res.card.id).replace(/CARDTYPE/, res.card.type).replace(/LAST4/, res.card.last4);
                                
                                dom.addEl(dom.makeEl('li', null, html), list);
                                dom.addClass(paymentInfo, 'hidden');
                                blankCardForm();
                            }
                        }
                        
                        switch(tId) {
                            case 'add_new_card':
                                uncheckCards();
                                dom.removeClass(paymentInfo, 'hidden');
                                break;
                                
                            case 'cancel_new_card':
                                dom.addClass(paymentInfo, 'hidden');
                                blankCardForm();
                                break;
                                
                            case 'save_card_submit':
                                var postData = {};
                                walkCardForm(function(field){postData[field.name]=field.value});
                                ajax.post(postHost+'/actions/add_credit_card', function(res) {handleSaveCard(ajax.parseJSON(res))}, postData);
                                break;
                        }
                    }
                    
                    // show gift fields
                    else if (/^show-gift/.test(tId)) {
                        ev.stopPropagation();
                        ev.preventDefault();
                        offerId = tId.match(/[0-9]+/)[0];
                        dom.removeClass(dom.getEl('gift-'+offerId), 'hidden');
                        dom.getEl('is-gift-'+offerId).value = 1;
                        cart.items[offerId].is_gift = 1;
                    }
                    
                });
                
                
                
            }
            
            // accordions
            events.listen(dom.getEl('page'), 'click', function(ev){
                ev = events.fixEvent(ev);

                if (dom.hasClass(ev.target, 'exp-label')) {
                    ev.stopPropagation();
                    ev.preventDefault();
                    dom.toggleClass(ev.target.parentNode, 'expanded');
                    dom.toggleClass(ev.target.parentNode, 'collapsed');
                }
            });
        }
        
    );
    
}

function setDealReminder(deal_id, flag){
    momcom.ajax.post('/actions/set_deal_reminder', function(val){
        if (flag==1){ html = '<p>You\'ve set a reminder for this deal.<br /><a href="javascript:void(0);" onClick="setDealReminder('+deal_id+',0);">Cancel</a>.</p>'; } 
        else { html = '<a href="javascript:void(0);" onClick="setDealReminder('+deal_id+',1);" class="button standard">Remind Me!</a>';}
        momcom.dom.getEl('dealReminder').innerHTML = html;
    }, {'submit':'ajax','deal_id':deal_id,'flag':flag});
}

