/**
 * SmartyCard.js
 * ( c ) 2007-2008 SmartyCard
 *
 * SmartyCard js library
 */

if ( typeof( SMARTYCARDNS ) == 'undefined' ) {
    var SMARTYCARDNS = {};
}

/* =============================================
 * Global vars
 ============================================= */
SMARTYCARDNS.currentApplicationHeight = 580;
SMARTYCARDNS.minimumApplicationHeight = 580;
SMARTYCARDNS.mouseClickEnabled = true;

if ( window.console || document.console ) {
    var trace = console.log; // shorthand for you Flash guys
} else {
    var trace = alert;
}


/* =============================================
 * All pageload events go here
 ============================================= */
Event.observe( window, 'load', function() {

    SMARTYCARDNS.formFocus();

    if ( $( 'noFlash' ) ) {
        $( 'noFlash' ).show();
    }

    if ( $( 'parentKidPoints' ) ) {
        SMARTYCARDNS.earned = $( "balance" ).value;
        SMARTYCARDNS.funded = $( "funded" ).value;
        SMARTYCARDNS.updateParentKidPoints( SMARTYCARDNS.earned, SMARTYCARDNS.funded );
    }

    if ( $( 'j_username' ) ) {
        $( 'j_username' ).focus();
    }
} );


/* =============================================
 * All DOM Loaded events go here
 ============================================= */
Event.observe( document, 'dom:loaded', function() {
    SMARTYCARDNS.GoogleAnalytics.observeGaLoaded( SMARTYCARDNS.buildNumber );

    SMARTYCARDNS.loadQuantcast();

    if ( "true" == SMARTYCARDNS.readCookie( "selenium" ) ) {
        $( 'buildNumber' ).hide();
    }

} );


/* =============================================
 * All rules go here
 ============================================= */
var smartyRules = {
    // nice way to debug browser rendered css styles
    // just swap out the desired element to be tested
    /*
     '.partnerImg' : function( el ) {
     el.onmouseover = function() {
     if ( window.getComputedStyle ) {
     $( 'debug' ).insert( document.defaultView.getComputedStyle( this,null ).getPropertyValue( 'height' ) );
     }
     else if( this.currentStyle ) {
     $( 'debug' ).insert( this.currentStyle.height );
     }
     }
     },
     /**/
    '#applicationSWFContainer' : function() {
        SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( "/swf/SmartyCardMainApplication.swf" ), 'applicationSWF', 'applicationSWFContainer', 1000, SMARTYCARDNS.currentApplicationHeight, 'transparent', 'noscale' );
        
        if ( SMARTYCARDNS.childSessionBg.blank() ) {
            $( 'bodyBg' ).addClassName( 'AthleticField_Dusk' );
            $( 'bg_swap' ).addClassName( 'AthleticField_Dusk_bottom' );
        } else {
            $( 'bodyBg' ).addClassName( SMARTYCARDNS.childSessionBg );
            $( 'bg_swap' ).addClassName( SMARTYCARDNS.childSessionBg + '_bottom' );
        }
    },
    '#homepage_body' : function() {
        SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( '/swf/globalNav/homepagemovie.swf' ), 'homepageSWF', 'flashMovie', '100%', '100%', 'transparent', 'scale' );
    },
    '#howto_useSMC' : function() {
        SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( '/swf/promo/promoPlayer/promoPlayer.swf' ), 'howtouseSWF', 'howto_useSMC', '100%', '100%', 'transparent', 'exactfit' );
    },
    '#JSAction_childLogout, .promptLogout' : function( el ) {
        el.onclick = function() {
            var leaving = confirm( 'Are you sure you want to log out?' );

            if ( !leaving ) {
                return false;
            }
        };
    },
    '#bg_swap' : function( el ) {
        var docBody = document.body;
        el = ( SMARTYCARDNS.IEVersion() == 6 ) ? $( 'outterGalaxy' ) : $( 'bg_swap' );

        if ( SMARTYCARDNS.IEVersion() == 6 ) {
            SMARTYCARDNS.resizeElement( 'outterGalaxy' );
            $( 'bg_swap' ).remove();
        }

        if ( $( docBody ).hasClassName( 'CentralPark_v2' ) ) {
            el.addClassName( 'CentralPark_v2_bottom' );
        }
        else if ( $( docBody ).hasClassName( 'CentralPark_v1' ) ) {
            el.addClassName( 'CentralPark_v1_bottom' );
        }
        else if ( $( docBody ).hasClassName( 'BasketballCourt' ) ) {
            el.addClassName( 'BasketballCourt_bottom' );
        }
    },
    '#user_username, #signupForm_user_username, #childMemberName, #childEmail, #formElement_newChild_username': function( el ) {
        el.onblur = function() {
            var inputVal = this.value;
            if ( inputVal.blank() ) {
                try {
                    if ( $( this.id ).next() != null ) {
                        $( this.id ).next().remove();
                    }
                }
                catch ( err ) {
                }
                return;
            }

            if ( inputVal.length > 0 ) {
                SMARTYCARDNS.checkUsername( this.id, inputVal );
            }
            else {
                if ( $( this ).next() != null ) {
                    $( this ).next().removeClassName( 'usernameNotAvailable' ).removeClassName( 'usernameAvailable' ).update( '' );
                }
            }
        };
    },
    '#myPassword_deprecated' : function( el ) {
        el.onblur = function() {
            SMARTYCARDNS.validatePasswd( this.value, 'passwdError' );
        };
    },
    '#JSAction_closeModalNoHide' : function( el ) {
        el.onclick = function() {
            top.SMARTYCARDNS.ModalIframe().closeNoHide();
        };
    },
    '#JSAction_closeModalIframe, #JSAction_closeModalCOPPA' : function( el ) {
        el.onclick = function() {
            top.SMARTYCARDNS.ModalIframe().close();

            if ( SMARTYCARDNS.childSessionBg != null && !SMARTYCARDNS.childSessionBg.blank() ) {
                top.SMARTYCARDNS.updateSWFPointsConsumed();
            }
        };
    },
    '#orderDone, #JSAction_keepPlaying, #closeButton' : function( el ) {
        el.onclick = function() {
            top.SMARTYCARDNS.ModalIframe().close();
            top.SMARTYCARDNS.updateSWFPointsConsumed();
        };
    },
    '#JSAction_buyACardNow' : function( el ) {
        el.onclick = function() {
            top.SMARTYCARDNS.ModalIframe().close();
            top.SMARTYCARDNS.getIsActivityInProgress( '/card/buySmartyCard.html' );
        };
    },
    '#JSAction_signUp' : function( el ) {
        el.onclick = function() {
            top.SMARTYCARDNS.ModalIframe().close();
            top.SMARTYCARDNS.getIsActivityInProgress( '/kid/registration/saveAccount.html' );
        };
    },
    '.closeWindow' : function( el ) {
        el.onclick = function() {
            window.close();
        };
    },
    '#printPage' : function( el ) {
        el.onclick = function() {
            if ( $( 'smartynav' ) ) {
                $( 'smartynav' ).addClassName( 'doNotPrint' );
            }

            if ( $( 'homefooter' ) ) {
                $( 'homefooter' ).addClassName( 'doNotPrint' );
            }

            if ( $( 'homepage_base' ) ) {
                $( 'homepage_base' ).addClassName( 'doNotPrint' );
            }
            
            window.print();
            return false;
        };
    },
    '#disburseSuccess' : function() {
        parent.SMARTYCARDNS.updateMetersRequest();
    },
    '#orderSubmit' : function( el ) {
        el.onclick = function() {
            if ( $( 'orderCheckOutForm' ) ) {
                $( 'orderCheckOutForm' ).submit();
            }
        };
    },
    '.JSAction_showLegalDoc' : function( el ) {
        el.onclick = function() {
            if ( el.id == 'showLegalTOU' ){
                SMARTYCARDNS.ModalIframe( true ).open( SMARTYCARDNS.getUrl( '/about/pop/terms.html' ) );
                return false;
            }

            if ( el.id == 'showLegalPrivacy' ){
                SMARTYCARDNS.ModalIframe( true ).open( SMARTYCARDNS.getUrl( '/about/pop/privacy.html' ) );
                return false;
            }

        };
    },
    '.JSAction_WhyWeAskForShippingAddress' : function( el ) {
        el.onclick = function() {
            SMARTYCARDNS.ModalIframe( false, {height: '220px'}, {height: '200px'} ).open( SMARTYCARDNS.getUrl( '/card/new/pop/whyWeAskForShippingAddress.html' ) );
            return false;
        }
    },
    '#contentContainerParent' : function() {
        if ( this ) {
            $( 'homefooter' ).addClassName( 'cssCenterAlign' );
        }
    },
    '.changeBillingInfo' : function( el ) {
        el.onclick = function() {
            var thisId = this.id;

            switch ( thisId ) {
                case 'changeCreditCard':
                    Effect.Fade( 'oldCreditCardInfo', {duration: 0.3, queue:{position: 'front', scope: 'billing'}} );
                case 'newCreditCard':
                    $( 'doSubmitCreditCardInfo' ).value = 'false';
                    Effect.BlindDown( 'newCreditCardInfo', {duration: 0.3, queue:{position: 'end', scope: 'billing'}} );
                    break;
                case 'changeBillingAddress':
                    Effect.Fade( 'oldBillingAddressInfo', {duration: 0.3, queue:{position: 'front', scope: 'billing'}} );
                case 'newBillingAddress':
                    $( 'doSubmitBillingInfo' ).value = 'false';
                    Effect.BlindDown( 'newBillingAddressInfo', {duration: 0.3, queue:{position: 'end', scope: 'billing'}} );
                    break;
            }
        };
    },
    // TODO: BlindUp flickering problem when viewport is not tall enough
    '.cancelChangeBillingInfo' : function( el ) {
        el.onclick = function() {
            var thisId = this.id;

            switch ( thisId ) {
                case 'cancelChangeCreditCard':
                    $( 'doSubmitCreditCardInfo' ).value = 'true';
                    Effect.Fade( 'newCreditCardInfo', {duration: 0.3, fps: 50, queue:{position: 'front', scope: 'billing'}} );
                    if ( $( 'oldCreditCardInfo' ) ) {
                        Effect.BlindDown( 'oldCreditCardInfo', {duration: 0.3, queue:{position: 'end', scope: 'billing'}} );
                    }
                    break;
                case 'cancelChangeBillingAddress':
                    $( 'doSubmitBillingInfo' ).value = 'true';
                    Effect.Fade( 'newBillingAddressInfo', {duration: 0.3, fps: 50, queue:{position: 'front', scope: 'billing'}} );
                    if ( $( 'oldBillingAddressInfo' ) ) {
                        Effect.BlindDown( 'oldBillingAddressInfo', {duration: 0.3, queue:{position: 'end', scope: 'billing'}} );
                    }
                    break;
            }
        };
    },
    '.editOldInfo' : function( el ) {
        el.onclick = function() {
            var thisId = this.id;

            switch ( thisId ) {
                case 'oldGrade':
                    Effect.Fade( 'oldGradeDiv', {duration: 0.3, queue:{position: 'front', scope: 'oldInfo'}} );
                    Effect.BlindDown( 'newGrade', {duration: 0.3, queue:{position: 'end', scope: 'oldInfo'}} );
                    $( 'doSubmitNewGrade' ).value = 'true';
                    break;
                case 'oldPassword':
                    Effect.Fade( 'oldPasswordDiv', {duration: 0.3, queue:{position: 'front', scope: 'oldInfo'}} );
                    Effect.BlindDown( 'newPassword', {duration: 0.3, queue:{position: 'end', scope: 'oldInfo'}} );
                    $( 'doSubmitNewPassword' ).value = 'true';
                    break;
            }
        };
    },
    '.cancelEditInfo' : function( el ) {
        el.onclick = function() {
            var thisId = this.id;

            switch ( thisId ) {
                case 'cancelEditGrade':
                    $( 'doSubmitNewGrade' ).value = 'false';
                    sel = $( 'gradeList' );
                    // Thanks to Matt Kruse for this one
                    for ( var i = 0; i < sel.options.length; i++ ) {
                        sel.options[i].selected = sel.options[i].defaultSelected;
                    }
                    Effect.Fade( 'newGrade', {duration: 0.3, fps: 50, queue:{position: 'front', scope: 'oldInfo'}} );
                    Effect.BlindDown( 'oldGradeDiv', {duration: 0.3, queue:{position: 'end', scope: 'oldInfo'}} );
                    $( 'formElement' ).reset();
                    break;
                case 'cancelEditPassword':
                    $( 'doSubmitNewPassword' ).value = 'false';
                    $( 'formElement_user_password' ).value = '';
                    $( 'formElement_user_confirmPassword' ).value = '';
                    $( 'passwdError' ).hide();
                    Effect.Fade( 'newPassword', {duration: 0.3, fps: 50, queue:{position: 'front', scope: 'oldInfo'}} );
                    Effect.BlindDown( 'oldPasswordDiv', {duration: 0.3, queue:{position: 'end', scope: 'oldInfo'}} );
                    break;
            }
        };
    },
    '#buy_a_smartycard_step1, #buy_a_smartycard_step2' : function() {
        // pick a recipient type
        $$( '.recipientContainer' ).each( function( el, index ) {
            if ( index === 0 && el.down().checked ) { // ignore if 1st el was the pick
                return;
            }

            el.removeClassName( 'activeOption' );
            var id = el.down().id;

            if ( el.down().checked ) {
                el.addClassName( 'activeOption' );
                SMARTYCARDNS.retractAllSelections( id, '.recipientType' );
            }
        } );

        // pick a payment type and amount
        $$( '.selectionHighlightContainer' ).each( function( el ) {
            el.removeClassName( 'activeOption' );

            if ( el.down().checked ) {
                el.addClassName( 'activeOption' );
            }
        } );
    },
    '.selectionHighlightContainer' : function( el ) {
        el.onclick = function() {
            // release all the other "activeOption"
            $$( '.selectionHighlightContainer' ).each( function( element ) {
                element.removeClassName( 'activeOption' );
            } );
            this.down().checked = true;
            this.addClassName( 'activeOption' );
        };
    },
    '.recipientContainer' : function( el ) {
        el.onclick = function() {
            if ( !SMARTYCARDNS.mouseClickEnabled ) {
                return false;
            }

            if ( !this.hasClassName( 'activeOption' ) && !this.hasClassName( 'fundReadOnly' ) ) {

                var id = this.down().id;

                this.down().checked = 'true';

                $$( '.recipientContainer' ).each( function( el ) {
                    el.removeClassName( 'activeOption' );
                } );

                this.addClassName( 'activeOption' );

                SMARTYCARDNS.retractAllSelections( id, '.recipientType' );
            }
        };
    },
    '.activationContainer' : function( el ) {
        el.onclick = function() {

            if ( !this.hasClassName( 'activeOption' ) && !this.hasClassName( 'fundReadOnly' ) ) {

                var id = this.down().id;

                $$( '.activationContainer' ).each( function( el ) {
                    el.removeClassName( 'activeOption' );
                    el.down().checked = false;
                } );

                this.down().checked = 'true';

                this.addClassName( 'activeOption' );

                SMARTYCARDNS.retractAllSelections( id, '.recipientType' );
            }
        };
    },
    '.childInfoContainer' : function( el ) {
        el.onclick = function() {

            if ( !this.hasClassName( 'activeOption' ) && !this.hasClassName( 'fundReadOnly' ) ) {

                var id = this.down().id;

                $$( '.childInfoContainer' ).each( function( el ) {
                    el.removeClassName( 'activeOption' );
                    el.down().checked = false;
                } );

                this.down().checked = 'true';

                this.addClassName( 'activeOption' );

                SMARTYCARDNS.retractAllSelections( id, '.recipientType' );
            }
        };
    },
    '.parentRegChildAccount' : function( el ) {
        el.onclick = function() {
            if ( !this.hasClassName( 'activeOption' ) ) {
                var id = this.down( 1 ).id;
                if ( id == 'via_newChild' ) {
                    $( 'childEmail2' ).value = '';
                    $( 'childPassword2' ).value = '';
                }
                else {
                    $( 'childFirstName' ).value = '';
                    $( 'childEmail' ).value = '';
                    $( 'childPassword' ).value = '';
                    $( 'childConfirmPassword' ).value = '';
                    $( 'childGrade' ).selectedIndex = 0;
                    try {
                        $( 'userStatusSpan' ).remove();
                    }
                    catch ( err ) {
                    }
                }
                this.down( 1 ).checked = 'true';
                $$( '.parentRegChildAccount' ).each( function( el ) {
                    el.removeClassName( 'activeOption' );
                } );
                this.addClassName( 'activeOption' );
                SMARTYCARDNS.retractAllSelections( id, '.childAccountType' );
            }
        };
    },
    '#signupLegalDocCheckboxDiv' : function() {
        if ( $( 'signupLegalDocCheckboxDiv' ) ) {
            //dynamically add a class name to the checkbox because struts template won't allow it inline
            $( 'signupLegalDocCheckboxDiv' ).down().addClassName( 'signupLegalDocCheckbox' );
        }
    },
    '.requiresLogout' : function( el ) {
        el.onclick = function() {
            /* when page redirect is needed, use Prototype's "readAttribute" method to get href's literal string instead of
             * javascript's native "this.href" which will give a full path (which is not allowed in our app)
            */
            SMARTYCARDNS.CheckLogOutPolicy( this.readAttribute('href') );
            return false;
        };
    },
    '.JSAction_ActivityInProgress' : function( el ) {
        el.onclick = function() {
            SMARTYCARDNS.CheckLogOutPolicy( this.href );
            return false;
        };
    },
    '.smcOutBoundLink' : function( el ) {
        el.onclick = function() {
            var smcOutBoundUrl = escape( this.href );

            if ( window.top == window && $('simpleModalOverlayIframe')) {
                SMARTYCARDNS.ModalIframe( false, {height: '250px'}, {height: '225px'} ).open( SMARTYCARDNS.getUrl( '/pop/coppaBumper.html?smcOutBoundUrl=' + smcOutBoundUrl ) );
                return false;
            } else {
                this.href = SMARTYCARDNS.getUrl( '/pop/coppaBumper.html?smcOutBoundUrl=' + smcOutBoundUrl );
                return true;
            }
        };
    },
    '.launchParentNoChildModal' : function( el ) {
        el.onclick = function() {

            SMARTYCARDNS.ModalIframe( false, {height: '200px'}, {height: '175px'} ).open( SMARTYCARDNS.getUrl( '/pop/noChildBumper.html' ) );

            return false;
        };
    }
};

// finally register rules with Behaviour
Behaviour.register( smartyRules );


/**********************************************************************
 @General Scripts
 **********************************************************************/

SMARTYCARDNS.getFlashVars = function() {
    var strURL = String( window.location );
    while ( strURL.lastIndexOf( "/" ) > 8 )
    {
        strURL = strURL.substr( 0, strURL.lastIndexOf( "/" ) );
    }
    return { 'restBaseUrl' : SMARTYCARDNS.getUrl( "" ), 'assetBaseUrl' : SMARTYCARDNS.getAssetUrl( "" ), 'baseURL' : strURL };
};

/* ==================================================
 Embed SWF Files
 ================================================== */
SMARTYCARDNS.embedSmartyCardSWF = function( swfPath, altContentId, width, height, wmodeSetting ) {
    var params = {};
    params.allowFullScreen = 'false';
    params.allowScriptAccess = 'always';
    params.allowResize = 'true';
    params.quality = 'best';
    params.wmode = wmodeSetting;
    params.menu = 'false';
    params.scaleMode = 'Scale';
    params.trapallkeys = 'true';

    var attributes = {};

    swfobject.embedSWF( swfPath, altContentId, width, height, "9.0.124.0", false, SMARTYCARDNS.getFlashVars(), params, attributes );
};


SMARTYCARDNS.embedSmartyCardSWF1_5 = function( swfPath, contentId, altContentId, width, height, wmodeSetting, scale ) {
    var params = window.location.href.toQueryParams();
    var flashVars = SMARTYCARDNS.getFlashVars();
    flashVars['applicationState'] = Boolean( params['applicationState'] );

    var arrFlashVars = [ "logLevel", "applicationState", "matrixURL", "avatar", "showTab", "superSecretCode", "magicCookie", "avatarName", "rewardId", "grade", "isRegistration" ];
    for ( var f in arrFlashVars ) {
        if ( Boolean( params[arrFlashVars[f]] ) ) {
            flashVars[arrFlashVars[f]] = params[arrFlashVars[f]];
        }
    }

    //var so = new SWFObject( swf, id, width, height, version, background-color [, quality, xiRedirectUrl, redirectUrl, detectKey] );
    var so = new SWFObject( swfPath, contentId, width, height, '9.0' );
    so.addParam( 'allowFullScreen', 'false' );
    so.addParam( 'allowScriptAccess', 'always' );
    so.addParam( 'trapallkeys', 'true' );
    so.addParam( 'quality', 'best' );
    so.addParam( 'wmode', wmodeSetting );
    so.addParam( 'scale', scale );
    for ( var v in flashVars ) {
        so.addVariable( v, flashVars[v] );
    }
    so.useExpressInstall( SMARTYCARDNS.getAssetUrl( '/swf/expressinstall.swf' ) );
    so.write( altContentId );
};


/* ==================================================
 @Statistics
 ================================================== */
/*
 * Google Analytics
 */
SMARTYCARDNS.GoogleAnalytics = function()
{
    var pageTracker = null;
    var initVar = null;
    var src = ( ( 'https:' == document.location.protocol ) ? 'https://ssl.' : 'http://www.' ) + 'google-analytics.com/ga.js';
    var script = new Element( 'script', { 'type': 'text/javascript', 'src': src } );

    return {

        // Used by Flash to track activity completion
        loadGA : function( url ) {
            if (document.location.href.toQueryParams().client == 'keynote') {
                return;
            }
            if ( pageTracker && url) {
                pageTracker._trackPageview( url );
            }
        },

        load : function( evt ) {
            if (document.location.href.toQueryParams().client == 'keynote') {
                return;
            }
            if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
                pageTracker = _gat._getTracker( 'UA-5964367-1' );
                if ( initVar ) {
                    pageTracker._setVar( initVar );
                }
                pageTracker._trackPageview();
            }
        },

        observeGaLoaded : function( varVal ) {
            initVar = varVal;
            script.observe( 'load', this.load );
            script.observe( 'readystatechange', this.load );

            $$( "head" )[0].appendChild( script );
        },

        trackEvent : function( obj ) {
            for ( var item in obj ) {
                try {
                    var category = ( item == 'category' ) ? obj[item] : '';
                    var action = ( item == 'actions' ) ? obj[item] : '';
                    var label = ( item == 'label' ) ? obj[item] : '';
                    var value = ( item == 'value' ) ? obj[item] : '';
                }
                catch( e ) {
                }
                //console.log( item + ': ' + obj[item] );
            }
            pageTracker._trackEvent( category, action, label, value );
        }
    };
}();


/*
 * Quantcast
 */
SMARTYCARDNS.loadQuantcast = function() {
    var script = new Element( 'script', { 'type': 'text/javascript', 'src': '//secure.quantserve.com/quant.js' } );

    _qoptions = { qacct: "p-b8XXybSix6irE" };

    $$( "head" )[0].appendChild( script );
};


/* ==================================================
 @Misc
 ================================================== */
SMARTYCARDNS.retractAllSelections = function( id, fieldToDisable ) {
    SMARTYCARDNS.toggleMouseClickEnabled();

    $$( '.toggleContainer' ).each( function( el ) {
        el.blindUp( {duration: 0.3} );
    } );

    $$( fieldToDisable ).each( function( el ) {
        el.writeAttribute( 'disabled', 'true' );
    } );

    setTimeout( 'SMARTYCARDNS.blindDownSelected( \'' + id + '\' )', 500 );
};


SMARTYCARDNS.blindDownSelected = function( id ) {
    var idToToggle = id.replace( /via_/, 'toggle_' );

    if( $( idToToggle ) )
    {
        $( idToToggle ).blindDown( { duration: 0.3 } );

        var idToEnable = id + 'Input';
        $$( '.' + idToEnable ).each( function( el ) {
            el.writeAttribute( 'disabled', null );
        } );
    }

    setTimeout( 'SMARTYCARDNS.toggleMouseClickEnabled()', 500 );
    setTimeout( 'SMARTYCARDNS.setFocus( \'' + id + '\' )', 1200 );
};

SMARTYCARDNS.toggleMouseClickEnabled = function() {
    SMARTYCARDNS.mouseClickEnabled = !SMARTYCARDNS.mouseClickEnabled;
    return SMARTYCARDNS.mouseClickEnabled;
};

SMARTYCARDNS.setFocus = function( id ) {
    var focusId = id.replace( /via_/, 'focus_' );

    if ( $( focusId ) == null ) {
        return;
    }

    $( focusId ).focus();
};


/*
 * Only used as last resort if getUrl() and getAssetBaseUrl() don't work
 */
SMARTYCARDNS.getPageBaseUrl = function() {
    var url = window.location.href;
    var match = url.match( /^https?:\/\/[^\/]+( \/[^\/]+ )/ );
    if ( match && match.length > 1 ) {
        url = match[1];
    } else {
        url = "";
    }

    //if ( console && console.log ) console.log( "SMARTYCARDNS.getPageBaseUrl(): %s", url );

    return url;
};


SMARTYCARDNS.getAssetUrl = function( path ) {
    var url = path;
    if ( SMARTYCARDNS.assetBaseUrl ) {
        url = SMARTYCARDNS.assetBaseUrl + path;
    } else {
        url = SMARTYCARDNS.getPageBaseUrl() + path;
    }

    //if ( console && console.log ) console.log( "SMARTYCARDNS.getAssetUrl(): %s", url );

    return url;
};


SMARTYCARDNS.getUrl = function( path ) {
    var url = path;
    if ( SMARTYCARDNS.baseUrl ) {
        url = SMARTYCARDNS.baseUrl + path;
    } else {
        url = SMARTYCARDNS.getPageBaseUrl() + path;
    }

    //if ( console && console.log ) console.log( "SMARTYCARDNS.getUrl(): %s", url );

    return url;
};

SMARTYCARDNS.urlencode = function( str ) {
    return escape(str).replace(/\+/g,'%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40');
}

SMARTYCARDNS.isActivate = function() {
    var requestStr = SMARTYCARDNS.getUrl('/api/kid/account/getActivationStatus.html?rand=' + SMARTYCARDNS.rand() );
    new Ajax.Request( requestStr, {
        method: 'post',
        contentType: "application/xml",
        onComplete: function( transport ) {
            var xmlDoc = transport.responseXML;
            if ( 'true' == xmlDoc.getElementsByTagName( 'activated' )[0].firstChild.nodeValue ) {
                document.location.href = SMARTYCARDNS.getUrl( "/kid/play.html" );
            } else {
                //alert( xmlDoc.getElementsByTagName( 'reason' )[0].firstChild.nodeValue );
                if ( "false" == xmlDoc.getElementsByTagName( 'loggedIn' )[0].firstChild.nodeValue ) {
                    document.location.href = SMARTYCARDNS.getUrl( "/logout.html" );
                }
            }
        }
    } );
};


SMARTYCARDNS.ChangeGlobalNavLoginStatus = function() {
    if ( SMARTYCARDNS.isLoggedIn ) {
        $( 'JSAction_globalNavLogin' ).hide();
        $( 'JSAction_globalNavLogout' ).show();
    } else {
        $( 'JSAction_globalNavLogout' ).show();
        $( 'JSAction_globalNavLogin' ).hide();
    }
};


SMARTYCARDNS.CalculateAge = function( birthDay, birthMonth, birthYear )
{
    var now = new Date();
    var today = now.getDate();
    var thisMonth = now.getMonth() + 1;
    var thisYear = now.getFullYear();
    var age;

    if ( birthMonth > thisMonth || ( birthMonth == thisMonth && birthDay > today ) )
    {
        age = thisYear - birthYear;
    }
    else
    {
        age = thisYear - birthYear + 1;
    }
    
    return age;
}


/* ==================================================
 @Username
 ================================================== */
SMARTYCARDNS.createCookie = function( name, value, daysExpired ) {
    var expires = null;
    if ( daysExpired ) {
        var date = new Date();
        date.setTime( date.getTime() + ( daysExpired * 24 * 60 * 60 * 1000 ) );
        expires = "; expires=" + date.toGMTString();
    }
    else expires = "";
    document.cookie = name + "=" + value + expires;
};

SMARTYCARDNS.readCookie = function( name ) {
    var cookie = "" + document.cookie;
    var nameEQ = name + "=";
    var value = '';
    var ca = cookie.split( ';' );
    for ( var i = 0; i < ca.length; i++ ) {
        var c = ca[i];
        while ( c.charAt( 0 ) == ' ' ) c = c.substring( 1, c.length );
        if ( c.indexOf( nameEQ ) === 0 ) return c.substring( nameEQ.length, c.length );
    }
    return value;
};

SMARTYCARDNS.checkUsername = function( senderEl, val ) {
    var requestStr = SMARTYCARDNS.getUrl( '/api/kid/account/isUserNameAvailable.html' );
    var userParams = 'userName=' + val + '&rand=' + SMARTYCARDNS.rand();
    new Ajax.Request( requestStr, {
        method:'post',
        postBody:userParams,
        onSuccess: function( transport ) {
            var xmlDoc = transport.responseXML;
            var available = xmlDoc.getElementsByTagName( 'available' )[0].firstChild.nodeValue;
            var usernameStatusEl = null;

            if ( available == 'true' ) {
                if ( $( senderEl ).next() != null ) {
                    $( senderEl ).next().removeClassName( 'usernameNotAvailable' ).addClassName( 'usernameAvailable' ).update( 'Available' );
                }
                else {
                    usernameStatusEl = new Element( 'span', { 'class': 'usernameStatus usernameAvailable roundedCorners4', 'id':'userStatusSpan'} ).update( 'Available' );
                    $( senderEl ).up().insert( usernameStatusEl );
                }
            } else {
                if ( $( senderEl ).next() != null ) {
                    $( senderEl ).next().addClassName( 'usernameNotAvailable' ).removeClassName( 'usernameAvailable' ).update( 'Unavailable' );
                }
                else {
                    usernameStatusEl = new Element( 'span', { 'class': 'usernameStatus usernameNotAvailable roundedCorners4', 'id':'userStatusSpan'} ).update( 'Unavailable' );
                    $( senderEl ).up().insert( usernameStatusEl );
                }
            }
        }
    } );
};

SMARTYCARDNS.saveUsername = function() {
    SMARTYCARDNS.createCookie( 'userLoginName', $( 'j_username' ).value, 30 );
};

SMARTYCARDNS.rememUsername = function() {
    $( 'j_username' ).value = SMARTYCARDNS.readCookie( "userLoginName" );
};

SMARTYCARDNS.clearUsername = function() {
    var username = '';
    SMARTYCARDNS.createCookie( 'userLoginName', username, 0 );
};

SMARTYCARDNS.setChildIsLoggedin = function( isLoggedIn ) {
    SMARTYCARDNS.isLoggedIn = Boolean( isLoggedIn );
    SMARTYCARDNS.ChangeGlobalNavLoginStatus();
};


/* ==================================================
 @Forms
 ================================================== */
SMARTYCARDNS.formFocus = function() {
    var formElement = $$( 'body' )[0].getElementsBySelector( 'form' )[0];
    var firstElement = ( formElement ) ? formElement.findFirstElement() : '';

    if ( formElement && firstElement ) {
        if( !firstElement.hasClassName( 'skipFocus' ) )
        {
            formElement.focusFirstElement();
        }
    }
};

/* ==================================================
 @Utility
 ================================================== */
// TODO: this function could be further abstracted to enable passing in affected elements as an array in parameter
SMARTYCARDNS.resizeElement = function( el ) {
    $( el ).setStyle( {'height': document.viewport.getHeight() + 'px'} );
};

// Check IE
SMARTYCARDNS.IEVersion = function() {
    return ( navigator.appName == 'Microsoft Internet Explorer' ) ? parseFloat( ( new RegExp( "MSIE ([0-9]{1,}[.0-9]{0,})" ) ).exec( navigator.userAgent )[1] ) : -1;
};


// generate random number
SMARTYCARDNS.rand = function() {
    return new Date().getTime();
};


// Checkboxes all or none
SMARTYCARDNS.setAllCheckboxes = function( formName, fieldName, checkVal ) {
    if ( !document.forms[formName] ) {
        return;
    }

    var objCheckBoxes = document.forms[formName].elements[fieldName];

    if ( !objCheckBoxes ) {
        return;
    }

    var countCheckBoxes = objCheckBoxes.length;

    if ( countCheckBoxes <= 1 ) {
        objCheckBoxes.checked = checkVal;
    }
    else {
        // set the check value for all check boxes
        for ( var i = 0; i < countCheckBoxes; i++ ) {
            if ( objCheckBoxes[i].disabled == false ) {
                objCheckBoxes[i].checked = checkVal;
            }
        }
    }
};


SMARTYCARDNS.CheckLogOutPolicy = function( url ) {
    var href = url;
    
    if ( !href ) return false;
    
    //href = href.replace( /https?:\/\/.+?\//i, "/" );
    //href = SMARTYCARDNS.urlencode( href );

    if ( SMARTYCARDNS.isChildAnonymous ) {
        var leaving = confirm( 'Save your activity progress now?' );

        if ( leaving ) {
            window.location = parent.SMARTYCARDNS.getUrl( '/kid/registration/saveAccount.html' );
        }

        return false;
    }

    if ( SMARTYCARDNS.isLoggedIn ) {
        var confirmMsg = 'You need to logout first - proceed?';

        if( SMARTYCARDNS.isParentUser )
        {
            confirmMsg = 'To protect your account information, you must logout of your Parent Account to access this link. Do you wish to proceed?';
        }
        else
        {
            if ( $( 'applicationSWF' ) != null && Boolean( $( 'applicationSWF' ).getIsActivityInProgress() ) ) {
                confirmMsg = 'Your activity progress will not be saved - proceed?';
            }
        }

        if ( confirm( confirmMsg ) ) {
            parent.window.location = SMARTYCARDNS.getUrl( "/logout.html?afterLogoutUrl=" + href );
        }
    } else {
        parent.window.location = href;
    }
}


/*
** CREDIT: Vishal Monpara
** http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/
*/
SMARTYCARDNS.setCaretPosition = function( el, pos ){
    if( el.setSelectionRange )
    {
        el.focus();
        el.setSelectionRange( pos, pos );
    }
    else if ( el.createTextRange ) {
        var range = el.createTextRange();
        range.collapse( true );
        range.moveEnd( 'character', pos );
        range.moveStart( 'character', pos );
        range.select();
    }
}




/* ==================================================
 Extend Scriptaculus to "move horizontally"
 ================================================== */
Effect.BlindRight = function( element ) {
    var xShift = ( SMARTYCARDNS.IEVersion() == 6 ) ? 28 : 18;

    return new Effect.Parallel( [
        new Effect.Appear( element, {duration:0.8, from:0, to:0.97, queue: {scope: 'remote', position: 'front', limit: 2}} ),
        new Effect.Move( element, {x: $( element ).getWidth() - xShift, y: 0, sync: true, queue: {scope: 'remote', positoin: 'end', limit: 2}} )
    ], arguments[1] || {} );
};


Effect.BlindLeft = function( element ) {
    var xShift = ( SMARTYCARDNS.IEVersion() == 6 ) ? 28 : 18;

    return new Effect.Parallel( [
        new Effect.Move( element, {x: -$( element ).getWidth() + xShift, y: 0, sync: true, queue: {scope: 'remote', positoin: 'front', limit: 2}} ),
        new Effect.Fade( element, {duration: 0.3, queue: {scope: 'remote', positoin: 'end', limit: 2}} ),
    ], arguments[1] || {} );
    //], {afterFinishInternal: function() {$( element ).fade( {duration: 0.2} )}}, arguments[1] || {} );
};


/* ==================================================
 @Meters
 ================================================== */
SMARTYCARDNS.updateParentKidPoints = function( earned, total ) {
    var barWidth = 152;
    if ( total === 0 ) {
        width = 0;
    } else {
        width = barWidth - earned / total * barWidth;
        if ( width > barWidth ) { // this is width of the png file
            width = barWidth; // to prevent the width from going crazy
        }
    }
    $( 'fundedAmount' ).update( (total - earned) + ' / ' + total );
    new Effect.Morph( 'valueMeter', {style:'width:' + width + 'px'} );
};


SMARTYCARDNS.updateMetersRequest = function() {
    var requestStr = SMARTYCARDNS.getUrl( '/api/kid/account/updateMeters.html?rand=' + SMARTYCARDNS.rand() + '&responseFormat=json' );
    new Ajax.Request( requestStr, {
        method: 'get',
        contentType: 'text/x-json',
        onSuccess: function( transport ) {
            // TODO: look for errors
            var json = transport.responseText;
            SMARTYCARDNS.processJSONUpdateMeterReponse( json );
        },
        onFailure: function() {
            // nada for now
        }
    } );
};

SMARTYCARDNS.processJSONUpdateMeterReponse = function( json ) {
    json = json.evalJSON();
    var jsonObj = json.smcResponse.payload.points;

    SMARTYCARDNS.updateSWFValueMeter( jsonObj.earned );
};


/**********************************************************************
 @External Interface Scripts ( called from within SWF files )
 **********************************************************************
 *
 *
 * ********************/

// switch background
SMARTYCARDNS.switchBackground = function( val ) {
    var theme = val[0];
    
    if ( !$( 'bodyBg' ).hasClassName( theme ) ) {
        $( 'bodyBg' ).removeClassName( $( 'bodyBg' ).className ).addClassName( theme );
        $( 'bg_swap' ).removeClassName( $( 'bg_swap' ).className ).addClassName( theme + '_bottom' );
    }
};


// to update Flash when points are spent via disbursement in XHTML modal box
SMARTYCARDNS.updateSWFPointsConsumed = function() {
    if ( parent.$( 'applicationSWF' ) || $( 'applicationSWF' ) )
    {
        $( 'applicationSWF' ).updateSWFPointsConsumed();
    }
};


SMARTYCARDNS.setApplicationSWFContainerHeight = function( input ) {
    var val = Number( input );

    if ( val < SMARTYCARDNS.minimumApplicationHeight ) {
        val = SMARTYCARDNS.minimumApplicationHeight;
    }

    SMARTYCARDNS.currentApplicationHeight = val;
    $( 'applicationSWF' ).setStyle( {'height': val + 'px'} );
    $( 'applicationSWFContainer' ).setStyle( {'height': val + 'px'} );
};


SMARTYCARDNS.setApplicationSWFMinimumHeight = function( input ) {
    var val = Number( input );

    SMARTYCARDNS.minimumApplicationHeight = val;

    if ( SMARTYCARDNS.currentApplicationHeight > 0 )
    {
        if ( SMARTYCARDNS.currentApplicationHeight < SMARTYCARDNS.minimumApplicationHeight ) {
            SMARTYCARDNS.setApplicationSWFContainerHeight( SMARTYCARDNS.minimumApplicationHeight );
        }
    }
};


SMARTYCARDNS.orderCheckout = function( input ) {
    
    if ( input == null || input == "" || input == -1 )
    {
        //SMARTYCARDNS.getUrl( '/card/buySmartyCard.html' );
        SMARTYCARDNS.DisplayBlueShadow( "askYourParent" );
        return;
    }

    var rewardId = Number( input );

    SMARTYCARDNS.ModalIframe().open( SMARTYCARDNS.getUrl( '/kid/pop/disburse.html?rewardId=' + rewardId + '&rand=' + SMARTYCARDNS.rand() ) );
};


SMARTYCARDNS.getIsActivityInProgress = function( url ) {
    if ( $( 'applicationSWF' ) == null ) {
        window.location = parent.SMARTYCARDNS.getUrl( url );

        return;
    }
    
    var isActivityInProgress = Boolean( $( 'applicationSWF' ).getIsActivityInProgress() );
    
    if ( isActivityInProgress ) {
        var leaving = confirm( 'Your activity progress will not be saved - proceed?' );

        if ( leaving ) {
            window.location = parent.SMARTYCARDNS.getUrl( url );
        }
    } else {
        window.location = parent.SMARTYCARDNS.getUrl( url );
    }
};

SMARTYCARDNS.buyASmartyCardConfirm = function() {
    setTimeout( "SMARTYCARDNS.handleBuyASmartyCardConfirmTimer()", 100 );
};

SMARTYCARDNS.handleBuyASmartyCardConfirmTimer = function() {
    var leaving = confirm( 'Your activity progress will not be saved - proceed?' );

    //$( 'applicationSWF' ).confirmQuit( leaving );

    if ( leaving ) {
        window.location = SMARTYCARDNS.getUrl( '/card/buySmartyCard.html' );
    }
};


// TODO: deprecated? Don't see any usage
SMARTYCARDNS.printChildConfirmation = function( flashParams ) {

    var url = SMARTYCARDNS.baseUrl + "/kid/registration/confirmation.html?firstName=" + flashParams[0] + "&userName=" + flashParams[1] + "&grade=" + flashParams[2] + "&avatarName=" + flashParams[3];

    window.open( url, "Print Confirmation" );
};


SMARTYCARDNS.showSCORM = function( val ) {
    alert( 'Oops. This is a SCORM object. It\'s not implemented yet' );
};


SMARTYCARDNS.ModalIframe = function( usesCloseButton, windowStyles, bodyStyles ) {
    if( usesCloseButton ) {
        $( 'JSAction_closeModalIframe' ).removeClassName( 'closeModal' ).addClassName( 'closeLegalDoc' );
    }

    return {
        open: function( url ) {
            var iframe = new Element( 'iframe', { 'id': "modalIframe", 'width': '100%', 'height': '100%', 'src': url, 'name': "modalIframe", 'frameborder': 0, 'scrolling': 'auto' } );
            top.$( "modalPanelBot" ).update( iframe );

            if ( windowStyles ) {
                top.$( "simpleModalIframe" ).setStyle( windowStyles );
            }
            if ( bodyStyles ) {
                top.$( "modalPanelBot" ).setStyle( bodyStyles );
            }

            top.$( "simpleModalOverlayIframe" ).appear( {duration: 0.3} );
        },

        close: function() {
            top.$( "modalIframe" ).hide();
            top.$( "simpleModalOverlayIframe" ).fade( {duration: 0.3} );
        },

        closeNoHide: function() {
            //top.$( "modalIframe" ).hide();
            top.$( "simpleModalOverlayIframe" ).fade( {duration: 0.3} );
        }
    };
};


SMARTYCARDNS.DisplayBlueShadow = function( param ) {
    $( "blueShadowOverlay" ).appear( {duration: 0.3} );

    if ( param )
    {
        var usage = param[0];

        if ( usage == "changeAvatar" ) {
            var avatarName = param[1];

            SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( "/swf/registration/kidUser/AvatarSelection.swf?avatarName=" + avatarName ), 'avatarSWF', 'injectionContainer', 978, SMARTYCARDNS.currentApplicationHeight, 'transparent', 'noscale' );

            return;
        }

        if ( usage == "askYourParent" ) {
            SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( "/swf/alerts/askYourParent/AskYourParent.swf" ), 'askYourParentSWF', 'injectionContainer', 978, SMARTYCARDNS.currentApplicationHeight, 'transparent', 'noscale' );

            return;
        }

        if ( usage == "tutorial" ) {
            SMARTYCARDNS.embedSmartyCardSWF1_5( SMARTYCARDNS.getAssetUrl( "/swf/help/noninteractive/CoachingTutorial.swf" ), 'tutorialSWF', 'injectionContainer', 1800, 1200, 'transparent', 'scale' );
            $('blueShadowOverlay').setStyle( {background: 'none', padding: '0'} );
            return;
        }
    }

    return {
        close: function() {
            $( "blueShadowOverlay" ).fade( {duration: 0.1} );
        }
    }
}


SMARTYCARDNS.HideShadowToUpdateAvatar = function() {
    $( "blueShadowOverlay" ).hide();
    $( 'applicationSWF').setAvatarVisible();
}

SMARTYCARDNS.TellApplicationToUpdateAvatar = function () {
	$( 'applicationSWF').updateChildRemote();
}

SMARTYCARDNS.TellApplicationActionFailed = function ( errorArr ) {
	$( 'applicationSWF').externalFailureOccured( errorArr[ 0 ], errorArr[ 1 ] );
}

/*
 * @SlideShow
 */
SMARTYCARDNS.SlideShow = function() {
    var i = 0;  // set the starting image.
    var wait = null;
    var thisObj = null;
    var images = null;
    var NumOfImages = null;
    var updateCounterIsEnabled = false;
    var play = null;
    var verticalAdjustmentIsEnabled = false;

    function resetInterval() {
        clearInterval( play );
        play = "";
        play = setInterval( thisObj.Play, getWaitTime() );
    }

    function getWaitTime() {
        if ( thisObj.wait == null )
        {
            thisObj.wait = 4000;
        }

        return thisObj.wait;
    }

    return {
        SetWaitTime: function( wait ) {
            this.wait = wait;
        },

        RegisterImages: function() {
            thisObj = this;

            images = arguments;
            NumOfImages = images.length;
        },

        EnableVerticalAdjustment: function( bool ) {
            verticalAdjustmentIsEnabled = bool;
        },

        EnableUpdateCounter: function( bool ) {
            updateCounterIsEnabled = bool;
        },

        // The Fade Function
        SwapImage: function( x, y ) {
            $( images[y] ).hide( {duration: 0.5} );

            $$( thisObj.GetElementsToClear() ).each( function( el ) {
                el.hide();
            } );

            $( images[x] ).appear( { duration: 0.5 } );

            if ( verticalAdjustmentIsEnabled ) {
                thisObj.VerticalAlign( 'slides', images[x] );
            }
        },

        // the onload event handler that starts the fading.
        StartSlideShow: function() {
            play = setInterval( thisObj.Play, getWaitTime() );

            $( images[0] ).appear( {duration:0.1, afterFinish:
                function() {
                    if ( verticalAdjustmentIsEnabled )
                    {
                        thisObj.VerticalAlign( 'slides', images[0] );
                    }
                }
            } );

            if ( updateCounterIsEnabled ) {
                thisObj.Updatecounter();
            }
        },

        Play: function() {
            var imageShow, imageHide;
            imageShow = i + 1;
            imageHide = i;

            if ( imageShow == NumOfImages ) {
                thisObj.SwapImage( 0, imageHide );
                i = 0;
            } else {
                thisObj.SwapImage( imageShow, imageHide );
                i++;
            }

            if ( updateCounterIsEnabled ) {
                var textIn = i + 1 + ' of ' + NumOfImages;
                thisObj.Updatecounter();
            }
        },

        Stop: function() {
            clearInterval( play );
            $( 'PlayButton' ).appear( { duration: 0} );
            $( 'PauseButton' ).hide();
        },

        GoNext: function() {
            resetInterval();

            var imageShow, imageHide;

            imageShow = i + 1;
            imageHide = i;

            if ( imageShow == NumOfImages ) {
                thisObj.SwapImage( 0, imageHide );
                i = 0;
            } else {
                thisObj.SwapImage( imageShow, imageHide );
                i++;
            }

            if ( updateCounterIsEnabled ) {
                thisObj.Updatecounter();
            }
        },

        GoPrevious: function() {
            resetInterval();

            var imageShow, imageHide;

            imageShow = i - 1;
            imageHide = i;

            if ( i === 0 ) {
                thisObj.SwapImage( NumOfImages - 1, imageHide );
                i = NumOfImages - 1;
            } else {
                thisObj.SwapImage( imageShow, imageHide );
                i--;
            }

            if ( updateCounterIsEnabled ) {
                thisObj.Updatecounter();
            }

        },

        Updatecounter: function() {
            if( $( 'Counter' ) ) {
                var textIn = i + 1 + ' of ' + NumOfImages;
                $( 'Counter' ).update( textIn );
            }
        },

        SetElementsToClear: function( element ) {
            this.elementsToClear = element;
        },

        GetElementsToClear: function() {
            return thisObj.elementsToClear;
        },

        VerticalAlign: function( imgContainer, img ) {
            var offSet = $( imgContainer ).getHeight() / 2 - $( img ).getHeight() / 2;

            offSet = ( SMARTYCARDNS.IEVersion() == 6 ) ? offSet + 3 : offSet;
            $( img ).setStyle( {marginTop: offSet + 'px'} );

            if ( SMARTYCARDNS.IEVersion() == 6 && $( img ).getHeight() > 126 ) {
                $( img ).down().addClassName( 'imgResizeForIE6' );
            }

        }
    };
};



/* For QA Testing */
var SMARTYCARDQA = {};

SMARTYCARDQA.ResultsSetter = function( flashInput ) {
    var flashOutput = flashInput[0].evalJSON();

    this.getResult = function( key ) {
        return flashOutput[ key ];
    };
};

SMARTYCARDQA.ResultsGetter = function( key ) {
    if ( SMARTYCARDQA.getResult ) {
        return SMARTYCARDQA.getResult( key );
    }
    return null;
};
