/* ***************************************************************** */
/*                                                                   */
/* IBM Confidential                                                  */
/*                                                                   */
/* OCO Source Materials                                              */
/*                                                                   */
/* Copyright IBM Corp. 2008                                          */
/*                                                                   */
/* The source code for this program is not published or otherwise    */
/* divested of its trade secrets, irrespective of what has been      */
/* deposited with the U.S. Copyright Office.                         */
/*                                                                   */
/* ***************************************************************** */

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;            
}    
   
/* ***************************************************************** */
/*                                                                   */
/* IBM Confidential                                                  */
/*                                                                   */
/* OCO Source Materials                                              */
/*                                                                   */
/* Copyright IBM Corp. 2008                                          */
/*                                                                   */
/* The source code for this program is not published or otherwise    */
/* divested of its trade secrets, irrespective of what has been      */
/* deposited with the U.S. Copyright Office.                         */
/*                                                                   */
/* ***************************************************************** */

var VK_LEFT  = 0x25;
var VK_RIGHT = 0x27;
var VK_HOME  = 0x24;
var VK_END   = 0x23;
var VK_SHIFT = 0x10;
var VK_BACK = 0x8;
var VK_DELETE = 0x2e;

var isIE;
var ce_str0;

var fOnCut = new Function("ceCutText(this);");
var fOnCopy = new Function("ceCopyText(this);");

function ceInsertMarkersforStaticString(str, ce_type1){
    ce_type = ce_type1;
    return LRE + ceInsertMarkers(str) + PDF;     
}

function ceAttach(ce_field, ce_type1){
    if (ce_field) {
    	ce_field.alt = ce_type1;
    	ceSetHandlers(ce_field);
    }
}

function ceSetHandlers(ce_field){
    ce_type = ce_field.alt;
    ce_field.dir = "ltr";
  
    if(document.body.dir == "rtl")  
        ce_field.style.textAlign =  "right";
        
    isIE =(navigator.appName == 'Microsoft Internet Explorer');

    if(isIE){
        ce_field.onkeydown = new Function("ceKeyDown(event);");
        ce_field.onkeyup = new Function("ceKeyUp(event);");
    } else {
        ce_field.onkeyup = ceKeyUp;
        ce_field.onkeydown = ceKeyDown;        
    }

    ce_field.oncut=fOnCut;
    ce_field.oncopy=fOnCopy;
    
    ce_field.value = ceInsertMarkers(ce_field.value);    
}

function ceInitFields(){
    var elements = document.getElementsByTagName("input");    
    for(var i=0; i < elements.length; i++)
        if(elements[i].alt == cePATH || elements[i].alt == ceEMAIL || elements[i].alt == ceURL)
            ceSetHandlers(elements[i]);
    
}

function ceKeyDown(event){
    isIE =(navigator.appName == 'Microsoft Internet Explorer');
    obj = (isIE) ? event.srcElement : event.target;        
    ce_type = obj.alt;
    ce_str0 = obj.value;
}

function ceKeyUp(event){

    isIE =(navigator.appName == 'Microsoft Internet Explorer');

    obj = (isIE) ? event.srcElement : event.target;
        
    str1 = obj.value;

    if(obj.alt != "")
        ce_type = obj.alt;

    ieKey = event.keyCode;

    if ((ieKey == VK_HOME)
        || (ieKey == VK_END)
        || (ieKey == VK_SHIFT))
    return;

    var cursorStart, cursorEnd;


    var selection = ceGetCaretPos(event,obj);
    if (selection) {
        cursorStart = selection[0];
        cursorEnd = selection[1];
    }


    //Jump over a cursor processing
    if(isIE) {

        var cursorStart1, cursorEnd1;
        cursorStart1 = cursorStart;
        cursorEnd1 = cursorEnd;
        
        if(ieKey == VK_LEFT){
             if ((str1.charAt(cursorEnd-1) == LRM)
               && (cursorStart == cursorEnd)
               )
                 ceSetSelectedRange(obj,cursorStart - 1,cursorEnd - 1);
             return;
        }        

        if(ieKey == VK_RIGHT){             
             if (str1.charAt(cursorEnd-1) == LRM){
                 cursorEnd1 = cursorEnd + 1;
                 if (cursorStart == cursorEnd)
                     cursorStart1 = cursorStart + 1;
             }

             ceSetSelectedRange(obj,cursorStart1,cursorEnd1);                        
             return;
        }                   
    } else { //Firefox
        if(ieKey == VK_LEFT) {
            if (str1.charAt(cursorEnd-1) == LRM)
                ceSetSelectedRange(obj,cursorStart - 1,cursorEnd - 1);
            return;
        }
        if(ieKey == VK_RIGHT) {
            if (str1.charAt(cursorEnd-1) == LRM)
                ceSetSelectedRange(obj,cursorStart + 1,cursorEnd + 1);
            return;
        }
    }
   
    str2 = ceInsertMarkers(str1);


    if(str1 != str2)
    {
        obj.value = str2;
        
        if((ieKey == VK_DELETE) && (str2.charAt(cursorEnd)==LRM))
            obj.value = str2.substring(0,cursorEnd) + str2.substring(cursorEnd+2,str2.length);             

        if(ieKey == VK_DELETE) 
            ceSetSelectedRange(obj,cursorStart,cursorEnd);
        else if(ieKey == VK_BACK){ 
                if(ce_str0.charAt(cursorEnd-1)==LRM)
                    ceSetSelectedRange(obj,cursorStart - 1,cursorEnd - 1);
                    else
                    ceSetSelectedRange(obj,cursorStart,cursorEnd);
            }
        else
        if (obj.value.charAt(cursorEnd) != LRM)
            ceSetSelectedRange(obj,cursorStart + 1,cursorEnd + 1);
    }

}

function ceProcessCopy(obj,text,isReverse){
    if(text == null) {
        if(isIE) {
            range = document.selection.createRange();
            text = range.text;
        } else
            text = obj.value.substring(obj.selectionStart,obj.selectionEnd);
    }

    textToClipboard = ceStripSpecialCharacters(text);

    if(isIE) {
        window.clipboardData.setData("Text", textToClipboard);
        return true;
    }
    else try {
        return ((window.SignedJs.ceProcessCopy(textToClipboard)) ? true : false);
    }
    catch(e){ return false;   }
}
 
function ceCopyText(obj){
    if(isIE)
        event.returnValue = false;

    return ceProcessCopy(obj,null,false);
}

function ceCutText(obj){
    var ret = ceProcessCopy(obj,null,false);
    if(!ret) 
        return false;

    if(isIE) {
        curPos = obj.selectionStart; 
        range = document.selection.clear();
    } else {
        curPos = obj.selectionStart;
        obj.value = obj.value.substring(0,curPos) + obj.value.substring(obj.selectionEnd);
        obj.setSelectionRange(curPos,curPos);
    }

    return true;

}

function ceGetCaretPos(event,obj){
    if(!isIE) 
        return new Array(event.target.selectionStart, event.target.selectionEnd);    
    else {
        var position = 0;
        var range = document.selection.createRange().duplicate();
        var range2 = range.duplicate();
        var rangeLength = range.text.length;
        
        if (obj.type == "textarea")
            range2.moveToElementText(obj);
        else
            range2.expand('textedit');

        while (range.compareEndPoints('StartToStart', range2) > 0) {
            range.moveStart('character', -1);
            ++position;
        }
        
        return new Array(position, position + rangeLength);
    }
}

function ceSetSelectedRange(obj,selectionStart,selectionEnd){
    if(isIE) {
        var range = obj.createTextRange();
        if (range) {
            if (obj.type == "textarea")
                range.moveToElementText(obj);
            else
                range.expand('textedit');

            range.collapse();            
            range.moveEnd('character', selectionEnd);
            range.moveStart('character', selectionStart);
            range.select();
        }
    } else {        
        obj.selectionStart=selectionStart;
        obj.selectionEnd=selectionEnd;
    }
}

