// Borders specific transitions
var BordersEffects = {

    // Effect durations
    fltEffectDuration: 0.4,
    fltAlertDuration:  2000,

    // Appearance effect
    appear: function(element)
    {
        Effect.Appear(element, {duration: BordersEffects.fltEffectDuration});
    },

	// Show and centre an element
	appearAndCenter: function(element)
	{
		var arrOffsets  = document.viewport.getScrollOffsets();
		var arrElement  = element.getDimensions();
		var arrElement  = $(element).getDimensions();
		var arrViewport = document.viewport.getDimensions();
		var intTop		= arrOffsets.last() + (arrViewport.height - arrElement.height)/2;
		var intLeft		= arrOffsets.first() + (arrViewport.width - arrElement.width)/2;
		element.setStyle({
            top:    String(intTop)+'px',
            left:   String(intLeft)+'px'
        });
		BordersEffects.appear(element);
	},

    // Disappearance effect
    disappear: function(element)
    {
        Effect.Fade(element, {duration: BordersEffects.fltEffectDuration});
    },
	blindUp: function(element)
    {
        Effect.BlindUp(element, {duration: BordersEffects.fltEffectDuration});
    },
	toggleBlind: function(element)
    {
        Effect.toggle(element,'blind',{duration: BordersEffects.fltEffectDuration});
    },
    // Toggle appearance of element
    toggle: function(element)
    {
        Effect.toggle(element, 'appear', {duration: BordersEffects.fltEffectDuration});
    },

    // Brings a message briefly to the screen
    alert: function(strMessage, eleTarget, strClass)
    {
        var eleAlert = $('divSiteAlert').update(strMessage);
		if (strClass) {
			eleAlert.addClassName(strClass);
        } else {
            eleAlert.className = '';
        }
        BordersEffects.appearAndCenter(eleAlert);
		setTimeout('Effect.Fade($("divSiteAlert"), {duration: BordersEffects.fltEffectDuration,onComplete: function(){this.className="";}});',3000);
    },

	// Display loading icon in specified element 
	displayLoadingIcon: function(eleTarget)
	{
		eleTarget = $(eleTarget);
		if (eleTarget) {
			eleTarget.update("<div class='loader lrg'><img src='images/loader-large.gif' alt='Loading' /></div>");
		}
	},
	
	pulsate: function(element){
	   Effect.Pulsate(element,{duration: BordersEffects.fltEffectDuration});
	},
	
	slideDown: function(element){
       Effect.SlideDown(element,{duration: BordersEffects.fltEffectDuration});
    },
    
    shake: function(element, distance){
        Effect.Shake('DeliveryOptions',{distance:5, duration:BordersEffects.fltEffectDuration});
    }
}

// Form validation methods
var FormValidation = {

    // Regular expressions
    reEmailAddress:        /^\w+([.\-+]\w+)*@[A-Za-z0-9]+([.-]\w+)*\.[A-Za-z]+$/,
    rePassword:            /^\w{6,}$/,
    rePhoneNumber:         /^[\d() ]{10,}$/,
    rePostCode:            /^[a-zA-Z][a-zA-Z0-9]{1,3}\s*\d[a-zA-Z]{2}$/,
    reSecurityNumber:      /^\d{3,4}$/,
    rePrice:               /^\d+(\.\d{2})?$/,
    reIssueNumber:         /^\d+$/,
    reCardDate:            /^(0[1-9]|1[012])\/\d{2}$/,

    // Class of error blocks
    strErrorClass: 'formError',

    // Display validation error messages
    showError: function(eleInput, strMessage)
    {
		eleInput = $(eleInput);

        // Check to see if an error block exists already
        if (eleInput.next() && eleInput.next().className == FormValidation.strErrorClass) {
            // Replace existing error message
            eleInput.next().update(strMessage);
        } else {
            // Create new error message
			var eleErrorMessage = Element('div', {'class': FormValidation.strErrorClass});
            eleInput.insert({after: eleErrorMessage.update(strMessage)});
        }
    },

    // Remove validation error message
    removeError: function(eleInput)
    {
        if (eleInput.next() && eleInput.next().className == FormValidation.strErrorClass) {
            eleInput.next().remove();
        }
    },

    // Remove all error messages
    removeAllErrors: function(eleForm)
    {
        $(eleForm).select('.'+FormValidation.strErrorClass).invoke('remove');
    },

    // Regular expression validation functions
    isValidEmailAddress: function(strTest)  {return (strTest.search(FormValidation.reEmailAddress) != -1) ? true : false;},
    isValidPassword: function(strTest)      {return (strTest.search(FormValidation.rePassword) != -1) ? true : false;},
    isValidPostCode: function(strTest)      {return (strTest.search(FormValidation.rePostCode) != -1) ? true : false;},
    isValidPhoneNumber: function(strTest)   {return (strTest.search(FormValidation.rePhoneNumber) != -1) ? true : false;},
    isValidSecurityNumber: function(strTest){return (strTest.search(FormValidation.reSecurityNumber) != -1) ? true : false;},
    isValidPrice: function(strTest)         {return (strTest.search(FormValidation.rePrice) != -1) ? true : false;},
    isValidIssueNumber: function(strTest)   {return (strTest.search(FormValidation.reIssueNumber) != -1) ? true : false;},
    isValidCardDate: function(strTest)      {return (strTest.search(FormValidation.reCardDate) != -1) ? true : false;},
    
    // Validate credit card number 
    isValidCardNumber: function(strTest)
    {
        var intTotal = 0;
        var booValid = true;
        var intDigits = 0 - strTest.length;
        var intLength = strTest.length;
        var i = -1;
        while (i >= intDigits) {
            if ((i % 2) == 0) {
                var intDigit = 2 * (strTest.substring(intLength+i, intLength+i+1));
                strDigit = intDigit.toString();
                intTotal += parseInt(strDigit.substring(0,1));
                if (strDigit.length > 1){
                    intTotal += parseInt(strDigit.substring(1,2));
                }
            } else {
                intTotal += parseInt(strTest.substring(intLength+i, intLength+i+1));
            }
            i--;
        }
        if ((intTotal % 10) != 0){
            booValid = false;
        }
        return booValid;
    }
}

// Behaviour of the user control panel
var UserControl = {
    checkDropdowns: function() {
        var basketVisible = $('basketRollout') && $('basketRollout').getStyle('display') != 'none';
        var loginVisible = $('loginRollout') && $('loginRollout').getStyle('display') != 'none';
        var registrationVisible = $('registrationRollout') && $('registrationRollout').getStyle('display') != 'none';
        var arePulldownsVisible = basketVisible || loginVisible || registrationVisible;
        if (arePulldownsVisible) {
            $$('select[name=sort]').invoke('show');
        } else {
            $$('select[name=sort]').invoke('hide');
        }
    },
    // Toggle appearance of registration block
    toggleRegistration: function()
    {
        if ($('basketRollout')) $('basketRollout').hide();
        if ($('loginRollout')) $('loginRollout').hide();
        Effect.ScrollTo('registrationRollout');
        BordersEffects.toggleBlind('registrationRollout');
        return false;
    },

    // Toggle appearance of login block
    toggleLogin: function()
    {
        if ($('basketRollout')) $('basketRollout').hide();
        if ($('registrationRollout')) $('registrationRollout').hide();
		if ($('loginRollout')) {
			Effect.ScrollTo('loginRollout');
			BordersEffects.toggleBlind('loginRollout');
		}
        return false;
    },

    // Display basket
    displayBasket: function()
    {
        if ($('loginRollout')) $('loginRollout').hide();
        if ($('registrationRollout')) $('registrationRollout').hide();
        UserControl.checkDropdowns();
        BordersEffects.toggleBlind('basketRollout');
        return false;
    },

    // Hide basket
    hideBasket: function()
    {
        BordersEffects.blindUp('basketRollout');
        UserControl.checkDropdowns();
        return false;
    },

    // Update basket display
    updateBasket: function()
    {
        var arrBasketItemIds  = $('basket_contents').select('input.BasketItemId').pluck('value');
        var arrOrigQuantities = $('basket_contents').select('input.OrigQuantity').pluck('value');
        var arrNewQuantities  = $('basket_contents').select('input.NewQuantity').pluck('value');

        for (i=0; i<arrBasketItemIds.length; i++) {
            // Check new quantity is valid and has changed
            if (arrNewQuantities[i] != arrOrigQuantities[i]) {
                xajax_changeMiniBasketItemQuantityAndReload(arrBasketItemIds[i],arrNewQuantities[i]);
            }
        }
    },

    // Change main quantity of basket
    changeMainBasketQuantity: function(intBasketItemId, eleInput)
    {
        var intNewQuantity = $F(eleInput);
        if (intNewQuantity.search(/^\d+$/) == 0) {
            xajax_changeMainBasketItemQuantityAndReload(intBasketItemId, intNewQuantity)
        } else {
            eleInput.value = eleInput.previous().value;
        }
    },

    // Validate registration details before submission
    validateRegistration: function()
    {
        // Initilisation
        var eleFirstName    = $('RegistrationFirstName');
        var eleLastName     = $('RegistrationLastName');
        var eleEmail        = $('RegistrationEmail');
        var elePassword     = $('RegistrationPassword');
        var elePasswordConf = $('RegistrationConfirmationPassword');
        var eleEmailOptions = $('EmailSignUpOptions');

        // Input validation
        var booPassed = true;
        if (!eleFirstName.present()) {
            FormValidation.showError(eleFirstName, 'Please enter a first name');
            booPassed = false;
        } else {
            FormValidation.removeError(eleFirstName);
        }
		
        if (!eleLastName.present()) {
            FormValidation.showError(eleLastName, 'Please enter a last name');
            booPassed = false;
        } else {
            FormValidation.removeError(eleLastName);
        }
		
        if (!eleEmail.present()) {
            FormValidation.showError(eleEmail, 'Please enter an email address');
            booPassed = false;
        } else if (!FormValidation.isValidEmailAddress(eleEmail.value)) {
            FormValidation.showError(eleEmail, 'Your email address is not valid - please correct it');
            booPassed = false;
        } else {
            FormValidation.removeError(eleEmail);
        }

        if (!elePassword.present()) {
            FormValidation.showError(elePassword, 'Please enter a password');
            booPassed = false;
        } else if (!FormValidation.isValidPassword(elePassword.value)) {
            FormValidation.showError(elePassword, 'Your password must be longer than 6 characters');
            booPassed = false;
        } else {
            FormValidation.removeError(elePassword);
        }

        if (!elePasswordConf.present()) {
            FormValidation.showError(elePasswordConf, 'Please enter a confirmation password');
            booPassed = false;
        } else if (elePassword.value != elePasswordConf.value) {
            FormValidation.showError(elePasswordConf, 'Your confirmation password does not match your original');
            booPassed = false;
        } else {
            FormValidation.removeError(elePasswordConf);
        }

		if (!$('registrationForm').getInputs('radio', 'SignedUpForEmail').any(function(ele){return ele.checked})) {
			FormValidation.showError(eleEmailOptions, 'Please choose an option');
            booPassed = false;
		} else {
            FormValidation.removeError(eleEmailOptions);
		}

        if (booPassed) {
            // Submit form if valid
            xajax_register(xajax.getFormValues('registrationForm'));
        }
        return false;
    }
}

// Product admin functions
var ProductAdmin = {
    
    selectedInput: null,
    
    addProduct: function(intProductId, eleButton)
    {
         xajax_addAdminProduct(intProductId);
         BordersEffects.alert('Product added to admin basket', eleButton);
    },
    
    edit: function(eleButton)
    {
        var eleInput = eleButton.previous().enable();
        eleButton.hide();
        this.selectedInput = eleInput; 
        $('ProductField').value = eleInput.identify().split('_')[0];
        $('ProductId').value = eleInput.identify().split('_')[1];
        var objDate = new Date();
        $('StartDate').value = objDate.getDate()+'/'+(objDate.getMonth()+1)+'/'+objDate.getFullYear();
        var eleForm  = $('EditForm').remove();
        eleInput.insert({after: eleForm.show()});
    },
    
    saveAttribute: function()
    {
        var intProductId = $F('ProductId');
        var strField = $F('ProductField');
        var strValue = $F(this.selectedInput);
        if ($('PersistenceForever').checked) {
            xajax_saveProductAttributePermanently(intProductId,strField,strValue);
        } else {
            xajax_saveProductAttributeBetweenDates(intProductId,strField,strValue,$F('StartDate'),$F('EndDate'));
        }
        this.selectedInput.disable();
        $('EditForm').hide();
    },
    
    removeFromDashboard: function(intProductId, eleLink)
    {
        eleLink.up('div').hide();
        xajax_removeAdminProduct(intProductId);
    },
    
    uploadCsv: function()
    {
        return xajax.upload('uploadAdminCsvFile', 'UploadForm');
    }
}

// Search block
var Search = {

    // Register the toggle button and autocomplete functionality
    register: function()
    {
        if ($('search_field')) {
			
			// Switch classes and empty default text when search box is clicked
			$('search_field').observe('click', Search.clearSearchBox);
       	 	$('search_field').observe('blur', Search.resetSearchBox);
       	 	$('search_field').observe('keydown', Search.showLoading);
       	  	Search.resetSearchBox();

			// Autocomplete object
			var objAutoComplete = new Ajax.Autocompleter(
				'search_field',
				'autocomplete_choices',
				'/autocomplete/get_search_suggestions.tao',
				{
					callback:        Search.processQuery,
					updateElement:   Search.goToSearchResults,
					frequency:		 0.1
				}
			);
		}

        // Toggle whether autocomplete is on or not
		if ($('autocomplete_switch')) {
    	    $('autocomplete_switch').observe('click', Search.toggleAutoComplete);
		}
    },

    /*
     * Toggle whether the autocomplete functionality is turned on or not.
     */
    toggleAutoComplete: function()
    {
        var eleStatus  = $('autocomplete_status');
        if ($F(eleStatus) == 'off') {
            eleStatus.value = 'on';
			$('divSearchLoading').setStyle({
				marginTop: '0px'
			});
        } else {
            eleStatus.value = 'off';
			$('divSearchLoading').setStyle({
				marginTop: '-1000px'
			});
        }
    },

    /*
     * Custom function for passing query string to server before a request for
     * autocomplete suggestions is made.  This appends the media type to
     * the end of the passed string so the server can make the appropriate restriction to the
     * database query.
     */
    processQuery: function()
    {
		strPseudoSearchPage = '/site-search/?q='+escape($F('search_field'))+'&m='+$F('media_type')+'&t=autocomplete';

        if ($F('autocomplete_status') == 'on') {
            return arguments[1]+'|||'+$F('media_type');
        } else return false;
    },

    /*
     * Custom function for handling the event when a user selects an item
     * from the autocomplete suggestions list
     */
    goToSearchResults: function()
    {
        // Extract id
		var eleLi = $A(arguments).first();
        var eleId = eleLi.select('span.autocomplete_id').first();
		var intId = (eleId) ? eleId.innerHTML : 0;

        if ('0' == intId) {
			// Submit to GA
			strPseudoSearchPage = '/site-search/?q='+escape($F('search_field'))+'&m='+$F('media_type')+'&t=normal';
			try {
                pageTracker._trackPageview(strPseudoSearchPage);
            } catch (error) {}
			$('searchForm').submit();

        } else if (/^\d+$/.test(intId)) {

            // Get details of selected item and redirect
            var strMediaType    = $w(eleLi.className).first();
            var strTitle        = eleLi.select('span.autocomplete_friendly_title').first().innerHTML || '';

			// Record search term and product
			var objSearch = {
				query: $F('search_field'),
				mediatype: strMediaType,
				id: intId		
			};
			var strUrl = '/QueryLogger.tao?'+Object.toQueryString(objSearch);
			new Ajax.Request(strUrl, {method: 'get'});

			// Inform google analytics
			strPseudoSearchPage = '/site-search/?q='+intId+'&t=autocomplete_select';
			try {
                pageTracker._trackPageview(strPseudoSearchPage);
            } catch (error) {}

			// Redirect
            if (strMediaType == 'contributor') {
                strNewLocation = '/by/'+strTitle+'/'+intId+'/';
            } else {
                strNewLocation = '/'+strMediaType.toLowerCase()+'/'+strTitle+'/'+intId+'/';
            }
            window.location.href = strNewLocation;
        } 
	},

	// Default text functions
    clearSearchBox: function()
    {
        if ($F('search_field') == Search.defaultText) {
			$('search_field').clear().className = 'active';
        }
    },
    resetSearchBox: function()
    {
        if ($('search_field') && !$('search_field').present()) {
			$('search_field').setValue(Search.defaultText).className='inactive';
        }
    },
	showLoading: function(objEvent)
	{
		var keyCode = objEvent.keyCode;
		// if (keyCode >= 48  && keyCode <= 90) {
		if (!$('autocomplete_choices').visible()) {
			$('autocomplete_choices').update($('divSearchLoading').innerHTML).show()
		}
		return true;
	},
	defaultText: string='title, author or ISBN'
}

// Behavior of the library thing page
var LibraryThing = {

    // Register the toggle button and autocomplete functionality
    register: function()
    {
        // Autocomplete object
        if ($('lt_search_field')) {
            var objAutoComplete = new Ajax.Autocompleter(
                'lt_search_field',
                'lt_search_field_choices',
                '/autocomplete/get_librarything_suggestions.tao',
                {
                    callback:        LibraryThing.processQuery,
                    updateElement:   LibraryThing.goToSearchResults,
					indicator:		 'divSuggestorLoading'
                }
            );
        }
    },

    processQuery: function()
    {
        // Ensure only book results are returned
        return arguments[1]+'|||Book';
    },

    goToSearchResults: function()
    {
        // Extract id
        var eleFirstLi = arguments[0];
        var intId      = eleFirstLi.select('span.autocomplete_id').first().innerHTML;

        if (intId == '0') {

            //  A product must be selected
            BordersEffects.alert('Please select a valid product');

        } else if (/^\d+$/.test(intId)) {

            var strTitle        = eleFirstLi.select('span.autocomplete_friendly_title')[0].innerHTML;
            var strNewLocation    = '/booksuggestions/'+intId+'/'+strTitle+'/';
            window.location.href = strNewLocation;
        } else {
            alert('Should not be here');
        }
    }
}

// Collected product functions
var ProductFns = {

    trackBasketAddition: function()
    {
        try {
            pageTracker._trackPageview('/add-to-basket-tracker' + location.pathname);
        } catch (error) {}
    },

    // Add to basket functionality
    addToBasket: function(intProductId, eleButton)
    {
        ProductFns.trackBasketAddition();
        xajax_addProductToBasketAndReload(intProductId);
    },

    addPartnerProductToBasket: function(partnerId, partnerName)
    {
        ProductFns.trackBasketAddition();
        xajax_addPartnerProductToBasket(partnerId, partnerName);
    },

    // Add to wishlist functionality
    addToWishlist: function(intProductId, eleButton)
    {
        BordersEffects.alert('Product added to wishlist', eleButton, 'wishlist');
        xajax_addProductToWishlistAndReload(intProductId);
    },

    // Register popups
    registerSynopsisPopups: function()
    {
        // Register synopsis popups to all thumbnails and add titles
        if($$('img.productThumb').length > 0){
			$$('img.productThumb').invoke('observe', 'click', ProductFns.showSynopsis);
        	$$('img.productThumb').each(function(e) {
        	    e.setStyle({
        	        cursor: 'pointer'
        	    });
        	});
		} else if($$('a.productThumb').length>0){
			$$('a.productThumb').invoke('observe', 'click', ProductFns.showSynopsis);
        	$$('a.productThumb').each(function(e) {
        	    e.setStyle({
        	        cursor: 'pointer'
        	    });
        	});
		}
    },

    // Register popup close buttons
    registerSynopsisCloseButtons: function()
    {
        // Register links for closing popup
        $$('.closeSynopsis').invoke('observe', 'click', ProductFns.hideSynopsis);
    },

    // Display popup
    showSynopsis: function(objEvent)
    {
        // Remove tooltip
        objEvent.element().title = '';

        // Hide and position synopsis
        var eleSynopsis = $('divSitePopup');
        var eleSynopsisContent = $('divSitePopupContent');
        eleSynopsis.hide();

        // Update content
        if (objEvent.element().previous('div')) {
            var eleSynopsisWrapper = objEvent.element().previous('div');
            eleSynopsisContent.update(eleSynopsisWrapper.innerHTML);
        } else {
            eleSynopsisContent.update('No synopsis data available for this product');
        }

        // Control appearance depending on position of synopsis in the viewport
        var intVPWidth  = document.viewport.getWidth();
        var intVPHeight = document.viewport.getHeight();
        var intVPOffset = document.viewport.getScrollOffsets().last();
        var intVPClickHeight = Event.pointerY(objEvent) - intVPOffset;
        var intDistanceToVPBottom = intVPHeight - intVPClickHeight;
		var intDistanceToVPTop    = intVPHeight - intDistanceToVPBottom;		
		var intDistanceToVPRight  = intVPWidth - objEvent.pointerX();		
		var intSynopsisHeight = eleSynopsis.getDimensions().height;
		var intSynopsisWidth  = eleSynopsis.getDimensions().width;

        // Adust height and appearance effect of synopsis if it doesn't fit on
        var intTop = Event.pointerY(objEvent);
        if (intDistanceToVPBottom < intSynopsisHeight && intDistanceToVPTop > intSynopsisHeight) {
            intTop = intTop - intSynopsisHeight;
        } else if (intDistanceToVPBottom < intSynopsisHeight && intDistanceToVPTop < intSynopsisHeight) {
			intTop = intTop - intSynopsisHeight/2;
		}
		if (intDistanceToVPRight < intSynopsisWidth) {
			intRight = Event.pointerX(objEvent) - intSynopsisWidth/2;
		} else {
			intRight = Event.pointerX(objEvent);
		}
        eleSynopsis.setStyle({
            top:    String(intTop)+'px',
            left:   String(intRight)+'px',
			width:  '550px' 
        });

        // Make synopsis appear
        eleSynopsis.show();

        // Increment db counter if synopsis data was found
        if (eleSynopsisWrapper) {
            var intProductId = eleSynopsisWrapper.identify().match(/\d+$/).first();
            xajax_incrementProductCount(intProductId);
//            if (typeof(xajax_recordProductView) == 'function') {
//               xajax_recordProductView(intProductId);
//           }
        }
    },

    // Hide synopsis
    hideSynopsis: function()
    {
        $('divSitePopup').hide();
    },

    // Not sure if this is needed
    checkDisplay: function(obj)
    {
        var elm=document.getElementById(obj.effects[0]['element'].id);
        if (elm.style.display=='none') elm.style.display='block';
    },
    
    getGiftCardId: function(CardName){
        var CardGroup = document['forms']['GiftCards'][CardName];
        for(i=0; i < CardGroup.length; i++){
            if (CardGroup[i].checked == true) {
                var CardId = CardGroup[i].value;
            }
        }
        return CardId;
    }
}

// Reviewing functionality
var ProductReviews = {

    validateForm: function()
    {
        var eleTitle = $('ReviewTitle');
        var eleText  = $('ReviewText');

        var booPassed = true;
        if (!eleTitle.present()) {
            FormValidation.showError(eleTitle, 'Please enter a title for your review');
            booPassed = false;
        } else {
            FormValidation.removeError(eleTitle);
        }
        if (!eleText.present()) {
            FormValidation.showError(eleText, 'Please enter a review');
            booPassed = false;
        } else {
            FormValidation.removeError(eleText);
        }

        if (booPassed) {
            xajax_addProductReview(xajax.getFormValues('ReviewForm'));
        } 
    }
}

// Reporting functionality
var Reporting = {
	classPrefix: 'track_',
	classBlock: '.trackingBlock',
	register: function() {
		if ($('divBody') && $('divSitePopup')) {
			$('divBody').observe('mousedown', Reporting.log);
			$('divSitePopup').observe('mousedown', Reporting.log);
		}
	},
    log: function(objEvent) {
		var eleClick 	= objEvent.element();
		var eleBlock	= eleClick.up(Reporting.classBlock);
		var arrOffset1  = $('divBody').cumulativeOffset();
		var arrOffset2	= eleClick.cumulativeOffset(); 
		var objLog = {
			page: 	'/'+document.URL.split('/').slice(3).join('/'),
			X:		arrOffset2.first() - arrOffset1.first(),
			Y:		arrOffset2.last() - arrOffset1.last(),
			tag:	eleClick.tagName,
			type:	Reporting.getTrackingName(eleClick),
			block:	Reporting.getTrackingName(eleBlock)
		};
		var strUrl = '/ClickTracker.tao?'+Object.toQueryString(objLog);
		new Ajax.Request(strUrl, {method: 'get'});
        return true;
    },
	getTrackingName: function(ele) {
		if (!$(ele)) return '';
		var strClass = $w(ele.className).find(function(strClass){return strClass.startsWith(Reporting.classPrefix)});
		return (strClass) ? strClass.match('_(.*)').last() : '';
	}
}

// Offer admin
var OfferAdmin = {
    register: function()
    {
		Sortable.create('offers_overview', {onUpdate:OfferAdmin.save})
    },   
	save: function(eleList)
	{
		var strOrder = Sortable.serialize($('offers_overview'));
		xajax_saveOfferOrder(strOrder);
	}
}

// Profile admin
var Profiles = {
    register: function() {
        var objBookCompleter = new Ajax.Autocompleter(
            'TitleQuery',
            'TitleQuerySuggestions',
            '/autocomplete/get_profile_product_suggestions.tao',
            {
				updateElement: 	Profiles.selectProduct,
				indicator:	 	'divSearchLoading'
			}
        );   
    },
    selectProduct: function() {
        var intId  		= $A(arguments).first().select('span.autocomplete_id').first().innerHTML;
        var strName  	= $A(arguments).first().select('span.autocomplete_info').first().innerHTML;
		$('TitleQuery').setValue(strName).disable();
		$('ProductId').setValue(intId);
    },
	addProduct: function() {
		xajax_addProfileProduct($F('ProductId'),$F('ProductDescription'));
		Profiles.discardProduct();
	},
    discardProduct: function() {
		$('TitleQuery').enable().clear();
		$('ProductId').clear();
	},
	validateProfile: function() {

        var eleEmail 		= $('EmailAddress');
        var eleFirstName  	= $('FirstName');
        var eleLastName  	= $('LastName');
        var elePassword  	= $('Password');
        var elePasswordConf = $('PasswordConfirm');

        var booPassed = true;
        if (!eleEmail.present()) {
            FormValidation.showError(eleEmail, 'Please enter an email address');
            booPassed = false;
        } else if (!FormValidation.isValidEmailAddress($F(eleEmail))) {
            FormValidation.showError(eleEmail, 'Please enter a valid email address');
            booPassed = false;
		} else {
            FormValidation.removeError(eleEmail);
        }
        if (!eleFirstName.present()) {
            FormValidation.showError(eleFirstName, 'Please enter a first name');
            booPassed = false;
        } else {
            FormValidation.removeError(eleFirstName);
        }
        if (!eleLastName.present()) {
            FormValidation.showError(eleLastName, 'Please enter a last name');
            booPassed = false;
        } else {
            FormValidation.removeError(eleLastName);
        }
        if (elePassword.present() && !FormValidation.isValidPassword(elePassword.value)) {
            FormValidation.showError(elePassword, 'Your new password must be longer than 6 characters');
            booPassed = false;
        } else {
            FormValidation.removeError(elePassword);
        }

        if (elePassword.present() && !elePasswordConf.present()) {
            FormValidation.showError(elePasswordConf, 'Please confirm your new password');
            booPassed = false;
        } else if (elePassword.value != elePasswordConf.value) {
            FormValidation.showError(elePasswordConf, 'Your confirmation password does not match your original');
            booPassed = false;
        } else {
            FormValidation.removeError(elePasswordConf);
        }

        if (booPassed) {
			xajax_saveProfile(xajax.getFormValues('ProfileForm'));
        } 
	},
    
    transferToGiftAccount: function(){
       var cert = $F('CertificateNumber');
       var amount = $F('CertToTrans');
       if(FormValidation.isValidPrice(amount)){
           FormValidation.removeError($('CertToTrans'));
           xajax_transferGiftAccount(cert, amount);
       }else{
           FormValidation.showError($('CertToTrans'),'please provide a valid amount');
       }
    }
}

// Email signup
var EmailSignUp = {
	clearDefaultText: function() {
		var eleInput = $('SignUpEmailAddress');
		if ($F(eleInput) == 'Email address') {
			eleInput.clear()
		}
	},
	validateLoggedOutUser: function()
	{
		var eleEmail = $('SignUpEmailAddress');
        var booPassed = true;
        if (!eleEmail.present()) {
            FormValidation.showError(eleEmail, 'Please enter an email address');
            booPassed = false;
        } else if (!FormValidation.isValidEmailAddress($F(eleEmail))) {
            FormValidation.showError(eleEmail, 'Please enter a valid email address');
            booPassed = false;
		} else {
            FormValidation.removeError(eleEmail);
        }
        if (booPassed) {
			xajax_signUpLoggedOutUserForEmail(eleEmail.getValue());
			return true;
        } 
		return false;
	}
}

// Pods
var Pods = {
	register: function() {
		Sortable.create('PagePods', {onUpdate:Pods.save})
	},
	save: function(eleList)	{
		var strOrder = Sortable.serialize($('PagePods'));
		xajax_savePagePods(strOrder);
	},
	registerListeners: function() {
		$$('.pod').invoke('observe', 'click', Pods.recordClick);
	},
    recordClick: function(event) {
		var elePod = event.element().up('div.pod');
		var strPodId = $w(elePod.className).find(function(name){return name.match(/^id_/)});
		console.log(strPodId);
		if (!strPodId) return;
		var strPodGaId = strPodId.sub(/^\w+_/, '')
		var strPseudoPage = location.pathname+'pod-click/'+strPodGaId;
		try {
            pageTracker._trackPageview(strPseudoPage);
        } catch (error) {}
	}
}

// Birds-eye view
var BirdsEye = {
	init: function() {
		// Display content
		BirdsEye.showContent();

		// Register events
		// $('main_item').observe('click', BirdsEye.toggleMainItemLinks);
		$('main_item').observe('mouseover', BirdsEye.showMainItemDetails);
		$$('.birds-eye-secondary').invoke('observe', 'mouseover', BirdsEye.hideMainItemDetails);
	},
	showMainItemDetails: function(objEvent)
	{
		if (objEvent.element() === $('main_item').down('img')) $('main_item_details').appear()
	},
	hideMainItemDetails: function(objEvent)
	{
		if ($('main_item_details').visible()) $('main_item_details').fade()
	},
	loadNewMainProduct: function(eleClicked, intProductId) {
		$$('.birds-eye-secondary').each(function(ele){
			if (ele.up('a') !== eleClicked) {
				$(ele).fade({duration:0.2,queue:'parallel'});
			} else {
				$(ele).puff({queue:'end'});
			}
		});
		$('main_item').down().fade({duration: 0.2,queue:'parallel'});	
		xajax_displayBirdsEyeSuggestions.curry(intProductId).delay(0.6);
	},
	showContent: function() {
		$('main_item').down('img').appear({queue:'front'});
		$$('.birds-eye-secondary').each(function(ele){
			$(ele).appear({duration: 0.1, queue:'end'});		
		});
	}
}

// Auto-events
var AutoBehaviour = {
    init: function() {
       this.params = new Hash(document.location.search.toQueryParams());
       this.openLogin();
   },
   openLogin: function() {
       if (this.params.keys().indexOf('signin') >= 0) {
           !!UserControl.toggleLogin && UserControl.toggleLogin();
       }
   }
}

// Fix same page anchors 
function fixAnchors() {
	var arr=$$('a[href^="#"]');
	for(i=0;i<arr.length;i++){
  		arr[i].observe('click',function(event){
			var a=Event.element(event).readAttribute('href');
			a=a.slice(1);
			$$('a[name='+a+']')[0].scrollTo();
			Event.stop(event);
		});
	}
}

// Register events
Event.observe(window, 'load', function(){
    Search.register();
    LibraryThing.register();
	Pods.registerListeners();
    AutoBehaviour.init();
	ProductFns.registerSynopsisPopups();
	fixAnchors();
});