﻿
EAT = function() {

    var main = function() {

        /* Private */

        /* Properties */

        var cmp = null;


        /* Methods */

        var init = function() {

            /* Constructor */

            initSearch();
            initFoodCategories();
            initFaq();
            initBasketFunctions();
            initLoginForm();
           

            initPaymentForm();

            // Check that there is a map container on the page and if so, load the google maps api and a map
            if ($('#map').length > 0) {
                $.getScript('http://www.google.com/jsapi?key=ABQIAAAAtfquqI0XWPS4Px0zpYx3oBRNxNchMPxDwL3HWXIqjowwufZjWBSqU1jkWEGvUCl3DcXWfqPIfq4Xeg', function() {
                    google.load("maps", "2", { "async": "2", "callback":
                        function() {

                            var mapid = "map";
                            var latitude = $('#hid_latitude').val();
                            var longitude = $('#hid_longitude').val();
                            var map = new GMap2(document.getElementById(mapid));
                            map.setCenter(new GLatLng(latitude, longitude), 14);
                            map.enableScrollWheelZoom();
                            map.addControl(new GSmallMapControl());
                            map.addControl(new GScaleControl());
                            map.addControl(new GMapTypeControl());
                            var marker = new GMarker(new GLatLng(latitude, longitude));
                            map.addOverlay(marker);
                            $('.moreInfo').append($('#map'));
                        }
                    });
                });
            }

            // Start the clock going
            setInterval('EAT.setClock()', 1000);
            initRatings();

        };

        var initPaymentForm = function() {
        };

        var setClock = function() {
            var currentTime = new Date();

            var currentHours = currentTime.getHours();
            var currentMinutes = currentTime.getMinutes();
            var currentSeconds = currentTime.getSeconds();

            // Pad the minutes and seconds with leading zeros, if required
            currentMinutes = (currentMinutes < 10 ? "0" : "") + currentMinutes;
            currentSeconds = (currentSeconds < 10 ? "0" : "") + currentSeconds;

            // Choose either "AM" or "PM" as appropriate
            var timeOfDay = (currentHours < 12) ? "AM" : "PM";

            // Convert the hours component to 12-hour format if needed
            currentHours = (currentHours > 12) ? currentHours - 12 : currentHours;

            // Convert an hours component of "0" to "12"
            currentHours = (currentHours == 0) ? 12 : currentHours;

            // Compose the string for display
            var currentTimeString = currentHours + ":" + currentMinutes + ":" + currentSeconds + " " + timeOfDay;


            $('#time').html(currentTimeString);
        };

        var initLoginForm = function() {
            // Clear login boxes when focused
            $('#txt_loginEmail, #txt_loginEmail2').focus(function() {
                if ($(this).val() == "Email Address") {
                    $(this).val('');
                }
            });
            $('#txt_loginEmail, #txt_loginEmail2').blur(function() {
                if ($(this).val() == "") {
                    $(this).val('Email Address');
                }
            });
            $('#txt_loginEmail, #txt_loginEmail2').live('click', function() {
                if ($(this).val() == "Email Address") {
                    $(this).val('');
                }
            });

            $('.password INPUT, .confirmPassword INPUT').focus(function() {
                $(this).css('background-image', 'none');
            });

            $('.narrowForm .password INPUT').blur(function() {
                if ($(this).val() == '') {
                    $(this).css('background-image', 'url(/i/narrowpassword-bg.gif)');
                }
            });

            $('.narrowForm .confirmPassword INPUT').blur(function() {
                if ($(this).val() == '') {
                    $(this).css('background-image', 'url(/i/narrowconfirmpassword-bg.gif)');
                }
            });

            $('#loginArea .password INPUT').blur(function() {
                if ($(this).val() == '') {
                    $(this).css('background-image', 'url(/i/loginpassword-bg.gif)');
                }
            });

            $('#txt_loginPassword').live('keydown', function(event) {
                if (event.keyCode == 13) {
                    $('#loginArea .login').click();
                    return false;
                }
            })

            $('#loginArea .login').click(function() {

                TVI.ajax({
                    url: '/handlers/app.aspx/login',
                    data: '{ \"d\": { \"email\": \"' + $('#txt_loginEmail').val() + '\",' +
                            '\"password\": \"' + $('#txt_loginPassword').val() + '\",' +
                            '\"remember\": \"' + $('#chk_remember').is(':checked') + '\" } }',
                    success: function(d) {

                        window.location.reload();

                    },
                    failure: function(d) {
                        $('#loginErrors').html(d.errors[0].message);
                    }

                });
                return false;
            });

            $('.forgottenPassword').click(function() {
                if ($('#txt_loginEmail').val() == '' || $('#txt_loginEmail').val() == "Email Address") {
                    $('#loginErrors').html("Please enter your email address above");
                    return false;
                }

                TVI.ajax({
                    url: '/handlers/app.aspx/forgotPassword',
                    data: '{ \"d\": { \"email\": \"' + $('#txt_loginEmail').val() + '\" } }',
                    success: function(d) {

                        $('#loginErrors').html("Password reminder sent");

                    },
                    failure: function(d) {
                        $('#loginErrors').html(d.errors[0].message);
                    }

                });
                return false;
            });
            $('#logOut').click(function() {

                TVI.ajax({
                    url: '/handlers/app.aspx/logout',
                    data: '{ \"d\": {} }',
                    success: function(d) {

                        window.location.reload();

                    },
                    failure: function(d) {
                        $('#loginErrors').html(d.errors[0].message);
                    }

                });
                return false;
            });

        };

        var initFaq = function() {

            $('.faq .question').toggle(
                function() {

                    // Show answer and change arrow
                    $(this).next('.answer').slideDown(300);
                    $(this).addClass('open');

                },

                function() {

                    // Hide answer and change arrow
                    $(this).next('.answer').slideUp(300);
                    $(this).removeClass('open');

                }

            );
        };

        var initFoodCategories = function() {

            $('#foodCategoryList li a').click(function() {
                $('#foodCategoryList li a').removeClass('selected');
                $(this).addClass('selected');

                var selectedCat = $(this).text();
                if (selectedCat != "All Restaurants") {
                    $('.searchResult').hide();
                    $('.searchResults .type:contains(' + selectedCat + ')').parents('.searchResult').show();
                }
                else {
                    $('.searchResult').show();
                }
                return false;
            });

        };


        var initBasketFunctions = function() {

            // YOUR ORDER CUSTOMISATION
            $('#yourOrder .customisation .viewHideCustomisation A').live('click', function() {

                // If customisation already open
                if ($(this).parents('.customisation').hasClass('open')) {

                    $(this).parents('.customisation').find('.customItem').slideUp(100);
                    $(this).parents('.customisation').removeClass('open').addClass('closed');

                } else { // If customisation closed

                    $(this).parents('.customisation').find('.customItem').slideDown(100);
                    $(this).parents('.customisation').removeClass('closed').addClass('open');

                }

                return false;

            });


            // Setup buttons
            $('#yourOrder .controls a.quantityUp, #yourOrder .controls a.quantityDown').live('click', function() {

                var basketItemIndex = $(this).parents('.item').attr('id').substring(10);
                var quantity = parseInt($(this).parents('.item').find('INPUT').val());
                var initialQuantity = quantity;
                if ($(this).is('.quantityUp')) {
                    quantity++;
                }
                else if (quantity != 1) {
                    quantity--;
                }
                else {
                    $(this).nextAll('.remove').click();
                    return false;
                }
                $(this).parents('.item').find('INPUT').val(quantity);
                TVI.ajax({

                    url: '/handlers/app.aspx/changeBasketQuantity',
                    data: '{ \"d\": { \"basketItemIndex\": \"' + basketItemIndex + '\",' +
                              '\"quantity\":\"' + quantity + '\" } }',
                    success: function(d) {
                        buildMenu($('#yourOrder'));
                    },
                    failure: function(d) {
                        alert(d.errors[0].message)
                    },
                    error: function(d) {

                    }

                });

                return false;
            });
            // Setup remove button
            $('#yourOrder .controls a.remove').live('click', function() {

                var basketItemIndex = $(this).parents('.item').attr('id').substring(10);
                $(this).parents('.item').hide();

                TVI.ajax({

                    url: '/handlers/app.aspx/removeBasketItem',
                    data: '{ \"d\": { \"basketItemIndex\": \"' + basketItemIndex + '\" } }',
                    success: function(d) {
                        buildMenu($('#yourOrder'));
                    },
                    failure: function(d) {
                        $(this).parents('.item').show();
                    },
                    error: function(d) {
                        $(this).parents('.item').show();
                    }

                });
            });

            // Setup clear link
            $('#yourOrder #clearBasket').live('click', function() {

                TVI.ajax({

                    url: '/handlers/app.aspx/clearBasket',
                    data: '{ \"d\": { } }',
                    success: function(d) {
                        buildMenu($('#yourOrder'));
                    },
                    failure: function(d) {
                        buildMenu($('#yourOrder'));
                    },
                    error: function(d) {
                        buildMenu($('#yourOrder'));
                    }

                });
            });

        };

        var buildMenu = function(basketContainer) {
            TVI.ajax({
                url: '/handlers/app.aspx/getBasket',
                data: '{ \"d\": { } }',
                success: function(d) {
                    basketContainer.replaceWith(d.html);
                }
            });
        };

        var initRatings = function() {

            // REVIEW POPUP
            // Make 100% height        
            $('.reviewPopup').height($('#bodyContainer').height());

            // open on menu pages
            $('.restaurantInfo .rating A').click(function() {

                // If NOT open, open popup
                if (!$('.reviewPopup').hasClass('open')) {

                    $('.reviewPopup').show().addClass('open');

                    // Hide SELECT's in IE6 (bug)
                    if ($('BODY').hasClass('browserIE6')) {
                        $('.menu .menuItem .functions .select SELECT').hide();
                    }

                }

                return false;

            });

            // open on search pages
            $('.searchResults .rating A').click(function() {


                // Get the review details first
                //$('.reviewPopup').empty();
                $.get('/reviews.aspx?restaurantid=' + $(this).parents('.searchResult').attr('id').substring(10), function(data) {
                    $('.reviewPopup').html(data);
                    // If NOT open, open popup
                    if (!$('.reviewPopup').hasClass('open')) {

                        $('.reviewPopup').show().addClass('open');

                        // Hide SELECT's in IE6 (bug)
                        if ($('BODY').hasClass('browserIE6')) {
                            $('.menu .menuItem .functions .select SELECT').hide();
                        }

                    }
                });


                

                return false;

            });

            // close
            $('.reviewPopup .close').live('click', function() {

                // If open, close popup
                if ($('.reviewPopup').hasClass('open')) {

                    $('.reviewPopup').hide().removeClass('open');

                    // Show SELECT's in IE6 (bug)
                    if ($('BODY').hasClass('browserIE6')) {
                        $('.menu .menuItem .functions .select SELECT').show();
                    }

                }

                return false;

            });

        }

        var initSearch = function() {


            $('#txt_postcode').each(function() {
                $(this).data('original', $(this).val());
            });

            $('#txt_postcode').focus(function() {
                if ($(this).val() == $(this).data('original')) {
                    $(this).val('');
                }
            });

            $('#txt_postcode').blur(function() {
                if ($(this).val() == '') {
                    $(this).val($(this).data('original'));
                }

            });

            $('#txt_postcode').keydown(function(event) {
                if (event.keyCode == 13) {
                    $('.findSomeFood').click();
                    return false;
                }
            })

            if ($('#searchCity').length != 0) {
                //load search drop downs
                TVI.ajax({
                    url: '/handlers/app.aspx/getSearch',
                    success: function(d) {

                        if ($('#searchCity option:first').html() != "Loading...") {
                            var cities = '{for c in cities}<option>${c.city}</option>{/for}'.process(d);

                            $('#searchCity').append(cities);
                            var selectedCity = $('#searchCity option:first').html();
                            var index = 0;
                            $('#searchCity option').each(function() {
                                if ($(this).html() == selectedCity && index > 0) {
                                    $(this).remove();
                                }
                                index++;
                            });
                        }
                        else {
                            var cities = '<option value="">Choose university...</option>{for c in cities}<option>${c.city}</option>{/for}'.process(d);

                            $('#searchCity').html(cities);

                        }


                    }
                });
            }

            //add handler to county select
            $('#searchCity').change(function() {

                setSearchHall($('#searchCity option:selected').val());

            });

            $('#searchHall').change(function() {

                if ($('#hallDetails').length > 0) {
                    var hallDetails = $('#hallDetails #hallid' + $('#searchHall').val());
                    var address = hallDetails.find('.address').html();
                    var postcode = hallDetails.find('.postcode').html();
                    $('#txt_registerAddress').val(address);
                    $('#txt_deliveryAddress').val(address);
                    $('#txt_updateAddress').val(address);
                    $('#txt_registerPostcode').val(postcode);
                    $('#txt_deliveryPostcode').val(postcode);
                    $('#txt_updatePostcode').val(postcode);
                }

            });

            $('#txt_townPostcode, #txt_restaurantName').live('keydown', function(event) {
                if (event.keyCode == 13) {
                    $('.go').click();
                    return false;
                }
            })

            $('#restaurantSearch .go').click(function() {
                var townPostcode = $('#txt_townPostcode').val().replace(" ", "");
                var restaurantName = $('#txt_restaurantName').val().replace(" ", "-");
                var url = '/searchResults.aspx';
                if (townPostcode == "") {
                    return false;
                }
                url += "?location=" + townPostcode;
                if (restaurantName != "") {
                    url += "&name=" + restaurantName;
                }
                window.location = url;
                return false;
            });

            //add handler to search button
            $('.findSomeFood').click(function(e) {

                e.preventDefault();

                //get search criteria

                var hall = '';
                if ($('#searchHall option:selected').val() != '') {
                    hall = $('#searchHall option:selected').text().replace(/ /g, "-");
                }
                var university = $('#searchCity option:selected').val().replace(/ /g, "-");
                var postcode = $('#txt_postcode').val().replace(/ /g, "").replace("e.gAB123CD", "");

                //build search url
                var url = '/searchResults.aspx';

                if (hall !== '') {

                    url += '?hall=' + hall;
                    url += '&uni=' + university;

                }
                else if (postcode !== '') {

                    url += '?postcode=' + postcode;

                }
                else {
                    $('#searchError').html("We know you're hungry, but please enter your postcode or university first so we can find you a takeaway.");
                    return false;
                }


                window.location = url;

            });

        };

        var setSearchHall = function(city) {

            if (city === '0') {

                return;

            }

            //load hall for this city
            TVI.ajax({
                url: '/handlers/app.aspx/getHalls',
                data: '{ \"d\": { \"city\": \"' + city + '\" } }',
                success: function(d) {

                    var halls = '<option value="">Choose your hall';
                    if (window.location.toString().indexOf('checkout') > 0) {
                        halls += ' (if applicable)';
                    }
                    halls += '</option>{for h in halls}<option value="${h.id}">${h.hall}</option>{/for}'.process(d);

                    var halldetails = '{for h in halls}<div id="hallid${h.id}">${h.hall}<span class="address">${h.address}</span><span class="postcode">${h.postcode}</span></div>{/for}'.process(d);

                    $('#searchHall').html(halls);
                    $('#hallDetails').html(halldetails);

                }
            });

        };

        /* Public */

        return {

            /* Properties */

            test: 'test',


            /* Methods */

            init: function() {

                /* Constructor */

                cmp = this;

                //wait for jQuery to load and initialise object
                TVI.ready(init);

            },

            calculateCustomisationPrice: function() {
                var totalPrice = 0;
                $('#customisePopup .middle OPTION:selected').each(function() {
                    totalPrice += parseFloat($(this).val().substring($(this).val().indexOf('-') + 1));
                });
                $('#customisePopup .middle INPUT:checked').each(function() {
                    totalPrice += parseFloat($(this).val());
                });
                $('#customisePopup .middle .totalPrice .price strong').html('£' + totalPrice.toFixed(2));
            },

            setClock: function() {
                setClock();
            },
            isNumeric: function(strString)
            //  check for valid numeric strings	
            {
                var strValidChars = "0123456789 ";
                var strChar;
                var blnResult = true;

                if (strString.length == 0) return false;

                //  test strString consists of valid characters listed above
                for (i = 0; i < strString.length && blnResult == true; i++) {
                    strChar = strString.charAt(i);
                    if (strValidChars.indexOf(strChar) == -1) {
                        blnResult = false;
                    }
                }
                return blnResult;
            }


        }

    };

    var m = new main();
    m.init();

    return m;

} ();