/* Copyright IBM Corp. 2008  All Rights Reserved.                    */

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;
    }
}
