var my_glider;

var appscripts = function()
{
	if($('glider'))
	{
		my_glider = new Glider('glider', {duration:0.5, frequency: 10} );

		$('glider-previous').observe('click', my_glider.previous.bind(my_glider) );
		$('glider-next').observe('click', my_glider.next.bind(my_glider) );			
		
		my_glider.start();
	}
	
	if($$('div.buy-img-info').length)
	{
		if( $$('div.buy-img-info').first().down('a.submit') )
		{
			$$('div.buy-img-info').first().down('a.submit').observe('click', function(e) {

				el = e.findElement('a');
				var cname = (el.className.indexOf('modallink-') != -1)?' '+get_classname(el, 'modallink-', 'modal-'):'';

				mod = window_factory( el, {iframe: true, className: 'modal'+cname} );
				mod.open();

				document.observe('modal:loaded', function() {

					el.next('form').target = 'modal-window-iframe';
					el.next('form').submit();

				}, false);

				e.stop();

			}, false);
		}
	}

	return true;
}

function urldecode( str ) {
    // Decodes URL-encoded string  
    // 
    // version: 907.503
    // discuss at: http://phpjs.org/functions/urldecode
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // +      input by: Ratheous
    // %          note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'

    var hash_map = {}, ret = str.toString(), unicodeStr='', hexEscStr='';

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The hash_map is identical to the one in urlencode.
    hash_map["'"]   = '%27';
    hash_map['(']   = '%28';
    hash_map[')']   = '%29';
    hash_map['*']   = '%2A';
    hash_map['~']   = '%7E';
    hash_map['!']   = '%21';
    hash_map['%20'] = '+';
    hash_map['\u00DC'] = '%DC';
    hash_map['\u00FC'] = '%FC';
    hash_map['\u00C4'] = '%D4';
    hash_map['\u00E4'] = '%E4';
    hash_map['\u00D6'] = '%D6';
    hash_map['\u00F6'] = '%F6';
    hash_map['\u00DF'] = '%DF';
    hash_map['\u20AC'] = '%80';
    hash_map['\u0081'] = '%81';
    hash_map['\u201A'] = '%82';
    hash_map['\u0192'] = '%83';
    hash_map['\u201E'] = '%84';
    hash_map['\u2026'] = '%85';
    hash_map['\u2020'] = '%86';
    hash_map['\u2021'] = '%87';
    hash_map['\u02C6'] = '%88';
    hash_map['\u2030'] = '%89';
    hash_map['\u0160'] = '%8A';
    hash_map['\u2039'] = '%8B';
    hash_map['\u0152'] = '%8C';
    hash_map['\u008D'] = '%8D';
    hash_map['\u017D'] = '%8E';
    hash_map['\u008F'] = '%8F';
    hash_map['\u0090'] = '%90';
    hash_map['\u2018'] = '%91';
    hash_map['\u2019'] = '%92';
    hash_map['\u201C'] = '%93';
    hash_map['\u201D'] = '%94';
    hash_map['\u2022'] = '%95';
    hash_map['\u2013'] = '%96';
    hash_map['\u2014'] = '%97';
    hash_map['\u02DC'] = '%98';
    hash_map['\u2122'] = '%99';
    hash_map['\u0161'] = '%9A';
    hash_map['\u203A'] = '%9B';
    hash_map['\u0153'] = '%9C';
    hash_map['\u009D'] = '%9D';
    hash_map['\u017E'] = '%9E';
    hash_map['\u0178'] = '%9F';

    for (unicodeStr in hash_map) {
        hexEscStr = hash_map[unicodeStr]; // Switch order when decoding
        ret = replacer(hexEscStr, unicodeStr, ret); // Custom replace. No regexing
    }

    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);

    return ret;
}

/* from SlideUp */
Effect.SlideLeftOut = function(element) {
	/*
	SlideLeftOut needs to have the content of the element wrapped in a container element with fixed width
	otherwise any text or images begin to wrap in stange ways!
	*/
	element = $(element).cleanWhitespace();
	return new Effect.Scale(element, window.opera ? 0 : 1,
		Object.extend({ 
			scaleContent: false, 
			scaleY: false, 
			scaleMode: 'box',
			scaleFrom: 100,
			restoreAfterFinish: true,
			beforeStartInternal: function(effect) {
				effect.element.makePositioned();
				effect.element.down().makePositioned();
				if(window.opera) effect.element.setStyle({left: ''});
				effect.element.makeClipping().show();
			},  
			afterUpdateInternal: function(effect) {
				effect.element.down().setStyle(
					{right: (effect.dims[1] - effect.element.clientWidth) + 'px' }
				);
			},
			afterFinishInternal: function(effect) {
				effect.element.hide().undoClipping().undoPositioned();
				effect.element.down().undoPositioned();
			}
		}, arguments[1] || {})
	);
}


/* from SlideDown */
Effect.SlideRightIn = function(element) {
	/*
	SlideRightIn needs to have the content of the element wrapped in a container element with fixed width!
	*/
	element = $(element).cleanWhitespace();
	var elementDimensions = element.getDimensions();
	return new Effect.Scale(element, 100, 
		Object.extend({ 
			scaleContent: false, 
			scaleY: false, 
			scaleFrom: window.opera ? 0 : 1,
			scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
			restoreAfterFinish: true,
			afterSetup: function(effect) {
				effect.element.makePositioned();
				effect.element.down().makePositioned();
				if(window.opera) effect.element.setStyle({left: ''});
				effect.element.makeClipping().setStyle({width: '0px'}).show(); 
			},
			afterUpdateInternal: function(effect) {
				effect.element.down().setStyle({right: (effect.dims[1] - effect.element.clientWidth) + 'px' }); 
			},
			afterFinishInternal: function(effect) {
				effect.element.undoClipping().undoPositioned();
				effect.element.down().undoPositioned();
			}
		}, arguments[1] || {})
	);
}

var open_login = function( ev )
{
	var el = ev.element();
	if(el.id == 'refine-search')
	{
		return false;
	}
	// stop_observe_login();
	// $('main-body').fade({ duration: 0.3, to:0.1});
	new Effect.SlideRightIn('refine-search', 
		{ 
			scaleContent: false,
			duration: 0.2,
			afterFinish: function() {
				observe_login( 'open' );
			} 
		}
	);

	if($('search-help-popup'))
	{
		$('search-help-popup').hide();
	}
	
	if( $('refine-search-button') )
	{
		$('refine-search-button').stopObserving('click');
		$('refine-search-button').observe('click', close_login);
	}

	ev.stop();
} 

var close_login_check = function( ev )
{
	if(mouse_within('refine-search', ev)) { return; }
	close_login( ev );
}

var close_login = function( ev )
{
	// stop_observe_login();
	// $('main-body').fade({ duration: 0.3, to:1});
	new Effect.SlideLeftOut('refine-search', 
		{ 
			scaleContent: false,
			duration: 0.2,
			afterFinish: function() {
				observe_login( 'closed' );
			} 
		}
	);

	if($('search-help-popup'))
	{
		$('search-help-popup').hide();
	}
	
	if( $('refine-search-button') )
	{
		$('refine-search-button').stopObserving('click');
		$('refine-search-button').observe('click', open_login)
	}

	ev.stop();
}

var mouse_within = function( el, ev )
{
	var d = $(el).cumulativeOffset();
	var right = d.left + $(el).getWidth();
	var bottom = d.top + $(el).getHeight();

	return (Event.pointerX( ev ) > d.left && Event.pointerX( ev ) < right && Event.pointerY( ev ) > d.top && Event.pointerY( ev ) < bottom);
}

var stop_observe_login = function()
{
	if( $('refine-search') )
	{
		$('refine-search').stopObserving('click');
	}
}

var observe_login = function( arg )
{
	if( $('refine-search-tab'))
	{
		if(arg!='open') { $('refine-search-tab').observe('click', open_login, false ); }
		if(arg!='closed') { $('refine-search-exit').observe('click', close_login, false ); }
	}
}

var initRefineSearch = function()
{
	if( $('refine-search') )
	{
		observe_login('closed');
	}
	
	if( $('refine-search-button') )
	{
		$('refine-search-button').observe('click', open_login)
	}
}

var initRating = function()
{
	$$('.rating-comments').each( function(el) {
		var ida = el.id.split('-');
		var id = ida[ida.length-1];
		
		new Ajax.InPlaceEditor( el.id, '/rate/comments/'+id , {highlightcolor: '#333'});
	} );
	
	$$('.rating-matching').each( function(el) {
		el.observe( 'click', function( e ) {

			elem = e.element();
			if(elem.tagName!='A') { elem = elem.up('a'); }
			
			var ida = elem.id.split('-');
			var id = ida[ida.length-1];

			new Ajax.Updater( elem.id, '/rate/matching/'+id );
			
			e.stop();
			
		}, false );
	} );
}

var initSliders = function()
{
	if($('handle0') && $('handle1') && $('handle2') && $('handle3'))
	{
		window.temporal_slider = new Control.Slider('handle0','track0', {axis:'horizontal', range: $R(2,90), sliderValue: 90 });
		
		window.distance_slider = new Control.Slider('handle1','track1', {axis:'horizontal', range: $R(1,50), sliderValue: 30 });
		
		var handles = [$('handle2'), $('handle3')]
		var values = [18, 80]; // First handle at 0, 2nd at 100
		
		window.age_slider = new Control.Slider(handles,'track2', 
									{
										axis:'horizontal',
										range: $R(0,80),
										sliderValue: values,
										restricted:true
									}
								);
		window.temporal_slider.options.onSlide = function(value){ $('slider-temporal').value = parseInt(value); };
		window.distance_slider.options.onSlide = function(value){ $('slider-distance').value = parseInt(value); };
		window.age_slider.options.onSlide = function(value)
		{ 
			if(parseInt(value[0]) < 18)
			{ 
				window.age_slider.setValue(18, 0);
			}
			$('slider-min-age').value = parseInt(value[0]); 
			$('slider-max-age').value = parseInt(value[1]);
		};

		$('slider-temporal').value = window.temporal_slider.value;
		$('slider-distance').value = window.distance_slider.value;
		$('slider-min-age').value = 18;
		$('slider-max-age').value = 80;
	}
}

var initSignIn = function()
{
	if($('sign-in'))
	{
		$('sign-in').observe('click', function(e){
			
				$('sign-in').removeClassName('open');
				$('sign-in').addClassName('closed');			
				$('login-details').removeClassName('closed');
				$('login-details').addClassName('open');
				
				$('xauth_login-identity').focus();
				
				e.stop();

		}, false);
	}
	
	if($$('.warning').length)
	{
		$('sign-in').removeClassName('open');
		$('sign-in').addClassName('closed');			
		$('login-details').removeClassName('closed');
		$('login-details').addClassName('open');
		
		$('login-details-inner').setStyle( { height: '70px' } );
		
		$('xauth_login-identity').focus();
		$$('.warning').each( function(el) {el.hide()} );
	}
}

var initMouseEvents = function()
{
	$$('.home-question').each(
		function(el) {
			el.observe('mouseover', mouseEvent, false);
			el.observe('mouseout', mouseEvent, false);
		}
	);
	
	if($('help-popup'))
	{
		$('help-popup').hide();
	}
	
	if($('help1'))
	{
		$('help1').observe('mouseover', function() { $('help-popup').show(); }, false);
		$('help1').observe('mouseout', function() { $('help-popup').hide(); }, false);		
	}
	
	if($('help2') && $('search-help-popup'))
	{		
		$('search-help-popup').hide();
		
		$('help2').observe('mouseover', function() {	$('search-help-popup').show(); }, false);
		$('help2').observe('mouseout', function() { $('search-help-popup').hide(); } , false);
	}
	
	if($('event-info-box'))
	{
		$('event-info-box').hide();
	}
		
	// $$('.event-link').each(
	// 	function(el) {
	// 		el.observe('click', showEventInfo, false);
	// 	}
	// );
}



var showEventInfo = function(e)
{	
	var elem = e.findElement('a');

	var iframe = '<iframe name="eventinfo" id="eventinfo" src="'+elem.href+'" height="100%" width="100%" scrolling="yes"></iframe>';
	$('event-info-box-inner').update( iframe );
	$('event-info-box').show();
		// 
		// window.location.hash = 'move';
		// window.location.hash = '';
	
	e.stop();
}

var mouseEvent = function( e )
{
	var elem = e.element();
	if(elem.tagName != 'A') { elem = elem.up('a'); }

	elem.toggleClassName('white');
	elem.toggleClassName('blue');
	
	e.stop();
}

var autocomplete = function()
{
	if($('search') && $('autocomplete_choices'))
	{
		new Ajax.Autocompleter("search", "autocomplete_choices", "/postcodes/autocomplete", {});
	}
	
	if($('username'))
	{
		$('username').observe('keyup', function( e ) {
			new Ajax.Request('/usernames/check', {
				method: 'post',
				parameters: { 'username': $F('username') },
				onSuccess: function(transport) {
					if (transport.responseText==1)
					{
						$('username_choices').update('available');
					}
					else
					{
						$('username_choices').update('not available');
					}
				}
			});
			
			// /usernames/check
		}, false );
	}
}                                            

var mod; 

var get_classname = function( el, f, r )
{
	var tmp = el.className.substring( el.className.indexOf(f) );
	return tmp.split(' ')[0].replace( f, r );
}

var modal_window = function(){
	$$('.LP_lightwindow').each( function(el) {
		el.stopObserving('click');
		el.observe('click', function( e ) {
			var cname = (el.className.indexOf('modallink-') != -1)?' '+get_classname(el, 'modallink-', 'modal-'):'';
			
			mod = window_factory( el, {iframe: true, className: 'modal'+cname} );
			mod.open();
			
			e.stop();
		}, false);
	});
}

var window_factory = function(container,options) {  
	var h = document.viewport.getHeight() - 150;
	var window_fade = $('control_overlay');
	
    var window_header = new Element('div',{  
        className: 'window_header'  
    });                                     
    var window_close = new Element('div',{  
        className: 'window_close'  
    });                                    
    var window_contents = new Element('div',{  
        className: 'window_contents'  
    });

	if(options.className)
	{
		if(options.className.indexOf('modal-mailing') != -1) 		{ window_contents.style.height = Math.min((h-50), 370) + 'px'; }
		if(options.className.indexOf('modal-eventinfo') != -1) 		{ window_contents.style.height = Math.min((h-50), 420) + 'px'; }
		if(options.className.indexOf('modal-login') != -1) 			{ window_contents.style.height = Math.min((h-50), 520) + 'px'; }
		if(options.className.indexOf('modal-profilepic') != -1) 	{ window_contents.style.height = Math.min((h-50), 260) + 'px'; }
		if(options.className.indexOf('modal-cardrepeat') != -1) 	{ window_contents.style.height = Math.min((h-50), 180) + 'px'; }
		if(options.className.indexOf('modal-profileinfo') != -1) 	{ window_contents.style.height = Math.min((h-50), 320) + 'px'; }
	}

	var window_loading = new Element('div',{
		className: 'window_loading'
	});
	
	
    var w = new Control.Modal(container,Object.extend({  
        className: 'modal',
  		fade: true,
		height: h,
		overlayOpacity: 0.75,
   		closeOnClick: window_fade,
        insertRemoteContentAt: window_contents,
		onRemoteContentLoaded: function() {
			document.fire('modal:loaded');
		},
  		afterClose: function() { 
			var id = this.container.id;
			this.destroy();
			if($(id))
			{
				$(id).remove();
			}
		},
		indicator: window_loading
    },options || {}));  
	w.container.insert(window_loading);
    w.container.insert(window_header);   
    window_header.insert(window_close);                                                                 
    w.container.insert(window_contents);
  	window_close.observe('click', function(e){
	    Control.Modal.close();
		e.stop();
	}, false);
    return w;  
};

function lw_closed () {
	new Ajax.Request('/user/state', {
		method: 'get',
		onSuccess: function(transport) {
			if (transport.responseText.replace(/[^0-9]/, '') == '1') { document.fire('user:loggedin'); }
		}
	});
}

function lwcloser()
{
	Control.Modal.close();
	document.fire('lw:closed');
}
var form_link_submit = function(){

	$$('form a.submit').each( function(el) 
	{
		el.stopObserving('click');
		el.observe('click', function(e)
		{
			e.stop();
			var frm = e.element().up('form');
			if (frm.hasClassName('popup-form')) 
			{
				document.stopObserving('modal:loaded');
				document.observe('modal:loaded', function() {
					frm.target = "modal-window-iframe";
					frm.submit();
				}, false );

				mod = window_factory( '/loading.html', {iframe: true, className: 'modal modal-form'} );
				mod.open();
			}
			else
			{
				frm.submit();
			}
			
		});
	});	
}

var initSavedSearch = function()
{
	if($('savedsearches'))
		$('savedsearches').observe('change', loadSavedSearch);
}

var loadSavedSearch = function(event)
{
	var ssid = $('savedsearches').childElements()[$('savedsearches').selectedIndex].id;
	
	var ss = window.savedsearches[ssid];
	
	if(!ss)
		return;
	
	$$('#refine-search #postcode')[0].value = ss.postcode;	// Need to do it this way as there are two <div>'s with id = 'postcode'
	
	window.temporal_slider.setValue(ss.temporal);
	$('slider-temporal').value = window.temporal_slider.value;
	
	window.distance_slider.setValue(ss.distance);
	$('slider-distance').value = window.distance_slider.value;
	
	window.age_slider.setValue(ss.agemin, 0);
	window.age_slider.setValue(ss.agemax, 1);
	$('slider-min-age').value = ss.agemin;
	$('slider-max-age').value = ss.agemax;
}

function externalLinks() { $$('a').each( function(el) { if(el.getAttribute("href") && el.getAttribute("rel") == "external") { el.target="_blank"; } } ); }
function internalLinks() { $$('a').each( function(el) { if(el.getAttribute("href") && el.getAttribute("rel") == "internal") { el.target="_self"; } } ); }

document.observe('dom:loaded', appscripts);

document.observe('dom:loaded', form_link_submit);
// document.observe('dom:loaded', autocomplete);
document.observe('dom:loaded', externalLinks);
document.observe('dom:loaded', internalLinks);
document.observe('dom:loaded', initSignIn);
document.observe('dom:loaded', initMouseEvents);
document.observe('dom:loaded', initRating);
document.observe('dom:loaded', initSliders);
document.observe('dom:loaded', initRefineSearch);                                   
document.observe('dom:loaded', modal_window);
document.observe('dom:loaded', initSavedSearch);
document.observe('lw:closed', lw_closed);
document.observe('search-tab:load', initRefineSearch);