docs: function touchEnd(jqEvent) {
  			//As we use Jquery bind for events, we need to target the original event object
  			//If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.
  			var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent,
  			    touches = event.touches;
  
  			//If we are still in a touch with another finger return
  			//This allows us to wait a fraction and see if the other finger comes up, if it does within the threshold, then we treat it as a multi release, not a single release.
  			if (touches) {
  				if(touches.length) {
  					startMultiFingerRelease();
  					return true;
  				}
  			}
  			
  			//If a previous finger has been released, check how long ago, if within the threshold, then assume it was a multifinger release.
  			//This is used to allow 2 fingers to release fractionally after each other, whilst maintainig the event as containg 2 fingers, not 1
  			if(inMultiFingerRelease()) {	
  				fingerCount=previousTouchFingerCount;
  			}	
  		
  			//Set end of swipe
  			endTime = getTimeStamp();
  			
  			//Get duration incase move was never fired
  			duration = calculateDuration();
  			
  			//If we trigger handlers at end of swipe OR, we trigger during, but they didnt trigger and we are still in the move phase
  			if(didSwipeBackToCancel() || !validateSwipeDistance()) {
  			    phase = PHASE_CANCEL;
                  triggerHandler(event, phase);
  			} else if (options.triggerOnTouchEnd || (options.triggerOnTouchEnd == false && phase === PHASE_MOVE)) {
  				//call this on jq event so we are cross browser 
  				jqEvent.preventDefault(); 
  				phase = PHASE_END;
                  triggerHandler(event, phase);
  			}
  			//Special cases - A tap should always fire on touch end regardless,
  			//So here we manually trigger the tap end handler by itself
  			//We dont run trigger handler as it will re-trigger events that may have fired already
  			else if (!options.triggerOnTouchEnd && hasTap()) {
                  //Trigger the pinch events...
  			    phase = PHASE_END;
  			    triggerHandlerForGesture(event, phase, TAP);
  			}
  			else if (phase === PHASE_MOVE) {
  				phase = PHASE_CANCEL;
  				triggerHandler(event, phase);
  			}
  
  			setTouchInProgress(false);
  
              return null;
  		}