/* 
   JavaScript Document
   Written by Ikonic (Pellevillain Cédric)
   Copyright (c) 2008 Piksite.com 
   ---------------------------------------
   Some rights reserved. This work is licensed under a Creative Commons Attribution-Noncommercial 3.0 Unported License.
   
   You are free:

    * to Share — to copy, distribute and transmit the work
    * to Remix — to adapt the work

   Under the following conditions:

    * Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).
    * Noncommercial. You may not use this work for commercial purposes.

    * For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page.
    * Any of the above conditions can be waived if you get permission from the copyright holder.
    * Nothing in this license impairs or restricts the author's moral rights.
   
   If you want to include this work in a selling package, mail me : contact@piksite.com        
*/
 
var counter = 0; 
var tempX = 0;
var elt_posX,elt_posY,b;
var elements = new Array();
var _carousselDivName;
var _textDivName;
var _minPosX;
var _maxPosX;
var _minPosY;
var _onClickLeftMargin;
var _onClickFirefoxZoomSize;
var _onClickIEZoomSize;
var _coef;
var _extraElements = new Array();
var _navId;
var navigating = false;
//var clear="../img/clear.gif"
function setCarouselCoef(coef){
	_coef = coef;
}

function setExtraElements(extraElements){
   _extraElements = extraElements;
}
// During page on load
function loadCarousel(images, divName, minPosX, maxPosX, minPosY, onClickLeftMargin, onClickFirefoxZoomSize, onClickIEZoomSize) { 
	//alert("3");
	if(divName == null || divName == ""
		|| minPosX == null || minPosX == ""
		|| maxPosX == null || maxPosX == ""
		|| minPosY == null || minPosY == ""
		|| onClickLeftMargin == null || onClickLeftMargin == ""
		|| onClickFirefoxZoomSize == null || onClickFirefoxZoomSize == ""
		|| onClickIEZoomSize == null || onClickIEZoomSize == ""
	){
		//alert("Missing parameters. Caroussel load aborted");
		return;
	}
	if(_coef == null){
		_coef = 1;
	}
	_carousselDivName = divName;
	_textDivName = divName.replace(/carousel/i, "text");
	_onClickLeftMargin = onClickLeftMargin;
	_onClickFirefoxZoomSize = onClickFirefoxZoomSize;
	_onClickIEZoomSize = onClickIEZoomSize;
	_minPosX = minPosX;
	_maxPosX = maxPosX;
	_minPosY = minPosY;
  // create each element
  var ids = 0;
  
	//alert("4");
  images.each(function(photo) {
	  if(photo != null){
	  var globalDiv = document.createElement('div');
      var div = document.createElement('div');
      div.className = 'image';
      div.style.position = 'absolute';
      div.style.display = 'none';

      if(clickit!=false) { 
        Event.observe(div, 'click', Click);
        div.style.cursor = 'pointer'; 
      }
      var id_div = 'img'+ids;
	  
		 
    
      div.id = id_div;
      var img = document.createElement('img');
      img.src = photo;
      img.id = id_div+"_img";
      div.appendChild(img);
	  $(_carousselDivName).appendChild(div);  
      elements.push(div.id);

	  ids++;
	  }else {
		  ids++;
	  }
    });
	//alert("5");
	  var divNav = document.createElement('div');
	  //alert("5.1");
      divNav.id = "carouselNav";
	  //alert("5.2");
	  divNav.className = 'navButtons';
	  //alert("5.3");
	  divNav.style.display = 'none';
  //alert("6");
	  var navPrevious = document.createElement('img');
	  navPrevious.id = "navPrevious";
	  navPrevious.className = 'navButton';
	  var navNext = document.createElement('img');
	  navNext.id = "navNext";
	  navNext.className = 'navButton';
	  var navBack = document.createElement('img');
	  navBack.id = "navBack";
	  navBack.className = 'navButton';
//alert("7");
	  // corporate_portal_templates_v2/abilis/images
	  navPrevious.src = contextURL+"/abilis/images/left.PNG";
	  navNext.src = contextURL+"/abilis/images/right.PNG";
	  navBack.src = contextURL+"/abilis/images/pause.PNG";
//alert("8");
	  divNav.appendChild(navPrevious);
	  divNav.appendChild(navBack);
	  divNav.appendChild(navNext);
	  
//alert("9");
	  $(_carousselDivName).appendChild(divNav);

	  Event.observe("navPrevious", 'click', carouselPrevious);
	  Event.observe("navNext", 'click', carouselNext);
	  Event.observe("navBack", 'click', carouselBack);
	//alert("10");
  if(navigator.userAgent.toLowerCase().indexOf("msie") != -1) {  
    elements.each(function(element) {
      var el = $(element).firstDescendant();
      if(el.width==0 && el.height==0) { 
        new_img = new Image();
        new_img.src = el.src;
      }
      el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+el.src+"',sizingMethod='crop')";
      el.style.backgroundImage = 'none';
    });  
  }
  //alert("11");
  open();
}

// create each element
function open() { 
  // appear each element
  elements.each(function(element) {
    new Effect.Appear(element, {duration:2.0});
  });

  // start carousel   
  b = setInterval('carousel()',50);
}

// Clear observation on element. Avoid quick click issues.
function makeVoid(elt){
	Event.stopObserving(elt);
}

// Change image event to back
function textIt(elt) {
  
 // Event.stopObserving(elt, 'click', Click);
  Event.observe(elt, 'click', Back);
}

function untextAll(){
	for(i=0;i < elements.length;i++) {
		untextIt(elements[i]);
	}
}

// Change image event to click
function untextIt(elt) {
 // Event.stopObserving(elt, 'click', Back);
  Event.observe(elt, 'click', Click);
}

function getZoom(posy, posx) {
  if(Prototype.Browser.IE) {
	if(posx > _minPosX && posx < _maxPosX && posy > _minPosY){
		return Math.sqrt((_coef*posy)*7) + "%";
	}else{
		return Math.sqrt((_coef*posy)*2.5) + "%";
	}
  } else {
	if(posx > _minPosX && posx < _maxPosX && posy > _minPosY){
		return Math.sqrt((_coef*posy)*450) + "px";	
	}else{
		return Math.sqrt((_coef*posy)*320) + "px";
	}
  } 
}
/*zoomStatus 0, not zoomed 
 *zoomStatus 1, means the object is already zoomed. No need to morph the transition.
 *zoomStatus 2, being zoomed
 */
var zoomStatus = new Array();
function setZoom(elt, i, posy, posx) {
var img = elt.down();
  if(Prototype.Browser.IE) {
	//if browser is IE
	if(posx > _minPosX && posx < _maxPosX && posy > _minPosY){
		if(zoomStatus[i] == null || zoomStatus[i] == 1){
			elt.style.zIndex = Math.round(posy/3)+150;   
			img.style.width = Math.sqrt((_coef*posy)*7) + "%";
			img.style.height = Math.sqrt((_coef*posy)*7) + "%";			 
			zoomStatus[i] = 1;
		}else if(zoomStatus[i] == 0){
			zoomStatus[i] = 2;
			elt.style.zIndex = Math.round(posy/3)+150;
			new Effect.Morph(img, {style: 'width:'+Math.sqrt((_coef*posy)*7)+'%;height:'+Math.sqrt((_coef*posy)*7)+'%;', duration:1.0,  afterFinish : function() { zoomStatus[i] = 1;}})
		}
	}else{
		if(zoomStatus[i] == null || zoomStatus[i] == 0){
			elt.style.zIndex = Math.round(posy/3)+100;   
			img.style.width = Math.sqrt((_coef*posy)*2.5) + "%";
			img.style.height = Math.sqrt((_coef*posy)*2.5) + "%";
			   
			zoomStatus[i] = 0;
		}else if(zoomStatus[i] == 1){
			zoomStatus[i] = 2;
			elt.style.zIndex = Math.round(posy/3)+100; 
			new Effect.Morph(img, {style: 'width:'+Math.sqrt((_coef*posy)*2.5)+'%;height:'+Math.sqrt((_coef*posy)*2.5)+'%;',duration:1.0, afterFinish : function() { zoomStatus[i] = 0;}});
		}
	}
  } else {
	//if browser is not IE
	//if position is bottom center
	if(posx > _minPosX && posx < _maxPosX && posy > _minPosY){
		if(zoomStatus[i] == null || zoomStatus[i] == 1){
			elt.style.zIndex = Math.round(posy/3)+150;  
			img.style.width = Math.sqrt((_coef*posy)*450) + "px";	
			zoomStatus[i] = 1;
		}else if(zoomStatus[i] == 0){
			zoomStatus[i] = 2;
			elt.style.zIndex = Math.round(posy/3)+150;  
			new Effect.Morph(img, {style: 'width:'+Math.sqrt((_coef*posy)*450)+'px;', duration:1.0,  afterFinish : function() { zoomStatus[i] = 1;}});
		}
	//if position is not bottom center
	}else{
		if(zoomStatus[i] == null || zoomStatus[i] == 0){
			elt.style.zIndex = Math.round(posy/3)+100;  
			img.style.width = Math.sqrt((_coef*posy)*320) + "px";		
			zoomStatus[i] = 0;
		}else if(zoomStatus[i] == 1){
			zoomStatus[i] = 2;
			elt.style.zIndex = Math.round(posy/3)+100;   
			new Effect.Morph(img, {style: 'width:'+Math.sqrt((_coef*posy)*320)+'px;',duration:1.0, afterFinish : function() { zoomStatus[i] = 0;}});
		}		
	}
  } 
}


// Back to carousel
function Back(elt) {
	
  // get parent div id if clicked element is an object
  if(typeof(elt)=='object') {
    var img = Event.element(elt);
    elt = Event.element(elt).parentNode.id;
  }else{
  	var img = $(elt+"_img");
  }
  makeVoid(elt);
  // define actions
  var appearer = 'new Effect.Parallel([';
  for(i=0;i < elements.length;i++) {
    if(elements[i]!=elt) { 
      appearer += "new Effect.Appear('"+elements[i]+"', {sync:true})";      
    } else {
	  _navId = i;
      appearer += "new Effect.Morph('"+elt+"', {style: 'left: '+elt_posx+'px; top: '+elt_posy+'px;margin-left:0px;', transition: Effect.Transitions.sinoidal, delay:1.5, sync:true})";
      appearer += ', ';
      appearer += "new Effect.Morph(img, {style: 'width:'+getZoom(elt_posy, elt_posx)+';', sync:true})";
    }
    appearer += ', ';
  }
   appearer += 'new Effect.Fade(\''+_textDivName+'\', {sync: true})], {duration:3.0, afterFinish : function() {untextAll(); $(\''+_textDivName+'\').innerHTML = \'\'; b = setInterval(\'carousel()\',50); } });';
  // do actions
  fadeNavButtons();
  fadeInExtraElements();
  eval(appearer);
  _navId = null;
}

function Click(elt) {
  var img = Event.element(elt);
  // get parent div id
  elt = Event.element(elt).parentNode.id;
  if(requestText(elt)){
	  makeVoid(elt);
	  // stop carousel
	  clearInterval(b);
	  // get clicked element positions
	  
	  elt_posx = parseFloat(Element.getStyle(elt, 'left'));
	  elt_posy = parseFloat(Element.getStyle(elt, 'top'));
	  elt_index = Element.getStyle(elt, 'z-index');
	  elt_index = 0;
	  // define actions
	  var fader = 'new Effect.Parallel([';
	  for(i=0;i < elements.length;i++) {
		if(elements[i]!=elt) {
		  makeVoid(elements[i]);
		  fader += "new Effect.Fade('"+elements[i]+"', {sync:true})";
		} else {
		  _navId = i;
		  fader += "new Effect.Morph('"+elt+"', {style: 'left: "+_onClickLeftMargin+"px; top: 0px;', transition: Effect.Transitions.sinoidal, sync:true, delay:1.5})";
		  fader += ', ';
		  if(Prototype.Browser.IE) {
			fader += "new Effect.Morph(img, {style: 'width:"+_onClickIEZoomSize+"%;height:"+_onClickIEZoomSize+"%;', sync:true})";
		  }else{
			fader += "new Effect.Morph(img, {style: 'width:"+_onClickFirefoxZoomSize*4+"px;', sync:true})";
		  }
		}
		fader += ', ';
	  }
	  fader += 'new Effect.Appear(\''+_textDivName+'\', {sync:true})], {duration:3.0, afterFinish : function() {textIt(\''+elt+'\') }  });';
	  // do actions
	  fadeOutExtraElements();
	  eval(fader);
	  appearNavButtons();
  }
}


// request text
function requestText(elt) {
  //var index = elt.substring(elt.length - 1,elt.length);
  var index = elt.replace("img", "");
  
  var divId = 'clientContentDiv'+index;
  if($(divId) != null){
	  $(_textDivName).innerHTML = $(divId).innerHTML;	  
	  return true;
  }else{
	return false;
  }
}

// carousel 
function carousel() {
 elements.each(function(photo, i) {
    angle = i*2*Math.PI/elements.length;
    posx = centerx+Math.sin(counter*(base*speed)+angle)*radiusx;
    posy = centery+Math.cos(counter*(base*speed)+angle)*radiusy;  
    var elt = $(elements[i]);
	setZoom(elt, i, posy, posx);
    elt.style.left = posx+"px"; 
    elt.style.top = posy+"px";
    angle += speed;  
  });  
  counter++
}

function fadeOutExtraElements(){
if(_extraElements != null && _extraElements.length > 0){
	 var fader = 'new Effect.Parallel([';
	for(i=0;i < _extraElements.length;i++) {
		 fader += "new Effect.Fade('"+_extraElements[i]+"', {sync:true})";
		 if(i != _extraElements.length - 1){
			 fader += ',';
		 }
	}
	fader += '], {duration:1.0});';
}
 eval(fader);
}

function fadeInExtraElements(){
if(_extraElements != null && _extraElements.length > 0){
	var appearer = 'new Effect.Parallel([';
	for(i=0;i < _extraElements.length;i++) {
		appearer += "new Effect.Appear('"+_extraElements[i]+"', {sync:true})";
		if(i != _extraElements.length - 1){
			 appearer += ',';
		 }
	}
	appearer += '], {delay:2.0, duration:1.0});';
}
 eval(appearer);
}


function carouselNext(){
if(! navigating ){
	navigating = true;
	makeVoid(elements[_navId]);
	new Effect.Parallel([
	  new Effect.Fade(elements[_navId], {duration:1.0}),
	  new Effect.Fade(_textDivName, {duration:1.0})
		], {
			afterFinish: function(){
				  $(elements[_navId]).style.left = elt_posx+"px";
				  $(elements[_navId]).style.top = elt_posy+"px";
				  $(elements[_navId]).style.marginLeft = "0px";

				  if(Prototype.Browser.IE) {
					$(elements[_navId]+"_img").style.width = getZoom(elt_posy, elt_posx);
					$(elements[_navId]+"_img").style.height =  getZoom(elt_posy, elt_posx);
				  }else{
					$(elements[_navId]+"_img").style.width = getZoom(elt_posy, elt_posx);
				  }				  

				  _textDivName.innerHTML = "";

				  if(_navId < elements.length - 1){
					_navId++;
				  }else{
					_navId = 0;
				  }

				  textIt(elements[_navId]);
				  elt_posx = parseFloat($(elements[_navId]).style.left);
				  elt_posy = parseFloat($(elements[_navId]).style.top);

				  _textDivName.innerHTML = requestText(elements[_navId]);

				  $(elements[_navId]).style.left = _onClickLeftMargin+"px";
				  $(elements[_navId]).style.top = "0px";
				  
				  if(Prototype.Browser.IE) {
					$(elements[_navId]+"_img").style.width = _onClickIEZoomSize+"%";
					$(elements[_navId]+"_img").style.height =  _onClickIEZoomSize+"%";
				  }else{
					$(elements[_navId]+"_img").style.width = _onClickFirefoxZoomSize*4+"px";
				  }

				  new Effect.Appear(elements[_navId], {duration:3.0});
				  new Effect.Appear(_textDivName, {duration:3.0});
				  navigating = false;
			}
		
		});
	}
}

function carouselPrevious(){
if(!navigating){
	navigating = true;
	makeVoid(elements[_navId]);
	new Effect.Parallel([
	  new Effect.Fade(elements[_navId], {duration:1.0}),
	  new Effect.Fade(_textDivName, {duration:1.0})
		], {
			afterFinish: function(){
				  $(elements[_navId]).style.left = elt_posx+"px";
				  $(elements[_navId]).style.top = elt_posy+"px";
				  $(elements[_navId]).style.marginLeft = "0px";
			
				  if(Prototype.Browser.IE) {
					$(elements[_navId]+"_img").style.width = getZoom(elt_posy, elt_posx);
					$(elements[_navId]+"_img").style.height =  getZoom(elt_posy, elt_posx);
				  }else{
					$(elements[_navId]+"_img").style.width = getZoom(elt_posy, elt_posx);
				  }

				  _textDivName.innerHTML = "";

				  if(_navId != 0){
					_navId--;
				  }else{
					_navId = elements.length - 1;
				  }

				  textIt(elements[_navId]);
				  elt_posx = parseFloat($(elements[_navId]).style.left);
				  elt_posy = parseFloat($(elements[_navId]).style.top);

				  _textDivName.innerHTML = requestText(elements[_navId]);

				  $(elements[_navId]).style.left = _onClickLeftMargin+"px";
				  $(elements[_navId]).style.top = "0px";
				  
				  if(Prototype.Browser.IE) {
					$(elements[_navId]+"_img").style.width = _onClickIEZoomSize+"%";
					$(elements[_navId]+"_img").style.height =  _onClickIEZoomSize+"%";
				  }else{
					$(elements[_navId]+"_img").style.width = _onClickFirefoxZoomSize*4+"px";
				  }

				  new Effect.Appear(elements[_navId], {duration:3.0});
				  new Effect.Appear(_textDivName, {duration:3.0});
				  navigating = false;
			}
		
		});
	}
}


function carouselBack(){
  Back(elements[_navId]);
}

function appearNavButtons(){
  new Effect.Appear('carouselNav', {delay:2.5, duration:1.0});
}

function fadeNavButtons(){
  new Effect.Fade('carouselNav', {duration:1.0});
}