//** extending the master Util class
var Util = $.extend(Util, {

});

//=====================================================//
var Validate = $.extend(Validate, {

});

var Facebook = {

    validateFestivalWine: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateWinHeadphones: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateClockenflapVip: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateStarCruises: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateMomentsTime: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateMoonCake: function(e) {
        e.preventDefault();
        
        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var phone     = $('#competitionForm input[name=phone]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!phone) {
            alert('Please enter your phone number');
            return false;
        }

        $('#competitionForm').submit();
    },

    validatePlayboyClubParty: function(e) {
        e.preventDefault();

        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateWinTicketToConcert: function(e) {
        e.preventDefault();

        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var trip      = $('#competitionForm input[name=trip]:checked').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!trip) {
            alert('Please choose your concert');
            return false;
        }

        $('#competitionForm').submit();
    },

    validateWinACruiseJunkForm: function(e) {
        e.preventDefault();

        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        $('#competitionForm').submit();

    },

    validateCompetitionForm: function(e) {
        e.preventDefault();

        var full_name = $('#competitionForm input[name=full_name]').val();
        var email     = $('#competitionForm input[name=email]').val();
        var trip      = $('#competitionForm input[name=trip]').val();

        if (!full_name) {
            alert('Please enter your name');
            return false;
        }

        if (!email) {
            alert('Please enter your email');
            return false;
        }

        if (!trip) {
            alert('Please choose your trip');
            return false;
        }

        $('#competitionForm').submit();

    }

};



/**
* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
* Author: Drew Diller
* Email: drew.diller@gmail.com
* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
* Version: 0.0.8a
* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
*
* Example usage:
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
*
* Breaks in IE8, hence try/catch.
**/
try{var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();
DD_belatedPNG.fix('.png-fix');
}catch(err){}

/* Share this config */
var addthis_pub = "timeoutlondon";

var addthis_config = { services_exclude: 'print, email' };

var addthis_share = {
    templates: {
        twitter: '{{url}} "{{title}}" from @timeoutlondon' } };

/*************************************************/
/************ TIME OUT CUSTOM PLUGINS ************/
/*************************************************/

/*
Use the following format for writing plugins:
(function($){
    $.fn.foo = function( settings ) {
    var self = $( this );
    var config = {
       variable1: 'value1',
       variable2: 'value2'
    };

    if (settings) $.extend(config, settings);

    function myFunction1(i) {}

    function myFunction2(i, j) {}

} } )( jQuery );
*/

/** LEADER BOX **/
(function($) {
	$.fn.leaderBox = function(settings) {
	   var config = {
	     slideShowDelay: 3000,
	     slideShowFadeDuration: 500
	   };

	   if (settings) $.extend(config, settings);

	   var gallery = this.find('div#gallery:first').eq(0);
	   var galleryFrames = gallery.find('div.frame');
	   var galleryInfoWindows = gallery.find('div.info-window');

	   var carouselElements = this.find('ul#carousel:first').children();

	   var currentIter = 0;
	   var slideShowTimer = null;

	   galleryFrames.each( function() {
	                           $(this).hover(
	                               function() { pauseSlideShow() },
	                               function() { playSlideShow() }
	                           )
	                       });

       carouselElements.each( function(i) {
                               $(this).hover(
                                   function() { skipToItem(i) },
                                   function() { playSlideShow() }
                               )
                           });

	   function skipToItem(num) {
            pauseSlideShow();
	        galleryFrames.each( function(){ $(this).css( {'opacity': 0, 'display': 'none'} ) } );
	        galleryInfoWindows.eq(currentIter).css( { 'display' : 'none' } );
	        galleryFrames.eq(num).css( { opacity: '1', display: 'block' } );
	        galleryInfoWindows.eq(num).css( { display: 'block' } );
	        selectCarouselEl(num);
	    }
	    function selectCarouselEl(iter) {
	       currentIter = iter;
	       carouselElements.removeClass('selected');
	       carouselElements.eq(iter).addClass('selected');
	    }
	    function getNextIteration(currentIter) {
	       var nextIter = currentIter+1;
	       if (nextIter >= galleryFrames.size()) nextIter = 0;
	       return nextIter;
	    }
	    function prevIteration(currentIter) {
	       var prevIter = currentIter-1;
	       if (prevIter < 0) prevIter = this.galleryFrames.length-1;
	       return prevIter;
	    }
	    function pauseSlideShow() {
	       clearTimeout ( slideShowTimer );
	    }
	    function fadeToNextItem() {

	        galleryFrames.each( function ( i ) {
                if ( i != currentIter ) $(this).css( {'opacity': 0, 'display': 'none'} );
	        });

	        var oldFrame = galleryFrames.eq(currentIter);
	        var oldInfoWindow = galleryInfoWindows.eq(currentIter);

	        nextIter = getNextIteration(currentIter);

	        var newFrame = galleryFrames.eq(nextIter);
	        var newInfoWindow = galleryInfoWindows.eq(nextIter);
	        selectCarouselEl(nextIter);

	        currentIter = nextIter;

	        oldFrame.animate({ opacity: 0 }, config.slideShowFadeDuration );
	        oldInfoWindow.css( 'display', 'none' );

	        newFrame.css( 'display', 'block' );
	        newFrame.animate({ opacity: 1 }, config.slideShowFadeDuration );
	        newInfoWindow.css( 'display', 'block' );
	    }
	    function playSlideShow() {
	       slideShowTimer = setInterval( fadeToNextItem, config.slideShowDelay );
	    }

	    //playSlideShow();
	};
})(jQuery);

/** TO TABS **/
(function($){
    $.fn.toTabs = function( options ) {
    var target = $( this );
    var o = $.merge( options, {
       tab_selector:  '.tab',
       view_selector: '.tab_view'
       }
    );

    $( this ).find( o.tab_selector ).each( function()
    {
        $(this).click( function()
        {
            target.find( o.view_selector ).each( function()
            {
                $( this ).css( 'display', 'none' );
            } );

            target.find( $(this).find('a').attr('href') ).css('display', 'block');

            target.find( o.tab_selector ).each( function()
            {
                $( this ).removeClass( 'selected' );
            } );

            target.find( $(this).attr('class').replace(/^|\s+/g, '.') ).each( function()
            {
                $( this ).addClass( 'selected' )
            } );

            if( typeof o.callback == 'function' ) {
                o.callback( target );
            }

            return false;
        } );
    } );

    $( this ).find( o.view_selector ).each( function()
    {
      if( !$( this ).hasClass( 'selected' ) ) {
          $( this ).css( 'display', 'none' );
      }

    } );

} } )( jQuery );


/** TICKER **/
(function($){
    $.fn.ticker = function( settings ) {
	    var config = {
	       delay: 3000,
	       currentIter: 0
	    };

	    if (settings) $.extend(config, settings);

	    var items = $(this).children('li');

	    function getNextIteration( currentIter ) {
		    var nextIter=currentIter+1;
		    if(nextIter>=items.size())nextIter=0;
		    return nextIter;
	    }

	    function play() {
		    items.eq(config.currentIter).css('display','none');
		    config.currentIter=getNextIteration(config.currentIter);
		    items.eq(config.currentIter).fadeIn("slow");
	    }

	    var timer = setInterval( play, config.delay );

} } )( jQuery );

/** TOOLTIPS **/
(function($){
    $.fn.tooltip = function( settings ) {
    var self = $( this );
    var config = {
       tooltipEl: null,
       offsetLeft: 0,
       offsetTop: 0,
       delay: 150,
       timeout: 0
    };

    if (settings) $.extend(config, settings);

    var titleAttr = self.attr('title');

    config.tooltipEl.appendTo( self.offsetParent() );

    var timer = null;

	function showTooltip(){
	  clearTimeout(timer);
	  if(titleAttr)self.removeAttr('title');
	  config.tooltipEl.css({position: 'absolute',
                            top: ( self.position().top + config.offsetTop ) + 'px',
                            left: ( self.position().left + config.offsetLeft ) + 'px',
                            zindex: '99999'
                           });
      config.tooltipEl.show();
	}

	function hideTooltip(){
	  timer=setTimeout( function(){
	                       if(titleAttr)self.attr('title',titleAttr);
	                       config.tooltipEl.hide();
	                   }, config.delay );
	}

	self.hover( function() { showTooltip() },
                   function() { hideTooltip() }
                 );

    config.tooltipEl.hover( function() { showTooltip() },
                   function() { hideTooltip() }
                 );

} } )( jQuery );

/** TOOLTIP HELPER FUNCTIONS **/
// Connect a tooltip to an element. Sorts out positioning.
function createToolTip(owner,tooltip) {
    tooltip.appendTo('div.global-center');
    offsetLeft = owner.outerWidth()-18;
    offsetTop = -tooltip.outerHeight(true)+3;
    owner.tooltip({ tooltipEl: tooltip,
                    offsetLeft: offsetLeft,
                    offsetTop: offsetTop
                  });
}

// After page load, create all flag tooltips that exist on the page:
$(document).ready(function() {
    $('span.flag.critics-choice.tip').each(function() {
        createFlagTooltip($(this),'critics-choice',"Critics' choice");
    });
    $('span.flag.recommended.tip').each(function(el) {
        createFlagTooltip($(this),'recommended','Recommended');
    });
    $('span.flag.last-chance.tip').each(function(el) {
        createFlagTooltip($(this),'last-chance','Last Chance');
    });
    $('span.flag.family-friendly.tip').each(function(el) {
        createFlagTooltip($(this),'family-friendly','Family friendly');
    });
});
// Standard Flag Tooltip e.g. Critics' choice or Last chance
function createFlagTooltip(owner,id,text) {
    if( $('#tooltip-'+id).size() == 0 ){
        var html = '<div id="tooltip-'+id+'" class="tooltip" style="display:none;">';
        html += '<div class="internal round">'+text+'</div><div class="pointer"></div></div>';
        $(html).appendTo('div.global-center');
    }
    var tooltip = $('#tooltip-'+id);
    createToolTip(owner,tooltip);
}

/** SLIDER **/
(function($){
    $.fn.slider = function( settings ) {
    var self = $( this );
    var config = {
       backwardEl: null,
       forwardEl: null,
       scrollSpeed: 500,
       orientation: 'vertical',
       itemSelector: 'li',
       itemOffset: 1
    };

    if (settings) $.extend(config, settings);

    var offsetAttr = 'offsetTop';

    var items = self.find( config.itemSelector );

    if ( config.orientation == 'horizontal' ) {
      /* Adjust the width of the scrolling
         element to put all elements in one row: */
      var selfWidth = 0;

      items.each(   function() {
                        selfWidth+=$(this).outerWidth(true);
                    });

      self.css( 'width', selfWidth + 'px' );

      offsetAttr = 'offsetLeft';
    }

    config.backwardEl.addClass( 'disabled' );

    var firstItemIndex = 0;

	function scrollBackward() {
	  var newFirstItemIndex = firstItemIndex - config.itemOffset;
	  if ( newFirstItemIndex >= 0 ) {
	      config.forwardEl.removeClass( 'disabled' );
	      scrollTo( items.eq( newFirstItemIndex ).attr( offsetAttr ) );
	      firstItemIndex = newFirstItemIndex;
	      if( ( firstItemIndex - config.itemOffset ) < 0 ) config.backwardEl.addClass( 'disabled' );
	  }
	}

	function scrollForward() {
	  var newFirstItemIndex = firstItemIndex + config.itemOffset;
	  if ( newFirstItemIndex < items.size() ) {
	      config.backwardEl.removeClass( 'disabled' );
	      scrollTo( items.eq( newFirstItemIndex ).attr( offsetAttr ) );
	      firstItemIndex = newFirstItemIndex;
	      if( ( firstItemIndex + config.itemOffset ) >= items.size() ) config.forwardEl.addClass( 'disabled' );
	  }
	}

	function scrollTo( offset ){
	  if ( offsetAttr == 'offsetLeft' ) {
	    self.animate( { left: -offset }, config.scrollSpeed, "linear" );
	  } else {
	    self.animate( { scrollTop: offset }, config.scrollSpeed, "linear" );
	  }
	}

    config.forwardEl.click( scrollForward );
    config.backwardEl.click( scrollBackward );

} } )( jQuery );

/**
 * defaultText is a plugin to standardise the way text fields are handled. Default text is displayed in
 * the field. When the user clicks the field, the default text is automatically cleared.
 **/
(function($){
    $.fn.defaultText = function( settings ) {
    var self = $( this );
    var config = {
       defaultText: '',
       defaultClass: 'default'
    };

    if (settings) $.extend(config, settings);

    if ( config.defaultText == '' ) config.defaultText = self.attr('title');

    ( self.attr( 'value' ) == config.defaultText ) ?
        self.addClass( config.defaultClass ) : self.removeClass( config.defaultClass );

    self.focus( function() {
	    if ( self.attr( 'value' ) == config.defaultText ) {
	        self.attr( 'value', '' );
	        self.removeClass( config.defaultClass );
	    } else {
	        self.select();
	    }
    });

    self.blur( function() {
	    if ( self.attr( 'value' ) == '' ) {
	        self.addClass( config.defaultClass );
	        self.attr( 'value', config.defaultText );
	    }
    });

} } )( jQuery );

$(document).ready( function() {
    $('input.text-field').each( function() { $(this).defaultText(); })
});

/** CAROUSEL **/
(function($){
    $.fn.carousel = function( settings ) {
    var self = $( this );
    var config = {
       backwardElClass: null,
       forwardElClass: null,
       scrollableElClass: null,
       centerOnElClass: null,
       scrollSpeed: 500
    };

    if (settings) $.extend(config, settings);

    var backwardEl   = self.find( config.backwardElClass );
    var forwardEl    = self.find( config.forwardElClass );
    var scrollableEl = self.find( config.scrollableElClass );

    var scrollableElWrapper = scrollableEl.parent();

    var carouselEls = scrollableEl.children();

    var scrollableElWidth = 0;

    carouselEls.each( function() { scrollableElWidth+=$(this).outerWidth(true); } );

    scrollableEl.css( 'width', scrollableElWidth + 'px' );

    if ( config.centerOnElClass != null ) {

        var centerOnEl = carouselEls.siblings( config.centerOnElClass + ':first' );

        var centerOnOffset = centerOnEl.attr( 'offsetLeft' ) - ( ( scrollableElWrapper.width() / 2 ) - ( centerOnEl.width() / 2 ) );

        scrollableEl.css( 'left', -getBoundedOffset( centerOnOffset ) );
    }

    toggleDisabled( -scrollableEl.position().left );

    forwardEl.click( function () {
        if ( !forwardEl.hasClass( 'disabled' ) ) {

            var newOffset = -scrollableEl.position().left + scrollableElWrapper.width();

            toggleDisabled( newOffset );

            scrollableEl.animate( { left: -getBoundedOffset( newOffset ) }, config.scrollSpeed, "linear" );
        }
    });

    backwardEl.click( function () {
        if ( !backwardEl.hasClass( 'disabled' ) ) {

            var newOffset = -scrollableEl.position().left - scrollableElWrapper.width();

            toggleDisabled( newOffset );

            scrollableEl.animate( { left: -getBoundedOffset( newOffset ) }, config.scrollSpeed, "linear" );
        }
    });

    function toggleDisabled( newOffset ) {

        ( newOffset <= 0 ) ? backwardEl.addClass( 'disabled' ) : backwardEl.removeClass( 'disabled' );

        ( newOffset >= ( scrollableEl.width() - scrollableElWrapper.width() ) ) ? forwardEl.addClass( 'disabled' ) : forwardEl.removeClass( 'disabled' );
    }

    function getBoundedOffset( offset ) {

        if ( offset <= 0 ) offset = 0;

        if ( offset >= ( scrollableEl.width() - scrollableElWrapper.width() ) ) offset = scrollableEl.width() - scrollableElWrapper.width();

        return offset;
    }

} } )( jQuery );

$(document).ready(function() {
	$(".calender:first").each(function(){
		$(this).find("ol > li:first-child").addClass("clickedday");
	})

    calender = function() {
        var firstday = null;
        firstday = $(".calender > ol > li:first-child").position();
        if (firstday !== undefined){
            var menu = $(".calender > ol").find("li")
            var daychange = $(".calender > ol")
            var daylist = $(".calender > ul")
            var marker = $(".mark")

             /*calender marker first positioning*/

             marker.css({top:firstday.top, left:firstday.left, display:"block"})

             menu.each(function(i) {
                $(this).mousedown(function() {
                    daychange.find(".clickedday").removeClass("clickedday");
                    $(this).addClass("clickedday")
                    var dayss = $(this).position()
                    marker.css({top:dayss.top, left:dayss.left, display: "block"})
                    daylist.find(".shown").slideUp("slow").removeClass();
                    daylist.find("li:eq("+i+")").slideDown("slow").addClass("shown")
                });
             });

             $(".calender > ol > li:first-child").mousedown();
        }
    };
});

$(window).load(function () {
	$('.calender:first').each(function(){
		calender();
		/*
		$(window).resize(function(){
			var moveto = $(". > ol").find(".clickedday").position();
			var markercorrection = $(".mark");
			markercorrection.css({left:moveto.left, display:"block"});
		})
		*/
	})
});




//**********************************************************************************//
Validate.validateSubscribeForm = function(formName){
   formObj  = document.forms[formName];

   //-----------------------------------------------------//
   if (isTextEmpty(formObj.salutation.value))
   {
     alert('Please choose your title.');
     formObj.salutation.focus();
     return false;
   }

   //-----------------------------------------------------//
   if (isTextEmpty(formObj.first_name.value))
   {
     alert('Please enter your first name.');
     formObj.first_name.select();
     return false;
   }

   //-----------------------------------------------------//
   if (isTextEmpty(formObj.last_name.value))
   {
     alert('Please enter your last name.');
     formObj.last_name.select();
     return false;
   }
   //-----------------------------------------------------//
   if (isTextEmpty(formObj.address_street.value) &&
       isTextEmpty(formObj.address_town.value)   &&
       isTextEmpty(formObj.address_state.value))
   {
     alert('Please enter your mailing address.');
     formObj.address_street.select();
     return false;
   }
   //-----------------------------------------------------//
   if (!isValidEmail(formObj.email.value))
   {
     alert('Please enter a valid email address.');
     formObj.email.select();
     return false;
   }


   if (formName == 'giftMagazine'){
       //-----------------------------------------------------//
       if (isTextEmpty(formObj.shipping_salutation.value))
       {
         alert('Please choose shipping title.');
         formObj.shipping_salutation.focus();
         return false;
       }

       //-----------------------------------------------------//
       if (isTextEmpty(formObj.shipping_first_name.value))
       {
         alert('Please enter shipping first name.');
         formObj.shipping_first_name.select();
         return false;
       }

       //-----------------------------------------------------//
       if (isTextEmpty(formObj.shipping_last_name.value))
       {
         alert('Please enter shipping last name.');
         formObj.shipping_last_name.select();
         return false;
       }
       //-----------------------------------------------------//
       if (isTextEmpty(formObj.shipping_address_street.value) &&
           isTextEmpty(formObj.shipping_address_town.value)   &&
           isTextEmpty(formObj.shipping_address_state.value))
       {
         alert('Please enter shipping address.');
         formObj.shipping_address_street.select();
         return false;
       }
       //-----------------------------------------------------//
       if (!isValidEmail(formObj.shipping_email.value))
       {
         alert('Please enter a valid shipping email address.');
         formObj.shipping_email.select();
         return false;
       }
   }
   //-----------------------------------------------------//
}




//**********************************************************************************
function isTextEmpty(fieldValue)
{
   while(''+fieldValue.charAt(0) == ' ')
   {
     fieldValue = fieldValue.substring(1,fieldValue.length);
   }

   if (fieldValue == '')
       return true;
   else
       return false;

} // end isTextEmpty


//***************************** isValidEmail ****************************
function isValidEmail(emailStr) {
/* The following pattern is used to check if the entered e-mail address
   fits the user@domain format.  It also is used to separate the username
   from the domain. */
var emailPat=/^(.+)@(.+)$/;
/* The following string represents the pattern for matching all special
   characters.  We don't want to allow special characters in the address.
   These characters include ( ) < > @ , ; : \ " . [ ]    */
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
/* The following string represents the range of characters allowed in a
   username or domainname.  It really states which chars aren't allowed. */
var validChars="\[^\\s" + specialChars + "\]";
/* The following pattern applies if the "user" is a quoted string (in
   which case, there are no rules about which characters are allowed
   and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
   is a legal e-mail address. */
var quotedUser="(\"[^\"]*\")";
/* The following pattern applies for domains that are IP addresses,
   rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
   e-mail address. NOTE: The square brackets are required. */
var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
/* The following string represents an atom (basically a series of
   non-special characters.) */
var atom=validChars + '+';
/* The following string represents one word in the typical username.
   For example, in john.doe@somewhere.com, john and doe are words.
   Basically, a word is either an atom or quoted string. */
var word="(" + atom + "|" + quotedUser + ")";
// The following pattern describes the structure of the user
var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
/* The following pattern describes the structure of a normal symbolic
   domain, as opposed to ipDomainPat, shown above. */
var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");


/* Finally, let's start trying to figure out if the supplied address is
   valid. */

/* Begin with the coarse pattern to simply break up user@domain into
   different pieces that are easy to analyze. */
var matchArray=emailStr.match(emailPat);
if (matchArray==null) {
  /* Too many/few @'s or something; basically, this address doesn't
     even fit the general mould of a valid e-mail address. */
//	alert("Email address seems incorrect (check @ and .'s)")
	return false;
}
var user=matchArray[1];
var domain=matchArray[2];

// See if "user" is valid
if (user.match(userPat)==null) {
    // user is not valid
//    alert("The username doesn't seem to be valid.")
    return false;
}

/* if the e-mail address is at an IP address (as opposed to a symbolic
   host name) make sure the IP address is valid. */
var IPArray=domain.match(ipDomainPat);
if (IPArray!=null) {
    // this is an IP address
	  for (var i=1;i<=4;i++) {
	    if (IPArray[i]>255) {
//	        alert("Destination IP address is invalid!");
		return false;
	    }
    }
    return true;
}

// Domain is symbolic name
var domainArray=domain.match(domainPat);
if (domainArray==null) {
//	alert("The domain name doesn't seem to be valid.");
    return false;
}

/* domain name seems valid, but now make sure that it ends in a
   three-letter word (like com, edu, gov) or a two-letter word,
   representing country (uk, nl), and that there's a hostname preceding
   the domain or country. */

/* Now we need to break up the domain to get a count of how many atoms
   it consists of. */
var atomPat=new RegExp(atom,"g");
var domArr=domain.match(atomPat);
var len=domArr.length;
if (domArr[domArr.length-1].length<2 ||
    domArr[domArr.length-1].length>3) {
   // the address must end in a two letter or three letter word.
//   alert("The address must end in a three-letter domain, or two letter country.")
   return false;
}

// Make sure there's a host name preceding the domain.
if (len<2) {
   var errStr="This address is missing a hostname!";
//   alert(errStr);
   return false;
}

// If we've gotten this far, everything's valid!
return true;
}
//  End -->


//================ SURVEY RELATED ============================//
var Survey = new Object();

Survey.participateMember = function(xUrl) {
    return;
}

//=====================================================//
Survey.submitSurvey = function() {
    var frmObj = document.forms['survey'];
    var url = "index.php?_room=survey&_spAction=nextPage&showHTML=0";
    
    var formContent = $('#survey').serialize();
    
    $.post(url, formContent, function(json) {
        if (json.status == "success") {
            $('#surveyContainer').html(json.pageText).hide().slideDown(3000);
            $('#surveyErrorContainer').hide();
        } else {
            $('#surveyErrorContainer').html(json.errorText).show();
        }
        scroll(0,0);
    }, 'json');
}
