/******************************************************************************
 * Fonctions JS TNG-Lyon.fr
 ******************************************************************************/


/*
 * Debug raccourci
 */
function cl () {
	if(typeof console == "undefined") return ;
	$A(arguments).each(function (a) {
		console.log(a)
    });
}

/*
 * Debug raccourci
 */
function cd () {
	if(typeof console == "undefined") return ;
	$A(arguments).each(function (a) {
		console.dir(a)
    });
}

/*
 * Debug raccourci
 */
function ce () {
	if(typeof console == "undefined") return ;
	$A(arguments).each(function (a) {
		console.error(a)
    });
}


// Gestion du calendrier
function init() {
	if(!_os) { setTimeout(init, 50); return;}
	_os.appVersion = "0.2.1";
	_os.requireAll('UI', ['behaviors/model.js'], {});
}

init();

var idDate;

document.observe('dom:loaded', function () {
	// Positionnement de la fleche CSS du menu niveau 0 (main-menu)
	/*if (Object.isElement($('menu-1'))) {
		$('main-menu').makePositioned ()

		$('main-menu').setStyle({
			backgroundPosition: $$('#main-menu li.on')[0].positionedOffset().left + parseInt($w($('main-menu').getStyle('backgroundPosition'))[0]) + 'px 20px'
		});
	} else {
		$('main-menu').setStyle({
			background: 'url()'
		});
	}*/

	// Si spectacle, on met les colonnes a la meme hauteur
	/*if (false && Object.isElement($('spectacle'))) {
		var colDetails = $$('.col-details')[0];
		var colImg = $$('.col-image')[0];
		if (colImg.getHeight() < colDetails .getHeight() ) {
			colImg.setStyle({
				height: colDetails.getHeight() - parseInt(colImg.getStyle('padding-top')) +'px'
			});
		} else {
			colDetails.setStyle({
				height: colImg.getHeight() - parseInt(colDetails.getStyle('padding-top')) - parseInt(colDetails.getStyle('padding-bottom')) +'px'
			});
		}
	}*/
	
	if(Object.isElement($('spectacle-photo')))
		var spectacle_baseuri = dirname($('spectacle-photo').readAttribute('src')) + '/';


	$$('.thumbs a').each(function (el) {
		var imageName = el.rel.split('|')[0];
		var loader = new ImageLoader(spectacle_baseuri + imageName);
		loader.load();
		loader.loadEvent = function(url, image){
			//actions to perform when the image is loaded hide loading indicator if applicable
		}

		el.observe('click', function (event) {
			event.stop();
			var self = this;

			if (!self.readAttribute('href') || self.hasClassName('lightwindow')) return false;
			
			var img = false,
				title = false,
				copyright = false;

			// on cache le rose et on met le rose
			var className;
			if ($$('.thumbs .rose').length) {
				className = 'rose';
				img = self.rel;
			} else if ($$('.thumbs .bg-blue').length) {
				className = 'bg-blue';
				var values = self.rel.split('|');
				img = values[0];
				title = values[1];		// gallery-photo-title
				copyright = values[2];	// gallery-photo-copyright
			}

			// on cache le noir et on met le rose
			$$('.thumbs .' + className)[0].removeClassName(className);

			if(self.firstDescendant())
				self.firstDescendant().addClassName(className);
			else
				self.addClassName(className);

			// on change le lien de l'image
			$('spectacle-photo').up().writeAttribute({
				href: dirname($('spectacle-photo').up().readAttribute('href')) + '/' + basename(self.readAttribute('href'))
			});

			if (self.readAttribute('href') == "")
				$('hd-link').style.visibility = 'hidden';
			else
				$('hd-link').style.visibility = 'visible'

			// on change le lien du lien HD
			$('hd-link').writeAttribute({
				href: dirname($('hd-link').readAttribute('href')) + '/' + basename(self.readAttribute('href'))
			});

			// on change le copyright
			if ($('copyright')) {
				if(self.readAttribute('title')) {
					$('copyright').update(self.readAttribute('title'));
					$('copyright').parentNode.show();
				} else {
					$('copyright').parentNode.hide();
				}
			}

			new Effect.Opacity('spectacle-photo', {
				from: 1.0,
				to: 0.0,
				duration: 0.533,
				afterFinish: function (eff) {
					$('spectacle-photo').writeAttribute({
						//src: spectacle_baseuri + self.rel,alt: self.rel,title: self.rel
						src: spectacle_baseuri + img,
						alt: img,
						'title': img
					});
					if (title !== false){
						$('gallery-photo-title').update(title);
						$('spectacle-photo').writeAttribute({'title': title});
					}
					if (title !== false)
						$('gallery-photo-copyright').update('&copy; ' + copyright);
					new Effect.Opacity('spectacle-photo', {
						from: 0.0,
						to: 1.0,
						duration: 0.533
					});
				}
			});
		});
	});

	if (idSpectacle) {
		Shadowbox.setup('.list-date .reserv', {
			handleOversize: 'none',
			content: baseurl + 'get_calendrier/' + idSpectacle,
			player: 'html',
			enableKeys: false
		});
	}
});

Shadowbox.init({
    overlayOpacity: 0.8,
    modal: true,
    handleOversize: 'drag'
}, setupCart);

function setupCart(){
	$$('.list-date .reserv').each(function (ele) {
		ele.observe('click', function (event) {
			event.stop();
			var idDate = this.id.split('-')[1];
			new Ajax.Request(baseurl + 'get_calendrier/' + idSpectacle, {
				parameters: {id: idDate}, 
				onSuccess: function (response) {
					Shadowbox.open({
						player: 'html',
						title: response.responseJSON.title,
						content: response.responseJSON.html,
    					width: 560,
    					options: {
    						initialWidth: 560,
    						modal: false,
	    					onFinish: function(item){
	    						observeAchat();
	    						shadowboxResize();
	    					}
	    				}
					});
				}
			});
		});
	});

	// Bouton ouverture panier
	$$('.scart').each(function(el) {
		observeOpenCart(el);
	});
	
	// Abonnements: delegation sur les liens abo
	$(document.body).on('click', '.buy-abo', openAboBox);
	
	// Resize de la fenetre
	Event.observe(window, 'resize', function() {
		if(Shadowbox.isOpen())
			shadowboxResize();
	});
}

function observeOpenCart (ele) {
	ele.observe('click', function (event) {
		event.stop();
		var idDate = this.id.split('-')[1];
		new Ajax.Request(baseurl + 'billeterie/panier', {
			parameters: {id: idDate}, 
			onSuccess: function (response) {
				Shadowbox.open({
					player: 'html',
					title: response.responseJSON.title,
					content: response.responseJSON.html,
					width: 560,
					options: {
						initialWidth: 560,
						modal: false,
    					onFinish: function(item){
    						shadowboxResize();
    						observeAchat();
    						toggleLoading(false);
    					}
    				}
				});
			}
		});
	});
}

/**
 * Regarde les elements du lightbox et ajoute des comportements sur des boutons présents
 *
 * @return	void
 **/
function observeAchat () {
	setFeedbackObserver();

	// on est sur un des 3 paneaux : reservation d'un autre spectacle par "Réserver un spectacle supplémentaire"
	// on enregistre le panier on ferme
	if(Object.isElement($('reserv'))) {
		$('reserv').observe('click', function (event) {
			event.stop();
/*?????*/	//if(Object.isElement($('endbtn')) && !verifySelect('billets')) return; /*?????????????*/
			if(Object.isElement($('billets')))
				addCart();
			Shadowbox.close();
		});
	}

	// Demande de passage de la mise au panier à l'étape 1 (datespectacle -> renseignement)
	if(Object.isElement($('endbtn'))) {
		$('endbtn').observe('click', function (event) {
			event.stop();
			if (!verifySelect('billets')){
				setFeedback('<p class="error">Merci de choisir vos places.</p>', true);
				shadowboxResize();
				return;
			}
			toggleLoading(true);
			sendReservation();
		});
	}

	// Demande de passage de l'étape 1 à l'étape 2 (renseignement -> recap)
	if(Object.isElement($('addressbtn'))) {
		$$('#abo-reserv input[type=text]').each(function (ele) {
			ele.observe('keypress', function (event) {
				if(event.keyCode == Event.KEY_RETURN) {
					toggleLoading(true);
					checkout();
				}
			});

		});
		$('addressbtn').observe('click', function (event) {
			event.stop();
			toggleLoading(true);
			checkout();
		});
	}

	// Annuler dans renseignement --> fermer
	/*if(Object.isElement($('renseigncancelbtn'))) {
		$('renseigncancelbtn').observe('click', function (event) {
			event.stop();
			Shadowbox.close();
		});
	}

	// Annuler dans renseignement --> fermer
	if(Object.isElement($('cancelbtn'))) {
		$('cancelbtn').observe('click', function (event) {
			event.stop();
			Shadowbox.close();
		});
	}*/
	$$('#cancelbtn,#renseigncancelbtn').each(function (ele) {
		ele.observe('click', function (event) {
			event.stop();
			Shadowbox.close();
		});
	});

	// Demande de passage de l'étape 2 à l'étape 1 - retour (recap -> renseignement)
	if(Object.isElement($('returnrenseignbtn'))) {
		$('returnrenseignbtn').observe('click', function (event) {
			event.stop();
			toggleLoading(true);
			returnRenseign();
		});
	}

	// On est sur les renseignement ou sur le recap de pre-paiement : suppression d'un spectacle
	if(Object.isElement($('addressbtn')) || Object.isElement($('returnrenseignbtn'))) {
		$$('#tbl-reserv .remove-spectacle').each(function (ele) {
			ele.observe('click', function (event) {
				event.stop();
				removeItem(this);
			});
		});
	}
}

/**
 * Met a jour la zone message : inutilisé ???
 *
 * @param	string	mess	
 * @return	void
 **/
function updateMessage (mess) {
	$$('#abo-reserv .messages')[0].update(mess);
}

/**
 * Suppression d'un spectacle panier
 *
 * @param	object	Element sur lequel on a cliqué
 * @return	void
 **/
function removeItem (ele) {
	var self = ele;

	new Ajax.Request(self.readAttribute('href'), {
		onSuccess: function(response) {
			resp = response.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				if (resp.data.cartcnt == 0) {
					self.up('table').remove();
					$('scart').remove();
					Object.isElement($('endbtn')) ? $('endbtn').stopObserving() : $('addressbtn').stopObserving();
				} else {
					// On supprime la ligne du DOM
					self.up('tr').remove();
					// si il ne reste que 1 ligne dans un spectacle / lieu
					// (un titre <tr> pour aucune date <tr> ds le panier)
					var arrTmp = self.up('tr').id.split('-');
					idDate = arrTmp[1];
					idSpectacle = arrTmp[2];
					var row = self.up('tr[id^=row][id$=' + idSpectacle + ']');
					if(row.length == 1)
						row.remove();
					$('totalcmd').update(resp.data.totalcmd);
				}
				setFeedback(resp.message, resp.data.totalcmd == 0);
			}
			shadowboxResize();
		}
	});
}

/**
 * Ajout panier seul
 *
 * @return	void
 **/
function addCart () {
	$('billets').request({
		onSuccess: function(t) {
			resp = t.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				$('sb-title-inner').update(resp.title);
				$('sb-player').update(resp.html);
				observeAchat();
			}
			shadowboxResize();
			testShoppingCart();
		}
	});
}

/**
 * Ajout panier + terminer ma commande
 *
 * @return	void
 **/
function sendReservation () {
	$('billets').request({
		onSuccess: function(t) {
			resp = t.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				$('sb-title-inner').update(resp.title);
				$('sb-player').update(resp.html);
				observeAchat();
				testShoppingCart();
			}
			toggleLoading(false);
			shadowboxResize();
		}
	});
}

/**
 * Retour à la page renseignement
 *
 * @return	void
 **/
function returnRenseign () {
	new Ajax.Request(baseurl + 'billeterie/renseignement', {
		onSuccess: function(t) {
			resp = t.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				$('sb-title-inner').update(resp.title);
				$('sb-player').update(resp.html);
				observeAchat();
			}
			toggleLoading(false);
			shadowboxResize();
		}
	});
}

/**
 * Enregistrement des renseignements utilisateurs
 *
 * @return	void
 **/
function checkout () {
	$('confirm').request({
		onSuccess: function(t) {
			resp = t.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				$('sb-title-inner').update(resp.title);
				$('sb-player').update(resp.html);
				observeAchat();
			}
			toggleLoading(false);
			shadowboxResize();
		}
	});
}

/**
 * Test le nombre d'element ds le panier et si > 0
 * regarde si le btn en ht a droite est present -> si non le rajoute
 *
 * @return	void
 **/
function testShoppingCart () {
	new Ajax.Request(baseurl + 'billeterie/verifpanier', {
		onSuccess: function(t) {
			resp = t.responseJSON;
			if (resp.error) {
				setFeedback(resp.errormess);
			} else {
				if(resp.data.cartcnt > 0 && !Object.isElement($('scart'))) {
					$('main-menu').insert({'top' : resp.html});
					observeOpenCart($('scart'));
				} else if (resp.data.cartcnt == 0 && Object.isElement($('scart')))
					$('scart').remove();
			}
		}
	});
}

/**
 * Suppression d'un spectacle panier
 *
 * @param	object	Form Element
 * @return	void
 **/
function verifySelect (form) {
	var goodCart = false;
	$$('#billets select').each(function(ele) {
		if(ele.getValue() > 0)
			goodCart = true;
	});
	return goodCart;
}

/**
 * Ouvre la fenetre d'abonnement avec contenu AJAX
 * et observe les evenement de cette fenetre
 * 
 * @param	event
 * @return	void
 **/
function openAboBox(event) {
	if(event) event.stop();
	
	//Shadowbox.close();	// on ferme tout
	if(!Shadowbox.isOpen()){
		Shadowbox.init({
			skipSetup: true,
		    overlayOpacity: 0.8,
		    modal: true,
		    initialWidth: 740,
		    handleOversize: 'drag'
		}, setupCart);
		toggleLoading(true);
	} 
	
	// et on ouvre la bonne
	new Ajax.Request(baseurl + 'abonnement/etape1', {
		onSuccess: function(response){
			var resp = response.responseJSON;
			if(Shadowbox.isOpen()){
				setFeedback(resp.message, true);
				$('sb-title-inner').update(resp.title);
				$('sb-player').update(resp.html);
				observeAbo();
				shadowboxResize();
				toggleLoading(false);
			} else {
				Shadowbox.open({
					player: 'html',
					title: resp.title,
					content: resp.html,
					width: 740,
					options: {
						modal: false,
						initialWidth: 740,
						onFinish: function(item){
							observeAbo();
							shadowboxResize();
							toggleLoading(false);
							if(resp.message)
								setFeedback(resp.message, true);
						}
					}
				});
			}
		}
	});
}

/**
 * Observe tous les evement sur la fenetre d'abonnement
 * 
 * @return	void
 **/
function observeAbo() {
	setFeedbackObserver();

	// Fermeture
	$('abo-reserv').on("click", "#cancelbtn", function (event) {
		event.stop();
		Shadowbox.close();
	});
	
	// Passage de l'etape 1 à 2
	$('abo-reserv').on('click', '#step1btn', function (event) {
		event.stop();
		if (!verifySelectAbo('form-step1to2')){
			setFeedback('<p class="error">Vous devez choisir au minimum 3 spectacles par abonnement (y compris le Pass\'Régénération), sans oublier de choisir les dates pour chaque spectacle.</p>', false);
			shadowboxResize();
			return;
		}
		toggleLoading(true);
		sendAbo('step1to2');
	});
	
	// Passage de l'etape 2 à 3
	$('abo-reserv').on('click', '#step2btn', function (event) {
		event.stop();
		toggleLoading(true);
		sendAbo('step2to3');
	});
	
	// Demande de passage de l'étape 2 à l'étape 1 - retour (recap -> renseignement)
	$('abo-reserv').on('click', '#return1btn', function (event) {
		event.stop();
		toggleLoading(true);
		sendAbo('step2to1');
	});
	
	// Demande de passage de l'étape 3 à l'étape 2 - retour (recap -> renseignement)
	$('abo-reserv').on('click', '#return2btn', function (event) {
		event.stop();
		toggleLoading(true);
		sendAbo('step3to2');
	});
	
	// Demande de passage de l'étape 1 à l'étape 2 avec clavier
	$('abo-reserv').on('keypress', '#abo-reserv input[type=text]', function (event) {
		if(event.keyCode == Event.KEY_RETURN) {
			toggleLoading(true);
			sendAbo('step2to3');
		}
	});
	
	// On observe les onchange sur les nombres de places pour le total
	if (Shadowbox.isOpen() && Object.isElement($('total'))) {
		updateTotal();
	}
	$('abo-reserv').on('change', 'select[name^=nbplaces],select[name^=nbpass]', function (event) {
		updateTotal();
	});
}

function updateTotal(){
	var total = 0;
	$$('#form-step1to2 select[name^=nbplaces],#form-step1to2 select[name^=nbpass]').each(function(el){
		total += parseInt(el.getValue()) * parseInt(el.readAttribute('rel'));
	});
	$('total').update(total);
}

/**
 * TODO : mettre les callback en commun , c'est pas du luxe...
 * 
 */
function sendAbo(type) {
	if (type == 'step3to2' && Object.isElement($('backurl'))) {
		var req = new Ajax.Request($('backurl').getValue(), {
			parameters: {t: type},
			onSuccess: function(t) {
				resp = t.responseJSON;
				if (resp.error) {
					setFeedback(resp.errormess, true);
				} else {
					$('sb-title-inner').update(resp.title);
					$('sb-player').update(resp.html);
					observeAbo();
				}
				toggleLoading(false);
				shadowboxResize();
			}
		});
	} else {
		$('form-' + (type == 'step2to1' ? 'step2to3' : type)).request({
			parameters: {t: type},
			onSuccess: function(t) {
				resp = t.responseJSON;
				if (resp.error) {
					setFeedback(resp.errormess, true);
				} else {
					$('sb-title-inner').update(resp.title);
					$('sb-player').update(resp.html);
					observeAbo();
				}
				toggleLoading(false);
				shadowboxResize();
			}
		});
	}
}

/**
 * Verification du formulaire abonnement
 *
 * @param	object	Form Element
 * @return	void
 **/
function verifySelectAbo (formId) {
	if ($('nbplein').getValue() == 0 && $('nbreduit').getValue() == 0)
		return false;

	var goodDates = [];
	$$('#' + formId + ' select[name^=dates]').each(function(eleDate) {
		if(eleDate.getValue() > 0) {
			$$('#spec-' + eleDate.readAttribute('name').split('-')[1] + ' .places-abo').each(function(elePlace){
				if(elePlace.getValue() > 0){
					goodDates.push(eleDate.readAttribute('rel'));
				}
			});
		}
	});
	// Places Pass'Re-generation
	$$('#' + formId + ' select[name^=nbpass].places-abo').each(function(elePlace) {
		if(elePlace.getValue() > 0) {
			goodDates.push(elePlace.readAttribute('rel'));
		}
	});
	return goodDates.length > 2;
}

/**
 * verifie que l'utilisateur a bien coché la case CGV
 * Non appele pour l'instant, pas de CGV sur le site ...
 * 
 * @return	boolean
 **/
function check_cgv () {
	if(!$('cgv').checked) {
		alert('Vous devez accepter les conditions générales de ventes.');
		return false;
	}
	return true;
}

var interval = null;

function shadowboxResize(ele, w, h, s) {
	$('sb-wrapper-inner').setStyle({
		height: (5 + $('abo-reserv').getHeight()) + 'px',
		minHeight: (5 + $('abo-reserv').getHeight()) + 'px'
	});
	
	var ele = ele || $('sb-wrapper'),
		w = w || $('abo-reserv').getWidth(),
		h = h || $('sb-wrapper-inner').getHeight() + 10,
		s = s || 4;
		
//	var t = Math.ceil((PageDim.height()/2) - ($('sb-wrapper').offsetHeight / 2));
//	t = t < 10 ? 10 : t;
	
//	$('sb-wrapper').style.top = (t + PageDim.top()) + 'px';
//	$('sb-wrapper').style.left = (PageDim.width() / 2) - ($('sb-wrapper').offsetWidth / 2) + 'px';
	
	e = typeof ele == 'object' ? ele : $(ele);
	
	clearInterval(interval);
	
	var ow = e.offsetWidth,
		oh = e.offsetHeight,
		wo = ow - parseInt($('sb-wrapper').style.width),
		ho = oh - parseInt($('sb-wrapper').getStyle('height'));

	var wd = ow - wo > w ? - 1 : 1, hd = (oh - ho > h) ? - 1 : 1;
	
	interval = setInterval(function(){
		shadowboxTweenSize(e, w, wo, wd, h, ho, hd, s);
	}, 20);
}

function shadowboxTweenSize(e, w, wo, wd, h, ho, hd, s) {
	var ow = e.offsetWidth - wo,
		oh = e.offsetHeight - ho;
	//cl(e.offsetWidth + ' ' + wo +' ' + (e.offsetWidth - wo));cl('------------------', ow + ' ' + w + ' ' + oh + ' ' + h);
	shadowboxPos();
	
	if (ow == w && oh == h) {
		clearInterval(interval);
	} else {
		if (ow != w) {
			$('sb-wrapper').style.width = (ow + (Math.ceil(Math.abs(w - ow) / s) * wd)) + 'px';
		}
		if (oh != h) {
			$('sb-wrapper').style.height = (oh + (Math.ceil(Math.abs(h - oh) / s) * hd)) + 'px';
		}
	}
}

function shadowboxPos() {
	var t = (PageDim.height() / 2) - ($('sb-wrapper').offsetHeight/2);
	t = t < 10 ? 10 : t;
	$('sb-wrapper').style.top = t + 'px';
	$('sb-wrapper').style.left = (PageDim.width() / 2) - ($('sb-wrapper').offsetWidth / 2) + 'px';
}

var PageDim = function(){
	return {
		top: function(){return document.body.scrollTop||document.documentElement.scrollTop},
		width: function(){return self.innerWidth||document.documentElement.clientWidth},
		height: function(){return self.innerHeight||document.documentElement.clientHeight},
		theight: function(){
			var d = document, b=d.body, e=d.documentElement;
			return Math.max(Math.max(b.scrollHeight,e.scrollHeight),Math.max(b.clientHeight,e.clientHeight))
		},
		twidth : function(){
			var d = document, b=d.body, e=d.documentElement;
			return Math.max(Math.max(b.scrollWidth,e.scrollWidth),Math.max(b.clientWidth,e.clientWidth))
		}
	}
}();

function toggleLoading(state) {
	$('sb-loading')[state ? 'show' : 'hide']();
	$('sb-body-inner').setOpacity(state ? 0.3 : 1);
}

// -----------------------------------------
// On enregistre un customEvent pour le feedback
function setFeedbackObserver () {
	if(!Object.isElement($("feedback")))
		return;

	$('feedback').observe("as:fadefeedback", function (event, name, value) {
		var self = this;
		new Effect.Opacity(this, {
			from: 1.0,
			to: 0,
			duration: 10,
			afterFinish : function () {
				self.remove();
				shadowboxResize();
			}
		});
	});
}

function setFeedback (mess, notfade) {
	if(!Object.isElement($("feedback")))
		$('feedback-container').insert('<div id="feedback"></div>');

	$("feedback").update(mess);

	if (notfade) return;

	setFeedbackObserver();
	$("feedback").fire("as:fadefeedback");
}


function basename (path, suffix) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Ash Searle (http://hexmen.com/blog/)
    // +   improved by: Lincoln Ramsay
    // +   improved by: djmix
    // *     example 1: basename('/www/site/home.htm', '.htm');
    // *     returns 1: 'home'

    var b = path.replace(/^.*[\/\\]/g, '');

    if (typeof(suffix) == 'string' && b.substr(b.length-suffix.length) == suffix) {
        b = b.substr(0, b.length-suffix.length);
    }

    return b;
}

function dirname (path) {
    // http://kevin.vanzonneveld.net
    // +   original by: Ozh
    // +   improved by: XoraX (http://www.xorax.info)
    // *     example 1: dirname('/etc/passwd');
    // *     returns 1: '/etc'
    // *     example 2: dirname('c:/Temp/x');
    // *     returns 2: 'c:/Temp'
    // *     example 3: dirname('/dir/test/');
    // *     returns 3: '/dir'
    if(path)
    	return path.replace(/\\/g,'/').replace(/\/[^\/]*\/?$/, '');	//'
    return '' ;
}

function realpath (path) {
    // Return the resolved path
    //
    // version: 908.406
    // discuss at: http://phpjs.org/functions/realpath
    // +   original by: mk.keck
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %        note 1: Returned path is an url like e.g. 'http://yourhost.tld/path/'
    // *     example 1: realpath('../.././_supporters/pj_test_supportfile_1.htm');
    // *     returns 1: 'file:/home/kevin/workspace/_supporters/pj_test_supportfile_1.htm'

    var p = 0, arr = [];
    /* Save the root, if not given */
    var r = this.window.location.href;
    /* Avoid input failures */
    path = (path + '').replace('\\', '/');
    /* Check if there's a port in path (like 'http://') */
    if (path.indexOf('://') !== -1) {
        p = 1;
    }
    /* Ok, there's not a port in path, so let's take the root */
    if (!p) {
        path = r.substring(0, r.lastIndexOf('/') + 1) + path;
    }
    /* Explode the given path into it's parts */
    arr = path.split('/');
    /* The path is an array now */
    path = [];
    /* Foreach part make a check */
    for (var k in arr) {
        /* This is'nt really interesting */
        if (arr[k] == '.') {
            continue;
        }
        /* This reduces the realpath */
        if (arr[k] == '..') {
            /* But only if there more than 3 parts in the path-array.
             * The first three parts are for the uri */
            if (path.length > 3) {
                path.pop();
            }
        }
        /* This adds parts to the realpath */
        else {
            /* But only if the part is not empty or the uri
             * (the first three parts ar needed) was not
             * saved */
            if ((path.length < 2) || (arr[k] !== '')) {
                path.push(arr[k]);
            }
        }
    }
    /* Returns the absloute path as a string */
    return path.join('/');
}


/**
* A simple JavaScript image loaderimage loader
* @author Cuong Tham
* @url http://thecodecentral.com/2008/02/21/a-useful-javascript-image-loader
* @usage
* var loader = new ImageLoader('IMAGE_URL');
* //set event handler
* loader.loadEvent = function(url, image){
*   //action to perform when the image is loaded
*   document.body.appendChild(image);
* }
* loader.load();
*/

//source: http://snipplr.com/view.php?codeview&id=561
// Cross-browser implementation of element.addEventListener()
function addListener(element, type, expression, bubbling)
{
	bubbling = bubbling || false;
	if(window.addEventListener)	{ // Standard
		element.addEventListener(type, expression, bubbling);
		return true;
	} else if(window.attachEvent) { // IE
		element.attachEvent('on' + type, expression);
		return true;
	} else return false;
}

var ImageLoader = function(url){
	this.url = url;
	this.image = null;
	this.loadEvent = null;
};

ImageLoader.prototype = {
	load:function(){
		this.image = document.createElement('img');
		var url = this.url;
		var image = this.image;
		var loadEvent = this.loadEvent;
    
	    $(this.image).observe('load', function(e){
			if(loadEvent != null){
				loadEvent(url, image);
			}
		});
		/*addListener(this.image, 'load', function(e){if(loadEvent != null){loadEvent(url, image);}}, false);*/
    	this.image.src = this.url;
	},
	getImage:function(){
		return this.image;
	}
};

