/******************************************************************
	Mehaot
******************************************************************/
function replaceMehaot( input ){

	var retVal = input;

	for( var i = 0; i < input.length; ++i ){
		if( input.charAt(i) == '\"' ){ // If we have a mechaot
			if( i > 0 && i < ( input.length - 1 ) ){	// if we are inside the input string
			// if we are not in a Samank"al situation...replace mechaot with geresh
			if (!isWhiteSpace(input.charAt(i-1)) &&  !isWhiteSpace(input.charAt(i+1)) ){ 
			retVal = retVal.substring(0,i) + '\'' + '\'' + retVal.substring(i+1);			
					}
				}
			//	else if( i == (input.length - 1 ))
			//		retVal = retVal.substring(0,i) + '\'';
			//	else // i == 0
			//		retVal = '\'' + retVal.substring(1);
			}
		}
			return retVal;
	}

function isWhiteSpace( ch ){
	return  ( ch == ' ' || ch == '\t' );
}

/*********************************************************
	Replace Special Chars
*********************************************************/
function replaceSpecialChars( query )
{
	var retVal = query.replace( /,/g , "" );
	
	retVal = replaceRecursive_A( retVal );
	retVal = retVal.replace( /\/\/+/g, "//" );
	
	
	retVal = replaceRecursive_B( retVal );
	retVal = retVal.replace( /\\\\+/g, "\\\\" );
	
	return retVal;
}

function replaceRecursive_A( input )
{
	var matchResults = input.match( /\/+([0-9]*)\/+/ );
	
	if( matchResults == null )				// Exit Condition
		return input.replace( /\//g, "" );
		
	var firstIndex = input.search(  /\/+([0-9]*)\/+/ );
	var secondIndex = firstIndex + matchResults[0].length;
		
	if( input.length == secondIndex )		// Single recursion call
		return replaceRecursive_A(input.substring( 0, firstIndex )) + 	matchResults[0];
	else									// Binary recursion call
		return replaceRecursive_A(input.substring( 0, firstIndex )) + 	matchResults[0] +
				replaceRecursive_A(input.substring( secondIndex ));
}

function replaceRecursive_B( input )
{
	var matchResults = input.match( /\\+([0-9]*)\\+/ );
	
	if( matchResults == null )				// Exit Condition
		return input.replace( /\\/g, "" );
		
	var firstIndex = input.search(  /\\+([0-9]*)\\+/ );
	var secondIndex = firstIndex + matchResults[0].length;
	
	if( input.length == secondIndex )		// Single recursion call
		return replaceRecursive_B(input.substring( 0, firstIndex )) + 	matchResults[0];
	else									// Binary recursion call
		return replaceRecursive_B(input.substring( 0, firstIndex )) + 	matchResults[0] +
				replaceRecursive_B(input.substring( secondIndex ));
}

/*********************************************************
	Recursive replace Touples 
*********************************************************/
function replaceAllTouples( query )
{
	var matchResults = query.match( /".*"/ );
	
	if( matchResults == null )				// Exit Condition
		return replaceAllTouplesBase( query );
		
	var firstIndex = query.search(  /".*"/ );
	var secondIndex = firstIndex + matchResults[0].length;
		
	if( query.length == secondIndex )		// Single recursion call
		return replaceAllTouples(query.substring( 0, firstIndex )) + 	matchResults[0];
	else									// Binary recursion call
		return replaceAllTouples(query.substring( 0, firstIndex )) + 	matchResults[0] +
				replaceAllTouples(query.substring( secondIndex ));
}

/*********************************************************
	Replace Touples Base case
*********************************************************/
function replaceAllTouplesBase( query ){
    if(( query == null ) || ( query.length == 0 ))     return query;
    
    var retVal = "";
    
    var terms = query.split( ' ' ); // Trim and split
    
    for( var i = 0; i < terms.length - 2; ++i ){
        var firstTerm  = terms[ i ];
        var secondTerm = terms[ i + 1 ];
        var thirdTerm  = terms[ i + 2 ];
        
        var threeTermsMatch = threeWordMatch( firstTerm, secondTerm, thirdTerm );
            
        if( threeTermsMatch  == null ){ // No 3-Touple match
            var twoTermsMatch = twoWordMatch( firstTerm, secondTerm );
            if( twoTermsMatch == null ){ // no 2-Touple match
                retVal += firstTerm + ' ';
                terms[ i ] = null;
            } else { // Two word matching
                retVal += twoTermsMatch + ' ';
                terms[ i ]     = null;
                terms[ i + 1 ] = null;
                ++i;
            }
        } else { // Three word matching
            retVal += threeTermsMatch + ' ';
            terms[ i ]     = null;
            terms[ i + 1 ] = null;            
            terms[ i + 2 ] = null;            
            i += 2;
        }
    }
    
    if( terms.length >= 2 ){
        var preLastTerm = terms[ terms.length - 2 ];
        var lastTerm    = terms[ terms.length - 1 ];
        var twoLastTermsMatch = twoWordMatch( preLastTerm, lastTerm );
    
        if( twoLastTermsMatch == null ){ // no 2-Touple match
	if( preLastTerm != null ) 
            retVal += preLastTerm + ' ';
            terms[ terms.length - 2 ] = null;
        } else { // Two word matching
            retVal += twoLastTermsMatch + ' ';
            terms[ terms.length - 2 ] = null;
            terms[ terms.length - 1 ] = null;
        }
    }
    if( terms.length >= 1 ){
        var lastTerm = terms[ terms.length - 1 ];
        if( lastTerm != null ){
            retVal += lastTerm + ' ';
        }
    }

    if( retVal.length > 0 ){
        retVal = retVal.substr( 0, retVal.length - 1 );
    }

    return retVal;
}

function replaceAllTouples( query )
{
	var matchResults = query.match( /".*"/ );
	
	if( matchResults == null )				// Exit Condition
		return replaceAllTouplesBase( query );
		
	var firstIndex = query.search(  /".*"/ );
	var secondIndex = firstIndex + matchResults[0].length;
		
	if( query.length == secondIndex )		// Single recursion call
		return replaceAllTouples(query.substring( 0, firstIndex )) + 	matchResults[0];
	else									// Binary recursion call
		return replaceAllTouples(query.substring( 0, firstIndex )) + 	matchResults[0] +
				replaceAllTouples(query.substring( secondIndex ));
}

function replaceAllTouplesBase( query ){
    if(( query == null ) || ( query.length == 0 ))     return query;
    
    var retVal = "";
    
//    var terms = query.replace(/^\s+|\s+$/g, '').split( ' ' ); // Trim and split

    var terms = query.split( ' ' ); // Trim and split
    
    for( var i = 0; i < terms.length - 2; ++i ){
        var firstTerm  = terms[ i ];
        var secondTerm = terms[ i + 1 ];
        var thirdTerm  = terms[ i + 2 ];
        
        var threeTermsMatch = threeWordMatch( firstTerm, secondTerm, thirdTerm );
            
        if( threeTermsMatch  == null ){ // No 3-Touple match
            var twoTermsMatch = twoWordMatch( firstTerm, secondTerm );
            if( twoTermsMatch == null ){ // no 2-Touple match
                retVal += firstTerm + ' ';
                terms[ i ] = null;
            } else { // Two word matching
                retVal += twoTermsMatch + ' ';
                terms[ i ]     = null;
                terms[ i + 1 ] = null;
                ++i;
            }
        } else { // Three word matching
            retVal += threeTermsMatch + ' ';
            terms[ i ]     = null;
            terms[ i + 1 ] = null;            
            terms[ i + 2 ] = null;            
            i += 2;
        }
    }
    
    if( terms.length >= 2 ){
        var preLastTerm = terms[ terms.length - 2 ];
        var lastTerm    = terms[ terms.length - 1 ];
        var twoLastTermsMatch = twoWordMatch( preLastTerm, lastTerm );
    
        if( twoLastTermsMatch == null ){ // no 2-Touple match
	if( preLastTerm != null ) 
            retVal += preLastTerm + ' ';
            terms[ terms.length - 2 ] = null;
        } else { // Two word matching
            retVal += twoLastTermsMatch + ' ';
            terms[ terms.length - 2 ] = null;
            terms[ terms.length - 1 ] = null;
        }
    }
    if( terms.length >= 1 ){
        var lastTerm = terms[ terms.length - 1 ];
        if( lastTerm != null ){
            retVal += lastTerm + ' ';
        }
    }

    if( retVal.length > 0 ){
        retVal = retVal.substr( 0, retVal.length - 1 );
    }

    return retVal;
}
