/* SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: http://www.opensource.org/licenses/mit-license.php */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;var currentPosition;
var currentVolume; 
var currentItem;
var totalTime;
var timer;
var actualTimeMinutes = 0;
var actualTimeSecondes = 0;        
var progressDragged = 0;   
var volumeDragged = 0;
var playerStatus = 0;  
var volume_axis = 0;
var so = new SWFObject("/swf/BAOMplayer.swf", "mpl", "364", "273", "7");
so.addVariable("autostart", "true");  
so.addVariable("displayheight", "273");    
so.addVariable("height", "273");   
so.addParam("wmode", "transparent");
so.write("mpl_flash");               
document.observe('dom:loaded', function() {   
	Event.observe($('mpl_play_button'), 'mousedown',function(e){sendEvent('playpause');} );
	$('mpl_play_button').onclick= function(){return false;};
	$('mpl_play_button').style.outline = 0;
	var progressSlider = new Control.Slider('mpl_track_progress_current','mpl_track_progress_total',{
	      onSlide:function(v){
			progressDragged = 1;
			$('mpl_track_progress_current').addClassName('dragged');
		  },
	      onChange:function(v){
			progressDragged = 1;
			sendEvent('scrub',parseInt(v*totalTime));
			$('mpl_track_progress_current').removeClassName('dragged');
			progressDragged = 0 ;
		  }
	});           
volume_axis = ($('mpl_volume_bar').getHeight() > $('mpl_volume_bar').getWidth()) ? 'vertical' :  'horizontal';  
var volumeSlider = new Control.Slider('mpl_volume_current','mpl_volume_bar',{    
		axis: volume_axis, 
	      onSlide:function(v){
			volume_event(v);
			$('mpl_volume_current').addClassName('dragged');
		  },
	      onChange:function(v){                                        
			volume_event(v);
			volumeDragged = 0;
			$('mpl_volume_current').removeClassName('dragged');          
		  }
	});
       
}); 
var volume_event = function(v){
	volumeDragged = 1;                
	var volumeLevel = (volume_axis == 'vertical') ? $('mpl_volume_bar').getHeight() - parseInt(v*$('mpl_volume_bar').getHeight()) : parseInt(v*$('mpl_volume_bar').getWidth()); 
	sendEvent('volume',parseInt(((volume_axis == 'vertical') ? 1.01-v : 0.01+v )*100));
	if(volume_axis == 'vertical'){
		$('mpl_volume_level').setStyle({height:volumeLevel + 'px'});  
	}else{	
		$('mpl_volume_level').setStyle({width:volumeLevel + 'px'});
	}
};
var sendEvent = function(typ,prm) {
	 $("mpl").sendEvent(typ,prm);
};
var getUpdate = function(typ,pr1,pr2,pid) {
if(pid!="flashVideo"){
	if(typ == "time") { 
		currentPosition = pr1; 
		totalTime = pr1+pr2;   
		var minutes, seconds;
	   if($('mpl_track_time_total').innerHTML == "" || $('mpl_track_time_total').innerHTML == "0:00"){ 
	   minutes = parseInt((pr1+pr2) / 60);
	   seconds = parseInt((pr1+pr2) % 60);
       
	   if (seconds < 10){ seconds = '0' + seconds.toString(); }; 
	   if (minutes < 1 ) { minutes = '0'; };
       
	   $('mpl_track_time_total').innerHTML = minutes + ':' + seconds;
       }; 
		minutes = parseInt(pr1 / 60);
		seconds = parseInt(pr1 % 60);
        
		if (seconds < 10){ seconds = '0' + seconds.toString(); }; 
		if (minutes < 1 ) { minutes = '0'; }; 
        
		$('mpl_track_time_elapsed').innerHTML = minutes + ':' + seconds;
        
		minutes = parseInt(pr2 / 60);
		seconds = parseInt(pr2 % 60);
		
		if(progressDragged === 0){
			var trackProgressCurrentSpace = $('mpl_track_progress_total').getWidth()-$('mpl_track_progress_current').getWidth();
			var trackProgressCurrentLeft = (currentPosition*$('mpl_track_progress_total').getWidth())/totalTime;
			if(trackProgressCurrentLeft>trackProgressCurrentSpace) trackProgressCurrentLeft = trackProgressCurrentSpace;     
			$('mpl_track_progress_current').morph('left:' + trackProgressCurrentLeft + 'px;',{duration:0.3,queue: {position:'end', scope: 'mplProgress'}});
		};   
		if(pr1===0 && template_id < 25) { setTimeout("event_handler.player_hit_sweet_spot()",6000) };
	}else if(typ == "state") {                       
		if(pr1 == 0){                               
			$('mpl_play_button').setAttribute("class","paused");
			$('mpl_play_button').setAttribute("className","paused");     
		} else if(pr1 ==1){                         
			$('mpl_play_button').setAttribute("class","loading");
			$('mpl_play_button').setAttribute("className","loading");    
		} else if(pr1 == 2){                                 
			$('mpl_play_button').setAttribute("class","playing");
			$('mpl_play_button').setAttribute("className","playing");    
		} else if(pr1 == 3){                             
			$('mpl_play_button').setAttribute("class","paused");
			$('mpl_play_button').setAttribute("className","paused"); 
		};
		playerStatus = pr1;
		if(mpl_ticker_timeout){
			if(pr1 != 2){
				mpl_ticker_stop()
			}else{
				mpl_ticker()
			}
		}                                                                                                                
	}else if(typ == "volume") { 
		currentVolume = pr1;                                                                                       
		if(volumeDragged === 0){
	    	var volumeLevel = (volume_axis == 'vertical') ? 
						parseInt(pr1*$('mpl_volume_bar').getHeight()/100) 
							:
						parseInt(pr1*$('mpl_volume_bar').getWidth()/100);   
			var volumeCurrent = (volume_axis == 'vertical') ? 
						($('mpl_volume_bar').getHeight() - parseInt(pr1*$('mpl_volume_bar').getHeight()/100))
							:
					    (parseInt(pr1*$('mpl_volume_bar').getWidth()/100) - $('mpl_volume_current').getWidth());
					if(volumeCurrent<0) volumeCurrent=0;    
			if(volume_axis == 'vertical'){
				$('mpl_volume_current').setStyle({top:volumeCurrent + 'px'});
				$('mpl_volume_level').setStyle({height:volumeLevel + 'px'});
			} else {
			    $('mpl_volume_current').setStyle({left:volumeCurrent + 'px'});
			    $('mpl_volume_level').setStyle({width:volumeLevel + 'px'});
			}
		} 
	} else if (typ == "load") {
		var available_loading_width = $('mpl_track_loading_container').getWidth() - ($('mpl_track_loading_left').getWidth() + $('mpl_track_loading_right').getWidth());                                                            
	    var loading_width = (pr1*available_loading_width)/100;
	$('mpl_track_loading').morph("width:"+loading_width+"px",{queue: {position:'end', scope: 'mplLoading'}});                                                      
	} else if (typ == "item") { 
		lastItem = currentItem;
		currentItem = pr1; getItemData(pr1);
		var infos = $("mpl").itemData(pr1); 
		$('mpl_song_title').innerHTML = infos.title;
		$('mpl_author_name').innerHTML = infos.author;
	};
	var id = $(typ);
	id.innerHTML = typ+ ": "+Math.round(pr1);
	pr2 == undefined ? null: id.innerHTML += ", "+Math.round(pr2);
	if(pid != "null") {
		$("pid").innerHTML = "(received from the player with id <i>"+pid+"</i>)";
}	}
};

// These functions are caught by the feeder object of the player.
function loadFile(obj) { $("mpl").loadFile(obj); };  
function getItemData(idx) {
	var obj = $("mpl").itemData(idx);
	var nodes = "";
	for(var i in obj) { 
		nodes += "<li>"+i+": "+obj[i]+"</li>"; 
	}
};
var event_handler = {
	player_hit_sweet_spot: function() {
		mpl_interactions.load_next_interaction();
	}
};
var mpl_ticker = function(){
    var element_left = parseInt($("mpl_now_playing").getStyle('left'));
 	var element_width = parseInt($("mpl_now_playing").getWidth()/2);
    if(element_left == element_width - (2*element_width)){ 
	    new Effect.Move($("mpl_now_playing"),{duration:0, x: 0, y: 0, mode: 'absolute'}); 
	}else{ 
		 new Effect.Move($("mpl_now_playing"),{duration:0, x: -1, y: 0, mode: 'relative'});
   	};                                                          
     
    if(mpl_ticker_timeout) mpl_ticker_timeout = setTimeout('mpl_ticker();',50);
};
var mpl_ticker_stop = function(){
	window.clearTimeout(mpl_ticker_timeout); 
};        
var mpl_pause_playing = function(){
	// $("player").style.display = "none";
	// Event.observe('lBox_close',"click",function(){$("player").style.display = "block"; });
	if (playerStatus === 2 ) {
		$('mpl').sendEvent('playpause');                                                                      
		if($('lBox_close')) Event.observe('lBox_close',"click",function(){$('mpl').sendEvent('playpause'); });
		if($('lBox_overlay')) Event.observe('lBox_overlay',"click",function(){$('mpl').sendEvent('playpause'); });
	} 
};/*
Media Player Interactions
-------------------------
Author: Brian Edmonds <b.edmonds@bedmonds.net>
Date: Sunday, July 15th, 2007

History
-------
David Esteves on August 22th, 2007
 - converted : const MPL_INTERACTIONS_REQUEST_INTERVAL by var MPL_INTERACTIONS_REQUEST_INTERVAL
			for backward compatiblity 
 - added language conditions for languages
 - added return false to add and remove friends links 

Brian Edmonds on August 7th, 2007:
-	Added mpl_effects to handle aesthetics.

-	Modified the way interaction requests were made. There is now a lock in place to prevent "doubles."
	Lock is currently set to 2 seconds, we'll see if we have to change it or not.
	
	We really need to fix that double-request bug, though.

-	With the current aesthetic mechanics, the interaction frame is not shown if it has no content.
	This is also known as the "No Bottom Lump Effect"

*	Note: sharing.add_invitation_fields: inserts a <br /> to patch a CSS issue I had no time to look into.
		  CSS is overdue for a complete overhaul anyway.
*	Note: Review this file, it's getting too messy. Do we really need "#module#.load_module" syntax ?
*	Note: Yes, I do write anything in these things. 

Brian Edmonds on August 17th, 2007:
-	Removed /module/.load_module() syntax. Interactions now follow a predefined order through the 
	interactions stack. The stack is mutable by the application. Allowing any type of interaction order
	you could ever dream of, and then some.

-	Added the ability to provide additional functionality to the request_started and request_completed 
	methods through two new events: mpl_interactions.on_request_started() and 
	mpl_interactions.on_request_completed(), allowing easy customization of visual effects, or anything 
	else, really.

*	Note: Should move mpl_effects to another location, it doesn't really make sense in here.
		  Neither do *sharing.add_invitation_fields and remove_invitation_fields. They should 
		  go into UI methods.

*	Proposal: Rewrite mpl_interactions and mpl_effects to be more modular, allowing dynamic IDs for "message"
			  and "interactions", could allow for code reuse in a sexy new admin module.
*/

var MPL_INTERACTIONS_REQUEST_INTERVAL = 900;	// Number of miliseconds before unlocking interaction handler.

var interaction_stack = new Array("registering", "sharing", "downloading", "starting");
//var interaction_light_box = new lBox('interac');     

var mpl_interactions = {
	version: "2.0.0",
	is_handling_request: false,
	current_interaction_has_no_frame: false,
	load_next_interaction: function() {  
		if ( !mpl_interactions.is_handling_request ) {
			var module = interaction_stack.pop();
			if ( module ) {
				mpl_interactions.interaction_request( module )
			} else {
				mpl_effects.hide_interaction_elements()
			}
		}
	},
	
	parse_interaction_response: function(serverResponse){
		var json = eval(serverResponse.responseText);
		$("message").update(json.message);
		$("mpl_interactions").update(json.interaction);
        mpl_effects.rewrite_lightboxes($('mpl_interactions'));
		mpl_interactions.current_interaction_has_no_frame = (json.interaction == '' ? true : false);
		
	},
	
	request_started: function(){
		mpl_interactions.is_handling_request = true;
		mpl_interactions.on_request_started();
	},
	
	request_completed: function(){
		setTimeout(mpl_interactions.on_request_completed,900);
		setTimeout('mpl_interactions.is_handling_request = false;',MPL_INTERACTIONS_REQUEST_INTERVAL);
	},
	
	on_request_started: function() {
		mpl_effects.hide_interaction_elements();
	},
	
	on_request_completed: function() {
		mpl_effects.show_interaction_elements();
	},
	
	sharing: {
		/* BEdmonds: I wrote this and I hate it. I feel for you, mate. */
		add_new_invitation_fields: function(name_value, email_value) {
			var legend, link, text, email, name, num_invitations, label, item, list, fieldset;
			name_value = name_value ? name_value : '';
			email_value = email_value ? email_value : '';
			
			num_invitations = parseInt( $( 'invitations_count' ).value );
			num_invitations++;
			$('invitations_count').value = num_invitations.toString();
			
			
			// fieldset = document.createElement('fieldset');
			// 			fieldset.className = ( num_invitations % 2 == 0 ? 'friend_field' : 'friend_field alternate' );
			// 			fieldset.id = 'invitation_fieldset_' + num_invitations.toString();
			 			
			
			
			list = document.createElement('ul');
			list.className = ( num_invitations % 2 == 0 ? 'friend_field alternate' : 'friend_field' ); 
			list.id = 'invitation_fieldset_' + num_invitations.toString();// Invitation name
				item	= document.createElement('li');
				item.className = "name_line";
				
				label	= document.createElement('label');
				name	= document.createElement('input');
				text	= document.createTextNode((lang == 'en') ? 'Name' : 'Nom');
				
				name.id = 'name_field_' + num_invitations.toString();
				name.name = 'member[' + num_invitations.toString() + '][name]';
				name.className = 'invitation_name';
				name.type = "text";
				name.value = name_value;
				
				label.appendChild(text);
				item.appendChild(label);
				item.appendChild(name);
				
				list.appendChild(item);
			
			// Invitation e-mail address
				item	= document.createElement('li');
				item.className = "email_line";
				label	= document.createElement('label');
				email	= document.createElement('input');
				text	= document.createTextNode((lang == 'en') ? 'E-mail' : 'Courriel');
				
				email.id = 'email_field_' + num_invitations.toString();
				email.name = 'member[' + num_invitations.toString() + '][email]';
				email.type = "text";
				email.value = email_value;
				
				label.appendChild(text);
				item.appendChild(label);
				item.appendChild(email);
				
				list.appendChild(item);
			    
				item	= document.createElement('li');
				item.className = "supr_line";
				
				
				link = document.createElement('a');
				text = document.createTextNode((lang == 'en') ? 'Remove this e-mail' : 'Supprimer ce courriel');

				link.className = 'button';
				link.href = '#';
				link.onclick = function(){ mpl_interactions.sharing.remove_invitation_fields(list.id);return false; };
				link.appendChild(text);
				
				
				item.appendChild(link);
			// Finalize
			// fieldset.appendChild(list);
			// 			fieldset.appendChild(link);   
			list.appendChild(item);
			
			list_end	= document.createElement('li');
			list_end.className = "list_end";    
		    list.appendChild(list_end);
		
			$("invitation_fieldset").insert(list);
			new Effect.Pulsate($(list.id),{duration:0.8,pulses:1});
			$("share_frame").scrollTop = $(list.id).offsetTop;
			if($(LBOX_WINDOW_ID)) lBoxes.recenter.delay(300);
			//$('invitation_form').insertBefore(list,$('add_friend') );
		},
		
		remove_invitation_fields: function(fieldset) {
			while($(fieldset).firstChild) {
				$(fieldset).removeChild( $(fieldset).firstChild );
			};
		
			$(fieldset).parentNode.removeChild( $(fieldset) );
		},
		
		parse_server_response: function(serverResponse) {
			var json = eval(serverResponse.responseText);
			
			if (json.is_successful == true) {
				lBoxes.close();
				mpl_interactions.load_next_interaction();
			} else {
				$('share_error').innerHTML = json.failure_message;
				Effect.Appear('share_error', {duration:0.5});
			}
		}
	},
	
	commenting: {
		parse_server_response: function(serverResponse) {
			var json = eval(serverResponse.responseText);
			
			if (json.is_successful == true) {
				RedBox.close();
				mpl_interactions.load_next_interaction();
			} else {
				$('comment_errors').innerHTML = json.failure_message;
				Effect.Appear('comment_errors', {duration:0.5});
			}
		}
	},
	
	interaction_request: function(module){
		if (!mpl_interactions.is_handling_request) {
			mpl_interactions.request_started();
			new Ajax.Request('/interactions/render_' + module, {onSuccess:interactionHandler});
			
		}
	}
};


/*
	I used the seperate functions instead of Toggle to prevent display bugs.
	Toggle has a tendancy to mess up if it happens too rapidly.
*/
var mpl_effects = {
	version: '1.0.0',
	
	hide_interaction_elements: function() {
		Effect.Fade('message',{duration:0.4});
		Effect.Fade('interaction',{duration:0.4});
	},
	
	show_interaction_elements: function() {
		Effect.Appear('message',{duration:0.5});
		if (!mpl_interactions.current_interaction_has_no_frame) {
			Effect.Appear('interaction',{duration:0.5});
		}
	},
	
	rewrite_lightboxes: function(fragment) {
		lBoxes.parse_document_fragment(fragment);
	}
};

var interactionHandler = function(serverResponse){
	setTimeout(function(){
		mpl_interactions.parse_interaction_response(serverResponse);
		mpl_interactions.request_completed();
		},3000); 
	
};/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
* 
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* 
*/
var Validator = Class.create();

Validator.prototype = {
	initialize : function(className, error, test, options) {
		if(typeof test == 'function'){
			this.options = $H(options);
			this._test = test;
		} else {
			this.options = $H(test);
			this._test = function(){return true};
		};
		this.error = error || 'Validation failed.';
		this.className = className;
	},
	test : function(v, elm) {
		return (this._test(v,elm) && this.options.all(function(p){
			return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
		}));
	}
};
Validator.methods = {
	pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
	minLength : function(v,elm,opt) {return v.length >= opt},
	maxLength : function(v,elm,opt) {return v.length <= opt},
	min : function(v,elm,opt) {return v >= parseFloat(opt)}, 
	max : function(v,elm,opt) {return v <= parseFloat(opt)},
	notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
		return v != value;
	})},
	oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
		return v == value;
	})},
	is : function(v,elm,opt) {return v == opt},
	isNot : function(v,elm,opt) {return v != opt},
	equalToField : function(v,elm,opt) {return v == $F(opt)},
	notEqualToField : function(v,elm,opt) {return v != $F(opt)},
	include : function(v,elm,opt) {return $A(opt).all(function(value) {
		return Validation.get(value).test(v,elm);
	})}
};

var Validation = Class.create();

Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			onSubmit : true,
			stopOnFirst : false,
			immediate : false,
			focusOnError : true,
			useTitles : false,
			onFormValidate : function(result, form) {},
			onElementValidate : function(result, elm) {}
		}, options || {});
		this.form = $(form);
		if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		if(this.options.immediate) {
			var useTitles = this.options.useTitles;
			var callback = this.options.onElementValidate;
			Form.getElements(this.form).each(function(input) { // Thanks Mike!
				Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback}); });
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) Event.stop(ev);
	},
	validate : function() {
		var result = false;
		var useTitles = this.options.useTitles;
		var callback = this.options.onElementValidate;
		if(this.options.stopOnFirst) {
			result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
		} else {
			result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
		};
		if(!result && this.options.focusOnError) {
			Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
		};
		this.options.onFormValidate(result, this.form);
		return result;
	},
	reset : function() {
		Form.getElements(this.form).each(Validation.reset);
	}
};

Object.extend(Validation, {
	validate : function(elm, options){
		options = Object.extend({
			useTitle : false,
			onElementValidate : function(result, elm) {}
		}, options || {});
		elm = $(elm);
		var cn = elm.classNames();
		return result = cn.all(function(value) {
			var test = Validation.test(value,elm,options.useTitle);
			options.onElementValidate(test, elm);
			return test;
		});
	},
	test : function(name, elm, useTitle) {
		var v = Validation.get(name);
		var prop = '__advice'+name.camelize();
		try {
		if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
			if(!elm[prop]) {
				var advice = Validation.getAdvice(name, elm);
				if(advice == null) {
					var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
					advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>';
					switch (elm.type.toLowerCase()) {
						case 'checkbox':
						case 'radio':
							var p = elm.parentNode;
							if(p) {
								new Insertion.Bottom(p, advice);
							} else {
								new Insertion.After(elm, advice);
							};
							break;
						default:
							new Insertion.After(elm, advice);
				    };
					advice = Validation.getAdvice(name, elm);
				};
				if(typeof Effect == 'undefined') {
					advice.style.display = 'block';
				} else {
					new Effect.Appear(advice, {duration : 1 });
				}
			};
			elm[prop] = true;
			elm.removeClassName('validation-passed');
			elm.addClassName('validation-failed');
			return false;
		} else {
			var advice = Validation.getAdvice(name, elm);
			if(advice != null) advice.hide();
			elm[prop] = '';
			elm.removeClassName('validation-failed');
			elm.addClassName('validation-passed');
			return true;
		}
		} catch(e) {
			throw(e)
		}
	},
	isVisible : function(elm) {
		while(elm.tagName != 'BODY') {
			if(!$(elm).visible()) return false;
			elm = elm.parentNode;
		};
		return true;
	},
	getAdvice : function(name, elm) {
		return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
	},
	getElmID : function(elm) {
		return elm.id ? elm.id : elm.name;
	},
	reset : function(elm) {
		elm = $(elm);
		var cn = elm.classNames();
		cn.each(function(value) {
			var prop = '__advice'+value.camelize();
			if(elm[prop]) {
				var advice = Validation.getAdvice(value, elm);
				advice.hide();
				elm[prop] = '';
			};
			elm.removeClassName('validation-failed');
			elm.removeClassName('validation-passed');
		});
	},
	add : function(className, error, test, options) {
		var nv = {};
		nv[className] = new Validator(className, error, test, options);
		Object.extend(Validation.methods, nv);
	},
	addAllThese : function(validators) {
		var nv = {};
		$A(validators).each(function(value) {
				nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
			});
		Object.extend(Validation.methods, nv);
	},
	get : function(name) {
		return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
	},
	methods : {
		'_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
	}
});

Validation.add('IsEmpty', '', function(v) {
				return  ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
			});

Validation.addAllThese([
	['required', 'This is a required field.', function(v) {
				return !Validation.get('IsEmpty').test(v);
			}],
	['validate-number', 'Please enter a valid number in this field.', function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
			}],
	['validate-digits', 'Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	['validate-alpha', 'Please use letters only (a-z) in this field.', function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	['validate-alphanum', 'Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/\W/.test(v)
			}],
	['validate-date', 'Please enter a valid date.', function(v) {
				var test = new Date(v);
				return Validation.get('IsEmpty').test(v) || !isNaN(test);
			}],
	['validate-email', 'Please enter a valid email address. For example fred@domain.com .', function (v) {
				return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
			}],
	['validate-url', 'Please enter a valid URL.', function (v) {
				return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			}],
	['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(v)) return false;
				var d = new Date(v.replace(regex, '$2/$1/$3'));
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && 
							(parseInt(RegExp.$1, 10) == d.getDate()) && 
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
			}],
	['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00 .', function(v) {
				// [$]1[##][,###]+[.##]
				// [$]1###+[.##]
				// [$]0.##
				// [$].##
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			}],
	['validate-selection', 'Please make a selection', function(v,elm){
				return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
			}],
	['validate-one-required', 'Please select one of the above options.', function (v,elm) {
				var p = elm.parentNode;
				var options = p.getElementsByTagName('INPUT');
				return $A(options).any(function(elm) {
					return $F(elm);
				});
			}]
]);