var galcount = 1;

var galcount = 1;
function isTouchDevice(){
	try{
		document.createEvent("TouchEvent");
		return true;
	}catch(e){
		return false;
	}
}

function mogal(galId,type,startItem) {
  //if (!document.getElementById || DetectTierIphone()) { // todo get rid of DetectTierIphone
  if (!document.getElementById ) {
	return;  
  }
  
  //1) Set width of the "neutral" area in the center of the gallery.
  var restarea=10;
   //2) Set top scroll speed in pixels. Script auto creates a range from 0 to top speed.
  var maxspeed=6;
   //Increase speed for IE browsers which are quite slow
   /*@cc_on
   maxspeed = maxspeed + 2;
	@*/
   //3) Set to maximum width for gallery - must be less than the actual length of the image train.
  var maxwidth=1000;
   //4) Set to a number for a specific item or S for start, E for end, C for center.
  var startPos='C';
   //5) Set message to show at end of gallery. Enter "" to disable message.
  var endofgallerymsg='<span style="font-size: 10px;">End of Gallery</span>';
  
  var loaded = false;
  var galType = type == "V" ? "top" : "left"; //Gallery type: left - [H]orizontal, top - [V]ertical
  var holder = $(galId); //Gallery wrapping div
  var holdsize = galType == "left" ? holder.getWidth() : holder.getHeight(); //Holder width or height
  var galmove; //Movement viewer (created later)
  var size; //Gallery width or height (size of the movement viewer)
  var gallery = $$('#'+galId+' .gallinks')[0]; //Should find the list of items with a class of gallinks
  $(gallery).id = 'train'+galcount;
  var startDiv;
  var endDiv;
  var movetime;
  var curPos = 0; //relative pointer position
  var scrollspeed = 0;
  var stopmotion = true;
  if(startItem == undefined) {
	var startItem = startPos;
  }
  var movestate = null;
  
  var thisObj = this; //Used to prevent scoping errors
  
  if(isTouchDevice()){ //if touch events exist...
	  var scrollStartPos=0;
	  holder.addEventListener("touchstart", function(event) {
		  scrollStartPos = galType == "left" ? this.scrollLeft+event.touches[0].pageX : this.scrollTop+event.touches[0].pageY;
		  //event.preventDefault();
	  },false);

	  holder.addEventListener("touchmove", function(event) {
		  if(galType == "left") {
		  	this.scrollLeft=scrollStartPos-event.touches[0].pageX;
		  } else {
			this.scrollTop=scrollStartPos-event.touches[0].pageY;
		  }
		  event.preventDefault();
	  },false);
	  
	  //We're done for touch devices so exit;
	  return;
  }
  
  
  Event.observe(window, 'load', function() {
	 thisObj.createViewer();
  });

 
  //Create the gallery container and navigation
  this.createViewer = function() {
  	
	//hide overflow and scrollbars first
	holder.setStyle({
	  overflow: 'hidden'
  	});
	 
	
	galmove = document.createElement("div");
	$(galmove).id = "galMove"+galcount;
	$(galmove).addClassName("galMover");
	var moveH = holder.getHeight();
	var moveW = holder.getWidth() - 2; //Total border width adjustment
	holder.setStyle({
	 padding: 0,
	 height: moveH+'px',
	 width: moveW+'px'
  	});	
		
	$(galmove).setStyle({
	  left: '0px', 
	  top: '0px', 
	  position: 'absolute', 
	  whiteSpace: 'nowrap'
  	});
	//replace the gallery with the container
	$(galId).replaceChild(galmove,gallery);
	//put the gallery back inside the container
	galmove.appendChild(gallery);
	
	size = galType == "left" ? $(galmove).getWidth() : $(galmove).getHeight(); //Gallery width or height
	if(size > holdsize) { //gallery is larger than the holder so continue
	
		//Add Nav/Status elements
		startDiv = document.createElement("div");
		endDiv = document.createElement("div");
		$(startDiv).id = "statusS"+galcount;
		$(endDiv).id = "statusE"+galcount;
		holder.appendChild(startDiv);
		holder.appendChild(endDiv);
		//Start observer
		loaded = true;
		holder.observe('mousemove', this.onMouseMove);
		holder.observe('mouseout', this.onMouseOut);
		
		if(startItem) {
			//var currentItem = $(gallery).firstDescendant();
			//var itemWidth = galType == "left" ? currentItem.getWidth() : currentItem.getHeight();
			
			//StartItem can be defined as a number or string: [S]tart,[E]end,[C]enter
			if(startItem == 'C') {
				var startPos =  Math.max(holdsize-size,-parseInt((size-holdsize) / 2))+'px';
			} else {
				var itemTotal = $(gallery).childElements().length;
				if (isNaN(startItem)) {
					if(startItem == 'E') {
						startItem = itemTotal;
					} else {
						startItem = 1;
					}
				}
				var startPos = Math.max(holdsize-size,-parseInt((size / itemTotal) * (startItem - 1)))+'px';
			}
			galmove.style[galType] = startPos;
		}
	}
	galcount++;
  }
  
  
  /*this.showhidediv = function (pos,status){
	if (endofgallerymsg!="") {
		
		if (galType == 'left') {
			if (pos == 'E' && status == 'off') {
				startDiv.style.backgroundPosition="100% 50%";
				endDiv.style.backgroundPosition="0% 50%";
			} else if(pos == 'S' && status == 'off') {
				startDiv.style.backgroundPosition="0% 50%";
				endDiv.style.backgroundPosition="100% 50%";
			} else {
				startDiv.style.backgroundPosition="0% 50%";
				endDiv.style.backgroundPosition="0% 50%";
			}
		} else {
			if (pos == 'E' && status == 'off') {
				startDiv.style.backgroundPosition="right top";
				endDiv.style.backgroundPosition="left top";
			} else if(pos == 'S' && status == 'off') {
				startDiv.style.backgroundPosition="left top";
				endDiv.style.backgroundPosition="right top";
			} else {
				startDiv.style.backgroundPosition="left top";
				endDiv.style.backgroundPosition="left top";
			}
		}
	}
  }*/
  
  
  this.moveback = function() {
	  if(stopmotion) {
		  scrollspeed = Math.max(0, scrollspeed - 0.5);
	  }
	  if (parseInt(galmove.style[galType])>(holdsize-size)){
		galmove.style[galType]=parseInt(galmove.style[galType])-scrollspeed+"px";
	  	movetime=setTimeout(function() { thisObj.moveback(); }, 5);;
	  	//showhidediv("S","on");
	  }
	  else {
	  	//showhidediv("S","off");
		clearTimeout(movetime);
	  }
	  //$('output').update(stopmotion + '<br />' + movestate + 'x' + scrollspeed);
  }
  
  this.moveforward = function() {
	  if(stopmotion) {
		  scrollspeed = Math.max(0, scrollspeed - 0.5);
	  }
	  if (parseInt(galmove.style[galType])<0){
		galmove.style[galType]=parseInt(galmove.style[galType])+scrollspeed+"px";
	  	movetime=setTimeout(function() { thisObj.moveforward(); }, 5);;
	  	//showhidediv("E","on");
	  }
	  else {
	  	//showhidediv("E","off");
		clearTimeout(movetime);
	  }
	  //$('output').update(stopmotion + '<br />' + movestate + 'x' + scrollspeed);
  }
  
  
  this.onMouseOut = function(e) {
	  //prevent nested elemnent triggering mouseout			
	  /*if (nestedTrigger(e)) {
		  return;
	  }*/
	  
	  //prevent nested element triggering mouseout			
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	//$('output').update(reltg.nodeName + '<br />' + movestate + 'x' + scrollspeed);
	if (reltg != null) {
		while (reltg != tg && reltg.nodeName != 'BODY') {
			//if (reltg.id == this.id || reltg.parentNode == null){return;}
			if (reltg.id == this.id ){return;} else if(reltg.parentNode == null){break;}
			reltg= reltg.parentNode
		}
	} 
	if (reltg== tg) return
	    
	  movestate = null;
	  stopmotion = true;
	  //clearTimeout(movetime);
  }
  
  
  this.onMouseMove = function(e) {
	  if(loaded) {
		stopmotion = false;
		var element = Event.element(e);
		var coord = holder.cumulativeOffset();
		curPos = galType == "left" ? Event.pointerX(e) - coord[0] : Event.pointerY(e) - coord[1];
		var leftbound=(holdsize-restarea)/2;
		var rightbound=(holdsize+restarea)/2;
		if(curPos>rightbound){
			scrollspeed=(curPos-rightbound)/((holdsize-restarea)/2) * maxspeed;
			if(movestate != "Back") {
				movestate = "Back";
				clearTimeout(movetime);
				thisObj.moveback();
			}
		} else if(curPos<leftbound) {
			scrollspeed=(leftbound-curPos)/((holdsize-restarea)/2) * maxspeed;
			if(movestate != "Forward") {
				movestate = "Forward";
				clearTimeout(movetime);
				thisObj.moveforward();
			}
		} else {
			movestate = null;
			clearTimeout(movetime);
		}
		
		//$('output').update(curPos + '<br />' + movestate + 'x' + scrollspeed);
	  }
  }
	
}
