/* Copyright IBM Corp. 2008  All Rights Reserved.                    */

var LRO = '\u202D';
var RLO = '\u202E';
var PDF = '\u202C';
var LRE = '\u202A';
var RLE = '\u202B';
var LRM =  '\u200E';//
           // 'I';//
var RLM = '\u200F';

var ce_segmentsPointers = new Array();
    
var cePATH = "ceFILE_PATH";    
var ceEMAIL = "ceEMAIL";    
var ceURL = "ceURL";

var ce_type // = EMAIL; //
            cePATH; //determines type of complex expression
var ceInsertAlways = false;


function isBidiChar(c){    
    if(c >= '\u0030' && c <= '\u0039')
        return true;
    return (c > '\u00ff')? true : false;
}

function isLatinChar(c){
    if(c >= '\u0041' && c <= '\u005A')
        return true;    
    if(c >= '\u0061' && c <= '\u007A')
        return true;    
    return false;    
}

    /**
     * Determines which strong characters precedes a character in a given position 
     * into the given characters buffer, with taking into consideration a position of previous 
     * left-to-right marker which is strong left-to-right character itself. 
     * According to the algorithm, if a strong character before
     * a token is left-to-right, no left-to-right marker is needed in the point.   
     *  
     */
function isCharBeforeBiDiChar(buffer, i, previous) {
    if(ceInsertAlways)
        return true;
    while (i > 0){    
        if(i == previous)
            return false;
        i--;                        
        if(isBidiChar(buffer.charAt(i)))
            return true; 
        if(isLatinChar(buffer.charAt(i)))
            return false;             
       }
   return false;       
}    

    /**
     * Removes all meta-data markers from a string 
     */
function ceStripSpecialCharacters(str) {       
    if((str == null) || (str.length == 0)) 
        return str;                  
    var buf = "";
    var character;
    var i;
    for(i = 0; i < str.length; i++){
        character = str.charAt(i);
        if((character != LRE) && (character != RLE) 
            && (character != LRM) && (character != RLM)
            && (character != LRO) && (character != RLO) &&
               (character != PDF)) {
            buf+=character;
        }
    }
            
    return buf;       
}
   
function ceParse(str){    
    var i,i1;
    var delimiters;
    var previous = -1;    
    //erase ce_segmentsPointers
    //ce_segmentsPointers = new Array();
    if(ce_segmentsPointers != null){
        for(i=0; i<ce_segmentsPointers.length; i++)
            ce_segmentsPointers[i] = null;
    }
    var sp_len = 0;    

    if(ce_type == cePATH){
        delimiters = "/\\:.";         
        for (i = 0; i < str.length; i++)
            if ((delimiters.indexOf(str.charAt(i)) >= 0) &&
                    isCharBeforeBiDiChar(str,i,previous)){
                previous = i;    
                ce_segmentsPointers[sp_len] = i;
                sp_len++;
            }        
    
    } else if(ce_type == ceURL){

           var buffer_length = str.length;
           var path_end = str.indexOf('?');
            if (path_end < 0)
                path_end = buffer_length;

            i = str.indexOf('#');
            if (i < 0)
                i = buffer_length;
            
            path_end = Math.min(path_end, i);
                        
            // parse protocol, host, path
            delimiters = "/:.";
            for (i = 0; i < path_end; i++)
                if ((delimiters.indexOf(str.charAt(i))  >= 0)  &&
                        isCharBeforeBiDiChar(str,i,previous)){
                previous = i;    
                ce_segmentsPointers[sp_len] = i;
                sp_len++;
            }                    

            // parse filename, args, reference
            delimiters = "?=&#";
            for (i = path_end; i < buffer_length; i++)
                if ((delimiters.indexOf(str.charAt(i))  >= 0)  &&
                        isCharBeforeBiDiChar(str,i,previous)){
                previous = i;    
                ce_segmentsPointers[sp_len] = i;
                sp_len++;
            }               
    } else if(ce_type == ceEMAIL){
        
        delimiters = "<>@.,;";         
        var inQuotes = false;    
        
        for(i = 0; i < str.length; i++){            
            if (str.charAt(i) == '\"') {
                if (isCharBeforeBiDiChar(str,i,previous)){
                    previous = i;    
                    ce_segmentsPointers[sp_len] = i;
                    sp_len++;
                }                    
                i++;
                i1 = str.indexOf('\"', i);
                if(i1 >= i)
                    i = i1;
                if (isCharBeforeBiDiChar(str,i,previous)){
                    previous = i;    
                    ce_segmentsPointers[sp_len] = i;
                    sp_len++;
                }                                   
            }
            
            if ((delimiters.indexOf(str.charAt(i)) >= 0) &&
                    isCharBeforeBiDiChar(str,i,previous)){
                        previous = i;    
                        ce_segmentsPointers[sp_len] = i;
                        sp_len++;
            }                                            
        }                    
    }
    
    return ce_segmentsPointers;
}   
   
   
   
    /**
     * Inserts left-to-right markers in beginning of a parsed string, if necessary 
     */
   
function ceInsertMarkers(str) {
    str = ceStripSpecialCharacters(str);
    
    ce_segmentsPointers = ceParse(str);
    
    var buf = str;
    shift = 0;                                                
    var n;
    for (i = 0; i< ce_segmentsPointers.length; i++) {
        n = ce_segmentsPointers[i];
        if(n != null){
            preStr = buf.substring(0, n + shift);
            postStr = buf.substring(n + shift, buf.length);
            //buf.insert(n + shift, LRM);
            buf = preStr + LRM + postStr;
            shift++;
        }                                  
    }
    return buf;        
}

function ceRemoveMarkers(str){
    ceInsertAlways= true;
    ce_segmentsPointers = ceParse(str);
    ceInsertAlways = false;
    
    buf = str;            
    var n;
    var shift = 0;
    for(i = 0; i < str.length; i++) {                   
        n = ce_segmentsPointers[i];
        if(n!=null)
            if(n>=0 && n<buffer.length)
                if(buf.charAt[n] == LRM){                
                    preStr = buf.substring(0, n + shift);
                    postStr = buf.substring(n + shift +1, buf.length);
                    buf = preStr + postStr;
                    shift--;
                }                            
        }                
        return buf;            
}    
   
