/* TODO
 * 1. Check if cookied from other age screener scripts
 * 2. If cookied, do "under age" or "over age" response based on cookie, else show age screener modal
 * 3. Age screener modal needs to have a customizable "under age" & "over age" functionality:
 *    - For "under age" must be able to set a custom message OR custom exit page or no exit page OR change the href URL
 *    - For "over age" must be able to set a custom exit page or no exit page
 */

// create closure per jQuery plugin best practices
(function($){

    // function to center an element into another
    $.fn.extend({
        center: function () {
            return this.each(function() {
                var top = ($(window).height() - $(this).outerHeight()) / 2 + $(window).scrollTop();
                var left = ($(window).width() - $(this).outerWidth()) / 2;
                $(this).css({position:'absolute', margin:0, top: (top > 0 ? top : 0)+'px', left: (left > 0 ? left : 0)+'px'});
            });
        }
    });

    // plugin definition
    $.fn.customAgeScreener = function(options) {
        var _host = (typeof _schlHost != 'undefined') ? _schlHost : 'www.scholastic.com',
        defaults = {
            age : 13,
            overlayColor : '#555555',
            ageScreenerTitle : 'Customer Form',
            ageScreenerBackground : 'blue',
            // by default use an exit page
            exitPage : true,
            // underExit - custom exit page for under age
            underExit : '',
            // overExit - custom exit page for over age
            overExit : '',
            underMsg : '<p>Sorry, you can\'t buy this item directly from our site for kids. If you want to buy the item online, ask your parent to help you purchase it.</p>',
            // underUrl - change href for under age
            underUrl : '',
            defaultMsg : 'Please fill out the form below.<br /><br />Scholastic does not retain this information. Our <a href="/privacy.htm">Privacy Policy</a> is available for your review.<form name="frmAS" id="frmAS" method="post" action="#"><table><tbody><tr><td class="default">Enter your birthdate:<br />mm/dd/yyyy</td><td><input type="text" name="bday" class="b-day" maxlength="10" size="15"></td></tr></tbody></table><input name="find" src="http://www.scholastic.com/kids/stacks/scene/signatures/images/btn_submit.png" class="btn" alt="Submit" title="Submit" type="image"></div></form>',
            defaultExit : isFP() ? 'http://' + _host + '/kids/pac_exit.asp' : 'http://' + _host + '/kids/tween_exit.asp'
        },
        settings = $.extend({}, defaults, options);

        return this.each(function(){

            var obj = $(this);

            obj.click(function(){
                if ( readCookie('ecommAS') === 'over' ) {
                    if ( settings.underUrl ) {
                        location.href=obj.attr('href');
                        return false;
                    }
                    if ( settings.exitPage && settings.overExit !== '' ) {
                        // use custom exit page for over age
                        window.open(settings.overExit + "?url="+encodeURIComponent(obj.attr('href')),"exit",'width=1020,height=515');
                    }
                    else if ( settings.exitPage ) {
                        // use default exit page
                        window.open(settings.defaultExit + "?url="+encodeURIComponent(obj.attr('href')),"exit",'width=1020,height=515');
                    }
                    else {
                        // don't use any exit page, just go to the link
                        window.open(obj.attr('href'));
                    }
                }
                else if ( readCookie('ecommAS') === 'under' ) {
                    if ( settings.underUrl ) {
                        // change href for under age
                        location.href=settings.underUrl;
                        return false;
                    }
                    if ( settings.exitPage && settings.underExit !== '' ) {
                        // use custom exit page for under age
                        window.open(settings.underExit + "?url="+encodeURIComponent(obj.attr('href')),"exit",'width=1020,height=515');
                    }
                    else {
                        showOverlay();
                        showScreener(this);
                    }
                }
                else {
                    showOverlay();
                    showScreener(this);
                }
                return false;
            });
        });

        function showOverlay() {
            if ( !$('#ageScreenerOverlay').length ) {
                $('body').append('<div id="ageScreenerOverlay"></div>');
            }
            $('#ageScreenerOverlay').css({
                'background' : settings.overlayColor,
                'height' : $(document).height()
            }).show();
        }

        function showScreener(which) {
            if ( !$('#ageScreenerContainer').length ) {
                $('body').append('<div id="ageScreenerContainer"><a id="asClose"></a><h2>' + settings.ageScreenerTitle + '</h2><div id="asContent"></div></div>');
            }

            if ( readCookie('ecommAS') === 'under' ) {
                if ( settings.underExit !== '' ) {
                    window.open(settings.underExit + "?url="+encodeURIComponent($(which).attr('href')),"exit",'width=1020,height=515');
                    closeAgeScreener();
                }
                else {
                    $('#asContent').html(settings.underMsg);
                }
            }
            else {
                $('#asContent').html(settings.defaultMsg);

                $('#frmAS').submit(function(){
                    var field = $(this).find('input[type=text]'),
                        fieldVal = $.trim(field.val()),
                        isValidDate = validateUSDate(fieldVal),
                        isUnder;

                    if ( !isValidDate ) {
                        field.addClass('error');
                        if ( !$('#frmASError').length ) {
                            field.parents('table').before('<div id="frmASError">Please enter your birthdate in this format: mm/dd/yyyy (for example, if you were born on January 31, 2000, you\'d enter: 01/31/2000)</div>');
                        }
                    } 
                    else {
                        field.removeClass('error');
                        $('#frmASError').remove();
                        isUnder = checkAge(fieldVal);

                        if ( isUnder ) {
                            if ( settings.underUrl ) {
                                // change href for under age
                                createCookie('ecommAS','under',1);
                                location.href=settings.underUrl;
                                closeAgeScreener();
                                return false;
                            }
                            if ( settings.underExit !== '' ) {
                                window.open(settings.underExit + "?url="+encodeURIComponent($(which).attr('href')),"exit",'width=1020,height=515');
                                closeAgeScreener();
                            }
                            else {
                                $('#asContent').html(settings.underMsg);
                            }
                            createCookie('ecommAS','under',1);
                        }
                        else {
                            if ( settings.underUrl ) {
                                createCookie('ecommAS','over',1);
                                location.href=$(which).attr('href');
                                closeAgeScreener();
                                return false;
                            }
                            if ( settings.exitPage && settings.overExit !== '' ) {
                                // use custom exit page for over age
                                window.open(settings.overExit + "?url="+encodeURIComponent($(which).attr('href')),"exit",'width=1020,height=515');
                            }
                            else if ( settings.exitPage ) {
                                // use default exit page
                                window.open(settings.defaultExit + "?url="+encodeURIComponent($(which).attr('href')),"exit",'width=1020,height=515');
                            }
                            else {
                                // not using an exit page, just go to the link
                                window.open($(which).attr('href'));
                            }
                            createCookie('ecommAS','over',1);
                            closeAgeScreener();
                        }
                    }
                    return false;
                });
            }
            $('#asClose').click(closeAgeScreener);
            $('#ageScreenerContainer').css({backgroundColor : settings.ageScreenerBackground}).center().show();
        }

        function closeAgeScreener() {
            $('#ageScreenerOverlay, #ageScreenerContainer').hide();
        }

        function checkAge(field) {
            var dateToCheck = new Date(field);
            var past = new Date();

            past.setYear(past.getFullYear() - settings.age);
            past.setHours(0);
            past.setMinutes(0);
            past.setSeconds(1);

            if (dateToCheck.getTime() > past.getTime()) {
                return true;
            }
            return false;
        }

        function isFP() {
            return (document.getElementById('schlKidsWrapper')) ? true : false;
        }

        function validateUSDate( strValue ) {
        /************************************************
        DESCRIPTION: Validates that a string contains only valid dates with 2 digit month, 2 digit day, 4 digit year. Date separator can be ., -, or /. Uses combination of regular expressions and string parsing to validate date.
        Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy
        *************************************************/
          var objRegExp = /^\d{1,2}(\/)\d{1,2}\1\d{4}$/;
         
          //check to see if in correct format
          if(!objRegExp.test(strValue)) {
            return false; //doesn't match pattern, bad date
          }
          else{
            var strSeparator = strValue.substring(2,3);
            var arrayDate = strValue.split(strSeparator); 
            //create a lookup for months not equal to Feb.
            var arrayLookup = { '01' : 31,'03' : 31, 
                                '04' : 30,'05' : 31,
                                '06' : 30,'07' : 31,
                                '08' : 31,'09' : 30,
                                '10' : 31,'11' : 30,'12' : 31};
            var intDay = parseInt(arrayDate[1],10); 
        
            //check if month value and day value agree
            if(arrayLookup[arrayDate[0]] !== null) {
              if(intDay <= arrayLookup[arrayDate[0]] && intDay !== 0) {
                return true; //found in lookup table, good date
              }
            }

            var intMonth = parseInt(arrayDate[0],10);
            if (intMonth === 2) { 
               var intYear = parseInt(arrayDate[2],10);
               if (intDay > 0 && intDay < 29) {
                   return true;
               }
               else if (intDay === 29) {
                 if ((intYear % 4 === 0) && (intYear % 100 !== 0) || 
                     (intYear % 400 === 0)) {
                      // year div by 4 and ((not div by 100) or div by 400) ->ok
                     return true;
                 }
               }
            }
          }
          return false; //any other values, bad date
        }

        function createCookie(name,value,days) {
            var expires = "";
            if (days) {
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                expires = "; expires="+date.toGMTString();
            }
            document.cookie = name + "="+value+expires+"; domain=scholastic." + document.domain.split(".").pop() + "; path=/";
        }

        function readCookie(name) {
            var nameEQ = name + "=";
            var ca = document.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 null;
        }

    };

// end of closure
})(jQuery);
