function writeCookie(name,value,days)
{
    if ( days )
    {
        var date = new Date( );
        date.setTime( date.getTime( ) + ( days*24*60*60*1000 ) );
        var expires = '; expires=' + date.toGMTString( );
    }
    else var expires = '';
    document.cookie = name + '=' + value+expires + '; path=/';
}

function readCookie(name)
{
    var nameEQ = name + '=';
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++)
    {
        var c = ca[ i ];
        while ( c.charAt( 0 ) == ' ' ) c = c.substring( 1, c.length );
        if ( c.indexOf( nameEQ ) == 0 ) return c.substring( nameEQ.length, c.length ).replace(/</g,"&lt;").replace(/>/g,"&gt;");
    }
    return null;
}

//////////////////////
// begin mto functions
//////////////////////
// loginUrl needs to be /user/login/?targetUrl=...
function mtoLoginPopup( loginUrl, width, height )
{
    var screenX = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
    	    screenY    = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
            outerWidth = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.body.clientWidth,
            outerHeight = typeof window.outerHeight != 'undefined' ? window.outerHeight : ( document.body.clientHeight - 22 ),
            left     = parseInt( screenX + ( ( outerWidth - width ) / 2 ), 10 ),
            top      = parseInt( screenY + ( ( outerHeight - height ) / 2.5 ), 10 ),
            features = ( 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top);
    var mtoWindow = window.open( loginUrl, 'facebook_connect', features );
    if ( window.focus )
    {
    	mtoWindow.focus( );
    }
    return false;
}

function mtoCreateButton( loginUrl, logoutUrl, width, height, anonPic, homeUrl, loginContent, logoutContent )
{
    var buttonUrl     = null;
    var buttonOnclick = null;
    var buttonContent = null;

    var mtoSid  = readCookie( 'mtosid' );
    var mtoErr  = readCookie( 'mtoerr' );
    var symfony = readCookie( 'tolondon' );

    if ( mtoSid == symfony )
    {
    	buttonUrl     = logoutUrl;
        buttonOnclick = '';
        buttonContent = logoutContent;
    }
    else if ( mtoErr )
    {
        // handle the error
        writeCookie( 'mtoerr', '', -1 );
    }
    else
    {
    	buttonUrl     = '#';
        buttonOnclick = 'mtoLoginPopup( \'' + loginUrl + '\', \'' + width + '\', \'' + height + '\' );return false;';
        buttonContent = loginContent;
    }

    buttonLink = '<a href="' + buttonUrl + '" onclick="' + buttonOnclick + '">' + buttonContent + '</a>';

    $( '#facebookLogin' ).html( buttonLink );
}

function mtoCreateLink( targetUrl, logoutUrl, width, height, anonPic, homeUrl, loginContent, logoutContent )
{
    var html          = '';
    var buttonUrl     = null;
    var buttonOnclick = null;
    var buttonContent = null;
    var mtoContent    = null;
    var logos         = '';

    var mtoName = readCookie( 'mtoname' );
    var mtoImg  = readCookie( 'mtoimg' );
    var mtoSid  = readCookie( 'mtosid' );
    var mtoFbsk = readCookie( 'mtofbsk' );
    var mtoErr  = readCookie( 'mtoerr' );
    var symfony = readCookie( 'tolondon' );

    if ( mtoName && mtoSid == symfony )
    {
    	// add the session key if it is missing
    	if ( logoutUrl.indexOf( 'session_key' ) == -1 ) logoutUrl += '&session_key=' + mtoFbsk;

        buttonUrl     = logoutUrl;
        buttonOnclick = '';
        buttonContent = logoutContent;
        mtoContent    = '';

        if ( !mtoImg ) mtoImg = anonPic;

        // replace the underscore
        mtoName = mtoName.replace( /_/g, ' ' );

        html  = '<span class="pic"><img src="' + mtoImg + '" height="20" width="20" /></span> ';
        html += '<a href="' + homeUrl + '" target="_parent">' + mtoName + '</a> ';
        html += '<span class="sep">|</span> ';
    }
    else if ( mtoErr )
    {
        // handle the error
        writeCookie( 'mtoerr', '', -1 );
    }
    else
    {
        buttonUrl     = '#';
        buttonOnclick = 'mtoLoginPopup( \'' + targetUrl + '\', \'' + width + '\', \'' + height + '\' );return false;';
        buttonContent = loginContent;
        mtoContent    = '<strong>My Time Out</strong>';
        logos         = 'class="facebook"';
    }

    buttonLink = '<a href="' + buttonUrl + '" onclick="' + buttonOnclick + '"' + logos + '>' + buttonContent + '</a>';
    html += mtoContent + buttonLink;

    $( '#loginButton span.inner' ).html( html );
}

function mtoClearClientCookies( appId )
{
    writeCookie( 'mtoname', '', -1 );
    writeCookie( 'mtoimg', '', -1 );
    writeCookie( 'mtosid', '', -1 );
    writeCookie( 'fbs_' + appId, '', -1 );
}

function mtoPing( pingUrl, appId, callback )
{
	var mtoSid  = readCookie( 'mtosid' );

	if ( mtoSid )
	{
		$.get( pingUrl, {}, function( serverResponse )
		{
			if ( serverResponse == 'pong' )
			{
				// logged in
			}
			else
			{
				mtoClearClientCookies( appId );
				if ( callback )	callback( );
			}
		});
	}
	else
	{
		if ( callback )	callback( );
	}
}


/**
 * Colorbox documentation available on http://colorpowered.com/colorbox/
 * @param notificationStatusUrl
 * @param callback default to null
 * @return
 */
function mtoGetNotification ( notificationStatusUrl, callback )
{
    jQuery.get( notificationStatusUrl, {}, function( serverResponse )
    {
        if( serverResponse != '' )
        {
            var colorbox = jQuery.fn.colorbox( {
                html: serverResponse,
                speed:400,
                opacity:0.50,
                close:null
            });

            if( callback )
            {
                var numLoop = 1;
                // The colorbox listener seems to be bugged and loop on the callback for
                // almost 100 times...So iBoucle is used to call the function only once.
                colorbox.bind( 'cbox_closed', function() {
                    if( numLoop == 1 )
                    {
                        eval( callback );
                    }
                    numLoop++;
                });
            }
        }
        else
        {
            if( callback )
            {
                eval( callback );
            }
        }
    });
}

// Used to send an email with event's details
function mtoEmailDetails( url, update )
{
    $( update ).attr( 'onclick', 'javascript:;' );
    $( update ).attr( 'class', 'email' );
    $( update ).html( 'Sending&nbsp;' );

    $.post( url, { }, function( data ) {
        $( update ).html( data + '&nbsp;' );
    });
}

/**
 *
 * @param oid occurrence id
 * @param urlDeleteAttendance url to delete the attendance (if click on `cancel`)
 * @return
 */
function mtoEditAttendance( oid, urlDeleteAttendance )
{
	var aTag   = '#link-edit-att-' + oid;
	var divTag = '#edit-att-' + oid;
	var att    = $.trim( $( 'ul#choices-' + oid ).children( '.selected' ).text( ) ).toLowerCase( );

	if( $( divTag ).length == 0 )
	{
	    var divTag = '#datepicker-buttons-' + oid;
	}

    if( $( divTag ).css( 'display' ) == 'none' )
    {
        // close all boxes and rename old Edit
        $( 'a[id*=link-edit-att]' ).each( function( ) {
            $( this ).text( $( this ).attr( 'title' ) );
        } );
        $( 'div[id*=edit-att]' ).slideUp( );

        // open current one
        $( aTag ).text( 'Close' );
        $( divTag ).slideDown( );
    }
    else
    {
        $( aTag ).text( $( aTag ).attr( 'title' ) );
        $( divTag ).slideUp( );

        if( att != '' && urlDeleteAttendance != '' )
        {
            $( 'ul#choices-' + oid ).children( ).removeClass( 'selected' );
            $.get( urlDeleteAttendance );
        }
    }
}

function mtoShowMoreFriends( occurrenceId )
{
	var divTag = '#user_all_event_' + occurrenceId;

	if( $( divTag ).css( 'display' ) == 'none' )
    {
        $( divTag ).show( );
    }
    else
    {
        $( divTag ).hide( );
    }

}
/**
 * pops a facebook connect window up.
 * parameter are : oid, att, oidAtt
 * @param oid
 * @param next
 * @param popupW
 * @param popupH
 * @return
 */
function mtoRedirectToLogin( oid, next, popupW, popupH )
{
    var redirectLogin = next;
    var attendanceParams = '{';

    attendanceParams += '"oid": '+ oid + ',';

    var att = $.trim( $( 'ul#choices-' + oid ).children( '.selected' ).text( ) ).toLowerCase( );
    if( att == '' )
    {
        $( '#attendance-error-' + oid ).slideDown( );
        return false;
    }

    attendanceParams += '"att": "' + att + '"';

    // display date picker if not yet displayed
    if( $( '#date_picker_' + oid ).length > 0 && $( '#datepicker-buttons-' + oid ).css( 'display' ) == 'none' )
    {
        $( '#datepicker-buttons-' + oid ).slideDown( );
        return false;
    }

    // get date picker
    if( $('#date_picker_' + oid).length > 0 )
    {
        datePicker = $( '#date_picker_' + oid ).val( );

        if( datePicker != '' )
        {
        	attendanceParams += ',"oidAtt": "' + datePicker + '"';
        }
    }
    attendanceParams += '}';

    mtoLoginPopup( redirectLogin + '&attendance=' + attendanceParams, popupW, popupH );
}

function mtoSelectChoice( oid, spanTag )
{
    $( 'ul#choices-' + oid ).children( ).removeClass( 'selected' );
    $( spanTag ).parent( ).parent( ).parent( ).addClass( 'selected' );
}

/**
 * Manage the button 'add/remove to/from my radar'
 * @unfuddle #489 updated
 * @param radarString serialize string for items
 * @param urlItem url of the item
 * @param radarItem html node
 * @param ItemInRadar state of the item [yes|no|fail]
 * @param urlAdd utl to add
 * @param urlRemove url to remove
 * @param sameBehavior to change the behavior of all buttons or not
 * @param overrideNotification if true : related overlay will be `seen` by the user if he is new
 * @return new item state [yes|no|maybe]
 */
function mtoManageRadarItem( radarString, urlItem, radarItem, ItemInRadar, urlAdd, urlRemove, urlNotification, sameBehavior, overrideNotification, radarType, tooltipContent )
{
    radarItem.parent( ).find( '.my-radar-state' ).show( ).html( '<img src="/../images/loader-transparent.gif" width="16" height="16" />' );

    var buttonAddText  = radarType ? ' this ' + radarType : '';
    var buttonFollow   = '<span class="myTO plus triggerTooltip">+&nbsp;Follow' + buttonAddText + '</span>';
    var buttonUnfollow = '<span class="myTO minus">-&nbsp;Unfollow</span>';

    var radarTooltip = radarItem.attr( 'id' ) + '-tooltip';
    radarTooltip = $( '#' + radarTooltip );
    var radarTooltipContent = radarTooltip.html( );

    if( ItemInRadar == 'no' )
    {
        $.post( urlAdd, { radarString: radarString, urlItem: urlItem, overrideNotification: overrideNotification }, function( serverResponse )
        {
            if( serverResponse == 'success' )
            {
                toTooltip.removeTooltip( radarItem.find( 'span.myTO' ) );

                radarItem.html( buttonUnfollow );

                if( sameBehavior )
                {
                    jQuery( "div[id^='manage-radar-']" ).html( '' );
                }

                radarItem.parent( ).find( '.my-radar-state' ).html( 'Added' );
                // @todo change the setTimeout by .delay once we'll use jQuery 1.4 (currently 1.3.2)
                var callback = function ( ) { radarItem.parent( ).find( '.my-radar-state' ).fadeOut( ); }
                window.setTimeout( callback, 1000 );

                mtoGetNotification( urlNotification, '' );

                searchCallback( 'yes' );
            }
        });
    }
    else if( ItemInRadar == 'yes' )
    {
        $.post( urlRemove, { radarString: radarString }, function( serverResponse )
        {
            if( serverResponse == 'success' )
            {
                radarItem.html( buttonFollow );
                toTooltip.displayTooltip( radarItem.find( 'span.myTO' ), tooltipContent );

                radarItem.parent( ).find( '.my-radar-state' ).html( 'Removed' );
                // @todo change the setTimeout by .delay once we'll use jQuery 1.4 (currently 1.3.2)
                var callback = function ( ) { radarItem.parent( ).find( '.my-radar-state' ).fadeOut( ); }
                window.setTimeout( callback, 1000 );

                searchCallback( 'no' );
            }
        });
    }
    // state must be failed.
    else
    {
        ItemInRadar = 'no';
    }

    return ItemInRadar;
}

function mtoRadarSearchRemoveItem( id, urlRemove, tagId )
{
	var tag = $( '#' + tagId );
	$.post( urlRemove, { radarItemId: id }, function( serverResponse )
    {
        if( serverResponse == 'success' )
        {
        	tag.slideUp( );
        	window.location.reload( );
        }
    });
}

/**
 * manage selection on attendance.
 * save the choice if urlAttend is given
 * @param oid occurrence id
 * @param spanTag span
 * @param slideButtons `boolean` do we slideDown date picker and buttons ?
 * @param urlAttend `string` empty for not saving, url to attend otherwise.
 * @return
 */
function mtoManageChoice( oid, spanTag, slideButtons, urlAttend, urlNotification, myTO, slideUp, saveFromDatePicker, inRadar )
{
    $( '#attendance-toggle-processing-' + oid ).show( );
    $( 'ul#choices-' + oid ).children( ).removeClass( 'selected' );
    $( spanTag ).parent( ).parent( ).parent( ).addClass( 'selected' );

    if( slideButtons == true )
    {
        var att = $.trim( $( 'ul#choices-' + oid ).children( '.selected' ).text( ) ).toLowerCase( );
        if( att == 'yes' || att == 'maybe' )
        {
            $( '#datepicker-buttons-' + oid ).slideDown( );
        }
        else
        {
            $( '#datepicker-buttons-' + oid ).slideUp( );
        }
    }

    if( urlAttend != '' )
    {
        mtoSaveAttendance( oid, urlAttend, urlNotification, myTO, slideUp, saveFromDatePicker, inRadar );
    }
    else
    {
        $( '#attendance-toggle-processing-' + oid ).hide( );
    }
}

/**
 *
 * @param oid
 * @param urlAttend
 * @param urlNotification
 * @return
 */
function mtoSaveAttendance( oid, urlAttend, urlNotification, myTO, slideUp, saveFromDatePicker, inRadar )
{
    // check if an attendance's selected
    var att = $.trim( $( 'ul#choices-' + oid ).children( '.selected' ).text( ) ).toLowerCase( );
    urlNotification = urlNotification + '&attendance=' + att;
    var futureOccurrenceId = '';

    if( att == '' )
    {
        alert( 'Please select your choice.' );
        $( '#attendance-toggle-processing-' + oid ).hide( );
        return false;
    }

    // check if we have a date
    if( att != 'no' && $( '#date_picker_' + oid ).length > 0 )
    {
        var futureOccurrenceId = $( '#date_picker_' + oid ).val( );
    }

    // send request to /user/id/attend
    $.post( urlAttend, { oid: oid, att: att, oidAtt: futureOccurrenceId, myTO: myTO },
    function( saveResponse )
    {
		if( slideUp == true )
		{
			$( '#datepicker-buttons-' + oid ).slideUp( );
		}

		$( '#attendance-toggle-processing-' + oid ).hide( );

		var callbackFunc = '';
		var getNotification = true;

		// MTO PAGES => if date picker : reload the page after clicked on `done`,
		// if NO date picker : reload after having selected a choice.
		if( saveFromDatePicker || $( '#date_picker_' + oid ).length == 0 )
		{
		    callbackFunc = 'window.location.reload( );';
		}
		else
		{
		    // we do not need to see any overlay if nothing happens.
		    getNotification = false;
		}

		// EVENTS PAGE => show what is returned server-side. NEVER reload the page.
		if( $( '#userAttendanceGoing' ).length )
		{
		    $( '#userAttendanceGoing' ).show( );
		    $( '#userAttendanceGoing' ).html( saveResponse );
		    callbackFunc = '';
		}

		if( getNotification )
		{
		    if( ( att == 'no' || att == 'been' ) && callbackFunc )
		    {
		        eval( callbackFunc );
		    }
		    else
		    {
		        mtoGetNotification( urlNotification, callbackFunc );
		    }
		}

		return false;
    });
}

/**
 * remove an item from the user's radar
 * @unfuddle #489 updated
 * @param radarString serialize string for items
 * @param urlRemove url
 * @param tag tag html
 * @return
 */
function mtoRemoveItemFromRadar( radarString, urlRemove, tag )
{
    $.post( urlRemove, { radarString: radarString }, function( serverResponse )
    {
        if( serverResponse == 'success' )
        {
            window.location.reload( );
        }
        else
        {
            $( tag ).text( 'Failed !' );
        }
    });
}

function mtoIsLoggedIn( )
{
	if( readCookie( 'mtosid' ) )	return true;
	else							return false;
}
//////////////////////
// end mto functions
//////////////////////

/**
* 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
                  });
}

function createRadarToolTip( owner, tooltip, offsetLeftDiff, offsetTopDiff )
{
    var screenX = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
            screenY    = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
            outerWidth = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.body.clientWidth,
            outerHeight = typeof window.outerHeight != 'undefined' ? window.outerHeight : ( document.body.clientHeight - 22 ),
            ownerLeft = parseInt(owner.offset( ).left);
    tooltip.appendTo('div.global-center');
    offsetLeft  = owner.outerWidth( ) - offsetLeftDiff;
    offsetTop   = - ( tooltip.outerHeight(true) + offsetTopDiff );
    if( ownerLeft + 400 >= outerWidth )
    {
        offsetLeft  = - (owner.outerWidth( ) + 190 );
        tooltip.addClass('pointRight');
    }
    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.toSlider = 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( ); });

    $('input.title2default').each( function() {
        var iTitle = $(this).attr('title');
        if ( iTitle && (iTitle!='') ) {
            $(this).val( iTitle );
            $(this).addClass('default');
            $( this ).blur( function() {
                if ( $(this).val() === '' ) {
                    $(this).val(iTitle);
                    $(this).addClass('default');
                }
            }).focus( function() {
                if ( $(this).val() === iTitle ) {
                    $(this).val('');
                    $(this).removeClass('default');
                }
            });
        }
    })
});

/** CAROUSEL **/
(function($){
    $.fn.carousel = function( settings ) {
	    var self = $( this );
	    var config = {
	       backwardElClass: null,
	       forwardElClass: null,
	       scrollableElClass: null,
	       centerOnElClass: null,
	       scrollStep: 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 scrollStep   = config.scrollStep;

	    var scrollableElWrapper = scrollableEl.parent( );

	    var carouselEls = scrollableEl.children( );

	    setScrollableElWidth( );

	    if ( config.centerOnElClass != null ) {

	        var centerOnEl = carouselEls.siblings( config.centerOnElClass + ':first' );

	        var centerOnOffset = getBoundedOffset( ( ( scrollableElWrapper.width( ) / 2 ) - ( centerOnEl.width( ) / 2 ) ) - centerOnEl.attr( 'offsetLeft' ) );

	        scrollableEl.css( 'left', centerOnOffset );

	    } else {

	        scrollableEl.css( 'left', getBoundedOffset( 0 ) );
	    }

	    forwardEl.click( function ( ) {
	        if ( !forwardEl.hasClass( 'disabled' ) ) {
	            setScrollableElWidth( );
	            var step = scrollableElWrapper.width( );
	            if ( scrollStep != null )
	            {
	            	step = scrollStep;
	            }

	            var newOffset = getBoundedOffset( scrollableEl.position( ).left - step );
	            scrollableEl.animate( { left: newOffset }, config.scrollSpeed, 'linear' );
	        }
	    });

	    backwardEl.click( function ( ) {
	        if ( !backwardEl.hasClass( 'disabled' ) ) {
	            setScrollableElWidth( );
	            var step = scrollableElWrapper.width( );
	            if ( scrollStep != null )
	            {
	            	step = scrollStep;
	            }

	            var newOffset = getBoundedOffset( scrollableEl.position( ).left + step );
	            scrollableEl.animate( { left: newOffset }, config.scrollSpeed, 'linear' );
	        }
	    });

	    function setScrollableElWidth( ) {
	        var scrollableElWidth = 0;

	        carouselEls.each( function( ) { scrollableElWidth+=$(this).outerWidth(true); } );

		    if ( scrollableElWidth > scrollableElWrapper.width( ) ) {
		        scrollableEl.css( 'width', scrollableElWidth + 'px' );
		    } else {
		        scrollableEl.css( 'width', scrollableElWrapper.width( ) + 'px' );
		    }
		}

	    function getBoundedOffset( newOffset ) {

	        var boundedOffset = newOffset;

	        if ( newOffset >= 0 ) {

	            backwardEl.addClass( 'disabled' );
	            boundedOffset = 0;

	        } else {

	            backwardEl.removeClass( 'disabled' );
	        }

	        if ( newOffset <= ( scrollableElWrapper.width( ) - scrollableEl.width( ) ) ) {

	            forwardEl.addClass( 'disabled' );
	            boundedOffset = scrollableElWrapper.width( ) - scrollableEl.width( );

	        } else {

	            forwardEl.removeClass( 'disabled' );
	        }

	        return boundedOffset;
	    }
    }
} )( jQuery );


$(document).ready( function( ) {
    // truncation of tags
    if (jQuery( ).truncate) {
        $('div.tags-container div.tags').truncate( 100, {
                trail: ['... <a href="#" title="Show more" class="truncate_show show-link">More</a>',
                               '&nbsp;<a href="#" title="Show less" class="truncate_hide hide-link">Less</a>']
        });
    }

    // show/hide special offers description
    $('div.specialOffers p.desc').after('<span class="showhide show-link">Show details</span>').hide( );
    $('div.specialOffers .showhide').toggle(function( ){
        $(this).removeClass('show-link').addClass('hide-link');
        $(this).text('Hide details');
        $(this).prev( ).show( ).prev( ).addClass('withDesc');
    }, function( ) {
        $(this).removeClass('hide-link').addClass('show-link');
        $(this).text('Show details');
        $(this).prev( ).hide( ).prev( ).removeClass('withDesc');
    });

    // moved invalid CSS for opacity in IE out from the styles
    if ( !jQuery.support.opacity ) {
        $('#leader-box div#gallery .info-window .bg, div.flyer div.info-window .overlay, div.facebook-users div.user span.image em').css(
            'filter', 'progid:DXImageTransform.Microsoft.Alpha(opacity=60)'
        );
        $('.iphone div.flyer div.info-window .side-1, .fancyNav ul li a span').css(
            'filter', 'progid:DXImageTransform.Microsoft.Alpha(opacity=80)'
        );
    }

    // microsite/simplePlanner
    $('#simplePlanner .tabTarget h3.box-header').hide();
    $('#simplePlanner .tabNav a').click(function(){
        if ($(this).hasClass('showAll')) {
            $('#simplePlanner .tabTarget').show();
            $('#simplePlanner #list-all').addClass('listAll');
        } else {
            $('#simplePlanner .tabTarget').hide();
            $($(this).attr('href')).show();
            $('#simplePlanner #list-all').removeClass('listAll');
        }
        $('#simplePlanner .tabNav li').removeClass('selected');
        $(this).parent().parent().addClass('selected');
        return false
    });

    $('form.submitSelect input').hide();
    $('form.submitSelect select').change(function(){
        $('form.submitSelect').submit();
    });

    // open any form with class 'submitIntoNewWindow' in a new window
    $('form.submitIntoNewWindow').attr('title', 'opens in a new window').submit(function(e) {
        var formID     = $(this).attr('id');
        var formAction = $(this).attr('action');
        var formValues = $(this).serialize();
        window.open( formAction + '?' + formValues, formID );
        e.preventDefault();
        return false;
    });


});//$(document).ready( )


function centerFireplace( divWidth, maxWidth ) {
    var windowWidth = $( window ).width();
    if ( windowWidth > maxWidth )
        $( '#flashFireplace' ).css( 'margin-left', ( -1 * divWidth/2 ) + windowWidth/2 );
    if ( windowWidth <= divWidth )
        $( '#flashFireplace' ).css( 'width', divWidth - ( ( ( divWidth/2 ) - windowWidth/2 ) ) -1 );
}

function isEmpty(object){
    return (object.length > 0 ? true : false);
}
function isUndefined(object){
    return (typeof(object) === 'undefined' || object == null);
}


