page_loaded.push( function() {
    var YUD = YAHOO.util.Dom,
        YUE = YAHOO.util.Event,
        YUC = YAHOO.util.Connect;
    var form = YUD.get('gc_form');

    /* Use the first node as a template */
    var template = YUD.get('giveGiftCards0').cloneNode(true);
    var boxes    = YUD.getElementsByClassName('giftcard', 'div', 'gc_form');
    var next_id  = boxes.length;

    function addGCBox(before) {
        var new_node = document.createElement('DIV');
        new_node.id = 'giveGiftCards' + next_id;
        new_node.setAttribute('id', 'giveGiftCards' + next_id);
        var inner    = template.innerHTML;
        inner = inner.replace(/card\.(\d+)/g, 'card.' + next_id);
        new_node.innerHTML = inner;
        var missing = YUD.getElementsByClassName('missing', null, new_node);
        for ( var i = 0; i < missing.length; i++ ) {
            YUD.removeClass(missing[i], 'missing');
        }

        var errors = YUD.getElementsByClassName('message_error', 'div', new_node);
        for ( var i = 0; i < errors.length; i++ ) {
            errors[i].parentNode.removeChild(errors[i]);
            errors[i] = null;
        }

        if ( before ) {
            form.insertBefore(new_node, before);
        } else {
            form.appendChild(new_node);
        }
        var els = YUD.getElementsByClassName('removeLink', 'a', new_node);
        YUD.removeClass(els, 'hidden');

        next_id++;
    }

    function removeGCBox( node ) {
        node.parentNode.parentNode.removeChild(node.parentNode);
        node = null;
    }

    var calendars = {};
    function popupCalendar(node) {
        var dest      = YUD.getPreviousSibling(node);
        var container = YUD.getNextSibling(node);
        var region    = YUD.getRegion(node.parentNode);
        var cal = calendars['cal_' + dest.name];
        if ( typeof cal === 'undefined' ) {
            var opts = {};
            if ( typeof calendar_min_date !== 'undefined' )
                opts.mindate = calendar_min_date;
            if ( typeof calendar_max_date !== 'undefined' )
                opts.maxdate = calendar_max_date;
            cal = new YAHOO.widget.Calendar( 
                'cal_' + dest.name, container, opts
            );
            cal.render();
            cal.selectEvent.subscribe(
                function(type, args, obj) {
                    //var date = this.toDate(args[0][0]);
                    dest.value =
                        args[0][0][1] + '/' +
                        args[0][0][2] + '/' +
                        args[0][0][0];
                    this.hide();
                }, cal, true
            );
            calendars['cal_' + dest.name] = cal;
        }
        YUD.setStyle(container, 'left', region.left + "px");
        YUD.setStyle(container, 'top', region.bottom + "px");
        cal.show();
    }
    // initialize the user interface (calendar, etc)
    // giftcard_ui_init();
    YAHOO.Bubbling.on('god',
        function (layer, args) {
            var target = args[1].target;
            if ( target.tagName === 'INPUT' && target.name.match(/card\.\d+\.amount$/) && target.value === 'other' ) {
                var name = target.name;
                name = target.name.substr(0, name.indexOf('.amount')) + '.otheramount';
                if ( typeof form[name] !== 'undefined' ) {
                    if ( target.value === 'other' ) {
                        form[name].focus();
                    }
                }
            }
            else if ( target.tagName === 'INPUT' && target.name.match(/card\.\d+\.otheramount$/) ) {
                var name = target.name;
                name = target.name.substr(0, name.indexOf('.otheramount')) + '.amount';
                if ( typeof form[name] !== 'undefined' ) {
                    for ( var i = 0; i < form[name].length; i++ ) {
                        if ( form[name][i].value == 'other' )
                            form[name][i].checked = true;
                    }
                }
            }
            else if ( target.tagName === 'INPUT' && target.name.match(/card\.\d+\.type$/) && target.value === 'egc' && typeof default_mail_date !== 'undefined' ) {
                var name = target.name.substr(0, target.name.indexOf('.type')) + '.mail_date';
                var mail_date = form[name];
                if ( mail_date.value == default_mail_date )
                    mail_date.value = calendar_min_date;

                var email_to = target.name.substr(0, target.name.indexOf('.type')) + '.email_to';
                YUD.removeClass(form[email_to], 'hidden');
            }
            else if ( target.tagName === 'INPUT' && target.name.match(/card\.\d+\.type$/) && target.value === 'gc' && typeof default_mail_date !== 'undefined' ) {
                var name = target.name.substr(0, target.name.indexOf('.type')) + '.mail_date';
                var mail_date = form[name];
                if ( mail_date.value == calendar_min_date )
                    mail_date.value = default_mail_date;
                var email_to = target.name.substr(0, target.name.indexOf('.type')) + '.email_to';
                YUD.addClass(form[email_to], 'hidden');
            }
            else if ( YUD.hasClass(target, 'calendar') ) {
                popupCalendar( target.parentNode );
            }
            else if ( target.tagName.toUpperCase() === 'IMG' &&
                      target.parentNode.id == 'gc_add_another'
            ) {
                addGCBox(target.parentNode.parentNode);
            }
            else if ( target.tagName.toUpperCase() === 'A' &&
                      YUD.hasClass(target, 'removeLink')
            ) {
                var tgt = YUD.getAncestorByClassName(target, 'giftcard');
                removeGCBox(tgt);
            } 
            else {
                var isCal = YUD.getAncestorByClassName(target, 'yui-calcontainer');
                if ( !isCal ) {
                    for ( var i in calendars ) {
                        calendars[i].hide();
                    }
                }
                return false;
                //console.log('Behavior {actionPrompt}, define the functionality here using the reference of the event target: ' + args[1].target);
            }
            // reclaiming the event and stop the propagation
            return true;
        }
    );


});

