content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR.
   *  All rights reserved. This program and the accompanying materials
   *  are made available under the terms of the Eclipse Public License v1.0
   *  which accompanies this distribution, and is available at
   *  http://www.eclipse.org/legal/epl-v10.html
   *
   *  Contributors:
   *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
   */
  package tern.server.protocol.html;
  
  /**
   * {@link IState} implementation with a single {@link ScriptTagRegion}.
   *
   */
  class State implements IState {
  
  	private final ScriptTagRegion tagRegion;
  	private int index = 0;
  	private Region nextRegionToFind;
  
  	public State(ScriptTagRegion tagRegion) {
  		this.tagRegion = tagRegion;
  		this.nextRegionToFind = tagRegion.getOpenStartScript();
  	}
  
  	@Override
  	public Region update(char c) {
  		// is the given character and current index matches the next region to
  		// find?
  		MatchResult result = nextRegionToFind.match(c, index);
  		switch (result) {
  		case MATCHING:
  			// the given character matches the region.
  			// increment the index to check if the next character matches the
  			// region (on the next call of update).
  			index++;
  			break;
  		case NO_MATCHING:
  			// no matching, retry the match of the region.
  			index = 0;
  			break;
  		case MATCHED:
  			// the given character matches the full region.
  			index = 0;
  			switch (nextRegionToFind.getType()) {
  			case OPEN_START_SCRIPT:
  				// <script element found
  				// next region to find is >
  				nextRegionToFind = tagRegion.getCloseStartScript();
  				// return the current region which is <script
  				return tagRegion.getOpenStartScript();
  			case CLOSE_START_SCRIPT:
  				// > found
  				// next region to find is </script>
  				nextRegionToFind = tagRegion.getEndScript();
  				// return the current region which is >
  				return tagRegion.getCloseStartScript();
  			case END_SCRIPT:
  				// </script> element found
  				// next region to find is <script
  				nextRegionToFind = tagRegion.getOpenStartScript();
  				// return the current region which is </script>
  				return tagRegion.getEndScript();
  			}
  			break;
  		}
  		return null;
  	}
  
  	@Override
  	public boolean isNextRegionToFindType(RegionType type) {
  		return this.nextRegionToFind.getType() == type;
  	}
  
  	@Override
  	public void reset() {
  		index = 0;
  	}
  
  }