/*	fullJS.js (C) CGD 2004,2005,2006,2007,2008															 */
/** --------------------------------------------------------------------------------------------------  **/
/* > JR, added 'marketId' parameter to openDetailS()										- 16/07/2008 */
/* > JR, added cancelFocusToDatePickerAlt()													- 06/05/2008 */
/* > JR, added aspnm_hideIFrameElements() and aspnm_restoreSomeIFrameElements				- 02/05/2008 */
/* > JR, added focusToDatePickerALT()														- 02/05/2008 */
/* > JR, added 'marketId' parameter to openDetailL()										- 24/04/2008 */
/* > MS, added precision calculator															- 18/04/2008 */
/* > PP, added function replaceLast															- 26/03/2008 */
/* > AM, V23, parseInt2																		- 08/03/2008 */
/* > JG remove of getCharFilledString() - included on VgnAmountTag javascript generation	- 27/02/2008 */
/* > MS getCharFilledString() for amount component with dinamic number of decimal places	- 21/01/2008 */
/* > PP SGAF branch - openDetails....various wrappers										- 16/01/2008 */
/* > PP SGAF branch - openReceiptWindow ((form name was hard coded)							- 11/01/2008 */
/* > PP, AJAX ERROR MESSAGES from SGAF branch												- 14/12/2007 */
/* > JR, window.onLoad editor																- 12/12/2007 */
/* > AM, V18																				- 16/10/2007 */
/** --------------------------------------------------------------------------------------------------  **/


/* ALERT POPUP */ 

var focusedObj = null;
var kb = null;
var actionCode = null;

window.onBeforeOnload = closeSession();

function closeSession(){

	//alert('close session');
}

function showAlert(message, object) {
    kb = document.getElementById("keyboard");
    if (kb) {
        kb.style.display = 'none';
    }

    if (object) {
        focusedObj = object;
        if (object.blur) object.blur();
    } else {
        focusedObj = null;
    }

    var alertMessage = document.getElementById("alertMessage");
    alertMessage.innerHTML=message;

    showOnTopDIV("fullTransparentDIV");
    showDIV("alertDIV");
    if(browser.isIE){
    	if(alertMessage){
		    alertMessage.focus();
		}
	}
}

function showActionAlert(message, _actionCode) {
    actionCode = _actionCode;
    kb = document.getElementById("keyboard");
    if (kb) {
        kb.style.display = 'none';
    }

    var alertMessage = document.getElementById("alertMessage");
    alertMessage.innerHTML = message;

    showOnTopDIV("fullTransparentDIV");
    showDIV("alertDIV");
    if(browser.isIE){
    	if(alertMessage){
	    	alertMessage.focus();
	    }
	}
}

/* END - ALERT POPUP */



/* QUESTION POPUP */

function askQuestion(message,yesCode,noCode) {
    var questionMessage = document.getElementById("questionMessage");
    // Place the validation errors
    questionMessage.innerHTML = message;
    document.getElementById("questionYes").onclick = function() {
        hideDIV('questionDIV');
        eval(yesCode);
        //askQuestion= function(){return;}
    };
    if (noCode) {
        document.getElementById("questionNo").onclick = function() {
            hideOnTopDIV('fullTransparentDIV');
            hideDIV('questionDIV');
            eval(noCode);
        };
    } else {
        document.getElementById("questionNo").onclick = function() {
            hideOnTopDIV('fullTransparentDIV');
            hideDIV('questionDIV');
        };
    }

    // Show the div with the confirmation
    showOnTopDIV("fullTransparentDIV");
    showDIV("questionDIV");
    if(browser.isIE){
    	if(questionMessage){
	    	questionMessage.focus();
	    }
	}
}

function showOneButtonAlert(message,buttonCode) {
    var questionMessage = document.getElementById("questionMessage");
    // Place the validation errors
    questionMessage.innerHTML = message;
    document.getElementById("questionYes").innerHTML = 'Cancelar';
    document.getElementById("questionYes").onclick = function() {
        hideDIV('questionDIV');
        eval(buttonCode);
    };
    document.getElementById("questionNo").style.display = 'none';

    // Show the div with the confirmation
    showOnTopDIV("fullTransparentDIV");
    showDIV("questionDIV");
    if(browser.isIE){
    	if(questionMessage){
	    	questionMessage.focus();
	    }
	}
}

/* END QUESTION POPUP */

/* WAIT POPUP */
function showWaitMessage() {
    showOnTopDIV("fullTransparentDIV");
    showDIV("waitPopupDIV");
    if (document.getElementById('keyboard')) {
      document.getElementById('keyboard').style.display = 'none';
    }
}

function hideWaitMessage() {
    hideOnTopDIV("fullTransparentDIV");
   	hideWaitPopupDIV();
}

function hideWaitPopupDIV(){
    hideDIV("waitPopupDIV");
}



/* VALIDATOR POPUP */
var kb = null;
function showValidator(messages) {
    kb = document.getElementById("keyboard");
    if (kb) {
        kb.style.display = 'none';
    }
    // Place the validation errors
    document.getElementById("messages").innerHTML=messages;
    // Show the div with the confirmation
    showOnTopDIV("fullTransparentDIV");
    showDIV("validatorDIV");
    //WAI addition
    if(browser.isIE){
    	if(document.getElementById("messages")){
	    	document.getElementById("messages").focus();//errButtonOk
	    }
	}
}


/* used with the writeValidatorWADiv.jsp div and VgnJavascriptValidatorTag@showMessageMethodJS method 	*/
/* in international transfers (overides normal validator messages display) 								*/
function showValidatorDIV(messages) {
    kb = document.getElementById("keyboard");
    if (kb) {
        kb.style.display = 'none';
    }
    // Place the validation errors
    document.getElementById("messagesDIV2").innerHTML=messages;
    // Show the div with the confirmation
    showOnTopDIV("fullTransparentDIV");
    showDIV("validatorDIV2");
}


function enableCtrlKeyCombination(e)
{
        //list all CTRL + key combinations you want to disable
        
        //Se quiserem acrescentar aqui novas keys que possam ser usadas no FireFox 
        //para serem filtradas conjuntamente com o ctrl, adicionem as keys pretendidas a este array
		var allowedKeys = new Array('v');
        var key;
        var isCtrl;

		if(window.event)
        {
                key = window.event.keyCode;     //IE
                if(window.event.ctrlKey)
                        isCtrl = true;
                else
                        isCtrl = false;
        }
        else
        {
                key = e.which;     //firefox
                if(e.ctrlKey)
                        isCtrl = true;
                else
                        isCtrl = false;
        }

        //if ctrl is pressed check if other key is in forbidenKeys array
        if(isCtrl)
        {
                for(i=0; i<allowedKeys.length; i++)
                {
                        //case-insensitive comparation
                        if(allowedKeys[i].toLowerCase() == String.fromCharCode(key).toLowerCase())
                        {
                                return true;
                        }
                }
        }

                return false;



}


/* fieldTypes.js **************************************************************/
function numbersOnly(myfield, e, dec)
{
    var key;
    var keychar;

    if (e)
        key = (e.which)? e.which: e.keyCode;
    else if (window.event) {
        e = window.event;
        key = (e.which)?e.which:e.keyCode;
    } else
        return true;
    keychar = String.fromCharCode(key);

    // control keys
    if ((key == null) || (key == 0) || (key == 8) ||
        (key == 9) || (key == 13) || (key == 27))
        return true;

    // numbers
    else if ((("0123456789").indexOf(keychar) > -1))
        return true;

    // decimal point jump
    /*
    else if (dec && (keychar == "."))
       {
       myfield.form.elements[dec].focus();
       return false;
       }
    */
    else if ((keychar == ".") && dec && (dec == true))
    {
        return true;
    } if( enableCtrlKeyCombination(e) )
    	return true;
    else
        return false;
}



// -----------------------------------------------------------------------------
function justNumberOnly(e){
    var key;
    var keychar;

    if (e)
        key = (e.which)? e.which: e.keyCode;
    else if (window.event) {
        e = window.event;
        key = (e.which)?e.which:e.keyCode;
    } else
       return true;

    if (e.altKey == 1 || e.shiftKey == 1 || e.ctrlKey == 1 ) return false;

    keychar = String.fromCharCode(key).toLowerCase();

    // control keys
    if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) )  return false;

    // numbers
    var numcheck = /\d/;
    if (numcheck.test(keychar))
       return true;
    else
       return false;
}
//-----------------------------------------------------------------------------
function pasteNumberOnly(dec){

    if (window.clipboardData) {
        var clipChar = window.clipboardData.getData("Text");
        var ValidChars = "0123456789."
        var Char ;
        var IsNumber = false;

        if ((clipChar == null) || (clipChar == ""))
            return true;

        for (i = 0; (i < clipChar.length) && (IsNumber == false); i++) {
            Char = clipChar.charAt(i);
            if (ValidChars.indexOf(Char) == -1) {
                IsNumber = true;
            }
        }

        if (IsNumber) {
            window.clipboardData.setData("Text", "");
        }
    }

    return IsNumber;
}


function alphaOnly(e)
{
    var key;
    var keychar;

    if (e)
        key = (e.which)? e.which: e.keyCode;
    else if (window.event) {
        e = window.event;
        key = (e.which)?e.which:e.keyCode;
    } else
       return true;

    if (e.altKey == 1 || e.ctrlKey == 1 ) return false;

    keychar = String.fromCharCode(key);
    keychar = keychar.toLowerCase();

    // control keys
    if ((key==null) || (key==0) || (key==8) ||
        (key==9) || (key==13) || (key==27) )
       return true;

    // alphas and numbers
    else if ((("abcdefghijklmnopqrstuvwxyz0123456789").indexOf(keychar) > -1))
       return true;
    else
       return false;
}


function noQuoteOrDoubleQuote(e)
{
    var key;
    var keychar;

    if (e)
        key = (e.which)? e.which: e.keyCode;
    else if (window.event) {
        e = window.event;
        key = (e.which)?e.which:e.keyCode;
    } else
       return true;

    if (e.altKey == 1 || e.ctrlKey == 1 ) return false;

    keychar = String.fromCharCode(key);
    keychar = keychar.toLowerCase();

    // control keys
    if ((key==null) || (key==0) || (key==8) ||
        (key==9) || (key==13) || (key==27) )
       return true;

    // alphas and numbers
    else if (!(("\"'").indexOf(keychar) > -1))
       return true;
    else
       return false;
}


// -----------------------------------------------------------------------------

function alphaToUpperCase(e)
{
var key;
var keychar;

if (window.event)
   key = window.event.keyCode;
else if (e)
   key = e.which;
else
   return true;
keychar = String.fromCharCode(key);
keychar = keychar.toUpperCase();
e
// control keys
if ((key==null) || (key==0) || (key==8) ||
    (key==9) || (key==13) || (key==27) )
   return true;

// alphas and numbers
else if ((("ABCDEFGHIJKLMNOPQRSTUVWXYZ ").indexOf(keychar) > -1))
   return true;
else
   return false;
}

// -----------------------------------------------------------------------------
function lettersOnly(e)
{
var key;
var keychar;



if (window.event && window.event.keyCode)
   key = window.event.keyCode;
else if (e)
   key = e.which;
else {
    return true;
}

keychar = String.fromCharCode(key);
keychar = keychar.toLowerCase();

// control keys
if ((key==null) || (key==0) || (key==8) ||
    (key==9) || (key==13) || (key==27) )
return true;

// alphas
else if ((("abcdefghijklmnopqrstuvwxyz ").indexOf(keychar) > -1))
   return true;
else
   return false;
}
// -----------------------------------------------------------------------------
function pasteLetterOnly(){
 var IsLetter = false;
 if (window.clipboardData) {
     var clipChar = window.clipboardData.getData("Text");
     var Char ;
     var ValidChars = "abcdefghijklmnopqrstuvwxyz";


    if ( clipChar == null || clipChar == "" )
      return IsLetter;

     for (i = 0; i < clipChar.length  && IsLetter  == false; i++)    {
         Char =  clipChar.charAt(i);
         if (ValidChars.indexOf(Char) == -1)   {
              IsLetter = true;
           }
      }
     if(IsLetter ){
       window.clipboardData.setData("Text","");
     }
 }
 return IsLetter;

}


function pasteThisCharsetOnly( charset, caseSensitive){
 var IsOK = false;
 if (window.clipboardData) {
     var clipChar = window.clipboardData.getData("Text");
     var Char ;

      if ( clipChar == null || clipChar == "" )
          return IsOK;

     if (caseSensitive && (caseSensitive == true)) {
            clipChar = clipChar.toLowerCase();
     }



     for (i = 0; i < clipChar.length  && IsOK  == false; i++)    {
         Char =  clipChar.charAt(i);
         if (charset.indexOf(Char) == -1)   {
              IsOK = true;
           }
      }
     if(IsOK ){
       window.clipboardData.setData("Text","");
     }
 }
 return IsOK;

}
//----------------------------------------------------
//-----------------------------------------------------------------------------
function thisCharsetOnly(e,charset,caseSensitive)
{
var key;
var keychar;

if (window.event)
   key = window.event.keyCode;
else if (e)
   key = e.which;
else
   return true;
keychar = String.fromCharCode(key);
if (caseSensitive && (caseSensitive == true)) {
    keychar = keychar.toLowerCase();
}

// control keys
if ((key==null) || (key==0) || (key==8) ||
    (key==9) || (key==13) || (key==27) )
   return true;

// alphas and numbers
else if (((charset).indexOf(keychar) > -1))
   return true;
else
   return false;
}
//----------------------------------------------------
function submitEnter(myfield,e)
{
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.which;
    else return true;

    if (keycode == 13)
    {
       myfield.form.submit();
       myfield.onkeypress=function(){ showAlert(executingOperationI18n); return true;};
       return false;
    } else
       return true;
}

/* div_script.js **************************************************************/
var ez_strictHTML = 0;
var ez_usefx = 0;
var ez_isMac = (navigator.appVersion.indexOf("Mac") != -1);
var ez_NN4 = document.layers?1:0;
var ez_IE4 = document.getElementById?0:1;
var ez_OPR = (navigator.userAgent.indexOf("Opera") != -1)?1:0;
var ez_OPR7 = 0;
var ez_isIE = (navigator.appVersion.indexOf("MSIE") > -1)?1:0;
var ez_NS6 = (document.getElementById && !document.all && !ez_OPR)?1:0;
if (ez_OPR) {
    temp = navigator.userAgent.split("Opera");
    if (temp[1].substring(0, 1) == "/") {
        temp = temp[1].split("/");
    }
    ver = parseFloat(temp[1]);
    if (ver >= 7)ez_OPR7 = 1;
    if (ver < 7)ez_strictHTML = 0;
}

var ez_MOZ = 0;
ez_MOZ = (navigator.userAgent.indexOf("ozilla") != -1)?1:0;
ez_SAF = (navigator.userAgent.indexOf("Safari") != -1)?1:0;
var aspnm_hideSelectElems = true;
var aspnm_restoreSelectElems = true;
var aspnm_hideIFrameElems = true;
var aspnm_restoreIFrameElems = true;
var aspnm_mac = false;
aspnm_hideSelectElems = aspnm_restoreSelectElems = (ez_isIE && !ez_OPR7);
//aspnm_hideIFrameElems = aspnm_restoreIFrameElems = (ez_isIE && !ez_OPR7);
aspnm_hideIFrameElems = aspnm_restoreIFrameElems = true;

function aspnm_hideSelectElements(group)
{
    if (aspnm_hideSelectElems && document.getElementsByTagName)
    {
        var arrElements = document.getElementsByTagName('select');
        for (var i = 0; i < arrElements.length; i++) {
            if (aspnm_objectsOverlapping(document.all[group], arrElements[i])) {
                arrElements[i].style.visibility = 'hidden';
            }
        }
    }
}

function aspnm_restoreSomeSelectElements(group)
{
    if (aspnm_restoreSelectElems && document.getElementsByTagName)
    {
        var arrElements = document.getElementsByTagName('select');
        for (var i = 0; i < arrElements.length; i++) {
            if (aspnm_objectsOverlapping(document.all[group], arrElements[i])) {
                arrElements[i].style.visibility = 'visible';
            }
        }
    }
}

function aspnm_restoreAllSelectElements()
{
  
        var arrElements = document.getElementsByTagName('select');
        for (var i = 0; i < arrElements.length; i++) {
         
                arrElements[i].style.visibility = 'visible';
            
        }
    
}

function aspnm_restoreSelectElements()
{
    if (aspnm_restoreSelectElems && document.getElementsByTagName)
    {
        var arrElements = document.getElementsByTagName('select');
        for (var i = 0; i < arrElements.length; i++) {
            arrElements[i].style.visibility = 'visible';
        }
    }
}

function aspnm_hideIFrameElements(group) {
	if (aspnm_hideIFrameElems && document.getElementsByTagName) {
		var arrElements = document.getElementsByTagName('iframe');
		for (var i = 0; i < arrElements.length; i++) {
            if (aspnm_objectsOverlapping(document.all[group], arrElements[i])) {
                arrElements[i].style.visibility = 'hidden';
            }
        }
	}
}

function aspnm_restoreSomeIFrameElements(group)
{
    if (aspnm_restoreIFrameElems && document.getElementsByTagName)
    {
        var arrElements = document.getElementsByTagName('iframe');
        for (var i = 0; i < arrElements.length; i++) {
            if (aspnm_objectsOverlapping(document.all[group], arrElements[i])) {
                arrElements[i].style.visibility = 'visible';
            }
        }
    }
}

function aspnm_objectsOverlapping(obj1, obj2)
{
    var result = true;
    var obj1Left = aspnm_pageX(obj1) - window.document.body.scrollLeft;
    var obj1Top = aspnm_pageY(obj1) - window.document.body.scrollTop;
    var obj1Right = obj1Left + obj1.offsetWidth;
    var obj1Bottom = obj1Top + obj1.offsetHeight;
    var obj2Left = aspnm_pageX(obj2) - window.document.body.scrollLeft;
    var obj2Top = aspnm_pageY(obj2) - window.document.body.scrollTop;
    var obj2Right = obj2Left + obj2.offsetWidth;
    var obj2Bottom = obj2Top + obj2.offsetHeight;
    if (obj1Right <= obj2Left || obj1Bottom <= obj2Top ||
        obj1Left >= obj2Right || obj1Top >= obj2Bottom)
        result = false;
    return result;
}
function aspnm_pageX(o)
{
    return(aspnm_mac?aspnm_macX(o):aspnm_winX(o));
}
function aspnm_winX(o)
{
    var x = 0;
    while (o != document.body)
    {
        x += o.offsetLeft;
        o = o.offsetParent;
    }
    return x;
}
function aspnm_macX(o)
{
    var x = 0;
    while (o.offsetParent != document.body)
    {
        if ((o.tagName == "TABLE") && (o.offsetParent.tagName == "TD"))
            x += o.clientLeft;
        else
            x += o.offsetLeft;
        o = o.offsetParent;
    }
    x += (o.offsetLeft + aspnm_pgMrgX());
    return x;
}
function aspnm_pgMrgX()
{
    if (!aspnm_marginX)
    {
        if (!document.all["aspnm_pgMrgMsr"])
            aspnm_createPgMrgMsr();
        aspnm_marginX = -document.all["aspnm_pgMrgMsr"].offsetLeft;
    }
    return aspnm_marginX;
}
function aspnm_pageY(o)
{
    return(aspnm_mac?aspnm_macY(o):aspnm_winY(o));
}
function aspnm_winY(o)
{
    var y = 0;
    while (o != document.body)
    {
        y += o.offsetTop;
        o = o.offsetParent;
    }
    return y;
}
function aspnm_macY(o)
{
    var y = 0;
    while (o.offsetParent != document.body)
    {
        if ((o.tagName == "TABLE") && (o.offsetParent.tagName == "TD"))
            y += o.clientTop;
        else
            y += (o.tagName != "TD")?o.offsetTop:o.parentElement.offsetTop;
        o = o.offsetParent;
    }
    y += (o.offsetTop + aspnm_pgMrgY());
    return y;
}
function aspnm_pgMrgY()
{
    if (!aspnm_marginY)
    {
        if (!document.all["aspnm_pgMrgMsr"])
            aspnm_createPgMrgMsr();
        aspnm_marginY = -document.all["aspnm_pgMrgMsr"].offsetTop;
    }
    return aspnm_marginY;
}
function aspnm_createPgMrgMsr()
{
    document.body.insertAdjacentHTML('beforeEnd',
            '<div id="aspnm_pgMrgMsr" style="position:absolute;left:0;top:0;z-index:-1000;visibility:hidden">*</div>');
}

/* AUTO JUMP CODE *************************************************************/
var downStrokeField;
function autojump(fieldName,nextFieldName,fakeMaxLength)
{
var myForm=document.forms[document.forms.length - 1];
var myField=myForm.elements[fieldName];
myField.nextField=myForm.elements[nextFieldName];

if (myField.maxLength == null)
   myField.maxLength=fakeMaxLength;

myField.onkeydown=autojump_keyDown;
myField.onkeyup=autojump_keyUp;
}

function autojump_keyDown()
{
this.beforeLength=this.value.length;
downStrokeField=this;
}

function autojump_keyUp()
{
if (
   (this == downStrokeField) && 
   (this.value.length > this.beforeLength) && 
   (this.value.length >= this.maxLength)
   )
   this.nextField.focus();
downStrokeField=null;
}
function jumpToDecimal(field, myfield, e, dec)
{
    var key;
    var keychar;
    if (window.event) {
        key = window.event.keyCode;
    }
    else if (e) {
        key = e.which;
    }
    else {
        return true;
    }
    if (key == 44 || key == 46) {
    	//if(browser.isIE){
    		if(document.getElementById(field + 'Dec')){
	        	document.getElementById(field + 'Dec').focus();
	        }
        //}
        return false;
    } else {
        return numbersOnly(myfield, e, dec);
    }
}
function dontJump(field, myfield, e, dec) {
    var key;
    var keychar;
    if (window.event) {
        key = window.event.keyCode;
    }
    else if (e) {
        key = e.which;
    }
    else {
        return true;
    }
    if (key == 44 || key == 46) {
        return false;
    } else {
        return numbersOnly(myfield, e, dec);
    }
}
/* AUTO JUMP CODE END *********************************************************/


/* popups.js ******************************************************************/
function getYSize() {
    var myWidth = 0,myHeight = 0;
    if (typeof(window.innerWidth) == 'number') {
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
    } else if (document.documentElement &&
               (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
    }
    return myHeight;
}
function getScrollY() {
    var scrOfX = 0,scrOfY = 0;
    if (typeof(window.pageYOffset) == 'number') {
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
    } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
    } else if (document.documentElement &&
               (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft;
    }
    return scrOfY;
}
function showOnTopDIV(divId) {

    styleObj = document.getElementById(divId).style;
    var scrollY = getScrollY();
    var ySize = getYSize();
    var newHeight = scrollY + ySize;
    styleObj.height = newHeight + 'px';
    
    if (window.innerHeight && window.scrollMaxY) {// Firefox
		yWithScroll = window.innerHeight + window.scrollMaxY;
		xWithScroll = window.innerWidth + window.scrollMaxX;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		yWithScroll = document.body.scrollHeight;
		xWithScroll = document.body.scrollWidth;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		yWithScroll = document.body.offsetHeight;
		xWithScroll = document.body.offsetWidth;
  	}
  	
  
  // bug problem on IE with the transparent DIV... (4px)
  	if (ez_isIE){
  		yWithScroll = yWithScroll - 4;
  	}
	
	styleObj.height = yWithScroll;
    
    
    if (ez_OPR || ez_SAF) {
        styleObj.background = "url('web/images/back.png')";
        if (ez_MOZ && ez_isMac) {
        }
    } else {
        styleObj.backgroundColor = "#ffffff";
    }
    scroll(0, 0);
    showDIV(divId);
    aspnm_hideSelectElements(divId);
    aspnm_hideIFrameElements(divId);
}
function hideOnTopDIV(divId) {
    aspnm_restoreSomeSelectElements(divId);
   	aspnm_restoreSomeIFrameElements(divId);
    hideDIV(divId);
    //WAI Changes
    /*if(browser.isIE){
	    if(elementToReturnFocusTo){
	    	if(document.getElementById(elementToReturnFocusTo.id)){
	    		elementToReturnFocusTo.focus();
	    	}
	    }
	}*/
}
function hideDIV(divId) {
	if (document.getElementById(divId)){
    document.getElementById(divId).style.display = "none";
    }
}
function showDIV(divId) {
	if(document.getElementById(divId)){
    document.getElementById(divId).style.display = "inline";
	}
}


// only used for operation detail popup (only has a fixed width)
function openOperationDetailPopup(url, title, attrs) {
    var w = 400;
    var h = 510;
    var x = (window.screen.width / 2) - ((w / 2) + 10);
    var y = (window.screen.height / 2) - ((h / 2) + 50);
    var _attrs = 'dependent=yes, toolbar=no, location=no, directories=no, status=no, menubar=0, scrollbars=yes, resizable=no, copyhistory=yes, width=' + w + ', height=' + h + ' ,left=' + x + ',top=' + y + '';
    var _title = "";
    if (attrs) {
        _attrs = attrs;
    }
    if (title) {
        _title = title;
    }
    if (!url)return;
    url += ((url.indexOf('?') > 0)?'&':'?') + "popup=1";
    var win = window.open(url, _title, _attrs);
    if(browser.isIE){
    	if(win){
			win.focus();
		}
	}
    return win;
}

function openPopup(url, title, attrs,w,h) {
    var _w = 400;
    var _h = 510;
    var _title = "";
    if (attrs) {
        _attrs = attrs;
    }
    if (title) {
        _title = title;
    }
    if (w)
    	_w = w ;
    
    if (h)
    	_h = h;

    var x = (window.screen.width / 2) - ((w / 2) + 10);
    var y = (window.screen.height / 2) - ((h / 2) + 50);
    var _attrs = 'dependent=yes, toolbar=no, location=no, directories=no, status=no, menubar=0, scrollbars=yes, resizable=no, copyhistory=yes, width=' + w + ', height=' + h + ' ,left=' + x + ',top=' + y + '';
    
    if (!url)return;
    url += ((url.indexOf('?') > 0)?'&':'?') + "popup=1";
    var win = window.open(url, _title, _attrs);
    if(browser.isIE){
    	if(win){
			win.focus();
		}
	}
    return win;
}

/* showDetailPopup - detail popup, used for ADD, cheques */
function showDetailPopup(url, title, attrs){
	
	var w = 406;
    var h = 566;

    openPopup(url,title,attrs,w,h);
}

/* multiple.js ****************************************************************/
function MM_swapImgRestore() {
    var i,x,a = document.MM_sr;
    for (i = 0; a && i < a.length && (x = a[i]) && x.oSrc; i++)x.src = x.oSrc;
}
function MM_preloadImages() {
    var d = document;
    if (d.images) {
        if (!d.MM_p)d.MM_p = new Array();
        var i,j = d.MM_p.length,a = MM_preloadImages.arguments;
        for (i = 0; i < a.length; i++)
            if (a[i].indexOf("#") != 0) {
                d.MM_p[j] = new Image;
                d.MM_p[j++].src = a[i];
            }
    }
}
function MM_findObj(n, d) {
    var p,i,x;
    if (!d)d = document;
    if ((p = n.indexOf("?")) > 0 && parent.frames.length) {
        d = parent.frames[n.substring(p + 1)].document;
        n = n.substring(0, p);
    }
    if (!(x = d[n]) && d.all)x = d.all[n];
    for (i = 0; !x && i < d.forms.length; i++)x = d.forms[i][n];
    for (i = 0; !x && d.layers && i < d.layers.length; i++)x = MM_findObj(n, d.layers[i].document);
    if (!x && d.getElementById)x = d.getElementById(n);
    return x;
}
function MM_swapImage() {
    var i,j = 0,x,a = MM_swapImage.arguments;
    document.MM_sr = new Array;
    for (i = 0; i < (a.length - 2); i += 3)
        if ((x = MM_findObj(a[i])) != null) {
            document.MM_sr[j++] = x;
            if (!x.oSrc)x.oSrc = x.src;
            x.src = a[i + 2];
        }
}
/*function openWindow(url, y, x)
{
    mypopupWin = window.open(url, 'exemplo', 'width=' + x + ',height=' + y + ',left=0,top=0,scrollbars=0,resizable=no');
    mypopupWin.resizeTo(x + 10, y + 28);
    mypopupWin.focus();
}*/
var lastOne;
function change(tt) {
    lastOne = tt.parentNode.parentNode.className;
    if (tt.parentNode.parentNode.className == lastOne)
        tt.parentNode.parentNode.className = "table_tr_03";
}
function change1(tt) {
    if (tt.parentNode.parentNode.className != lastOne)
        tt.parentNode.parentNode.className = lastOne;
}
function change3a(element) {
    var currentRowElement = element.parentNode.parentNode;
    var tableElement = element.parentNode.parentNode.parentNode.parentNode;
    var _element = element.parentNode.parentNode.parentNode;
    var tableRows = _element.childNodes;
    for (var i = 0; i < tableRows.length; i++) {
        if ((tableRows.item(i).nodeType == 1) && (tableRows.item(i) == currentRowElement)) {
            tableRows.item(i).className = "table_tr_03";
            if (tableRows.item(i + 1)) {
                for (var next = 1; tableRows.item(i + next).nodeType != 1; next++);
                tableRows.item(i + next).className = tableRows.item(i).className;
            }
        }
    }
}
function change3b(element, previousStyle) {
    var currentRowElement = element.parentNode.parentNode;
    var tableElement = element.parentNode.parentNode.parentNode.parentNode;
    var _element = element.parentNode.parentNode.parentNode;
    var tableRows = _element.childNodes;
    for (var i = 0; i < tableRows.length; i++) {
        if ((tableRows.item(i).nodeType == 1) && (tableRows.item(i) == currentRowElement)) {
            tableRows.item(i).className = previousStyle;
            if (tableRows.item(i + 1)) {
                for (var next = 1; tableRows.item(i + next).nodeType != 1; next++);
                tableRows.item(i + next).className = tableRows.item(i).className;
            }
        }
    }
}
function getFormGroup(name) {
    return document.getElementsByName(name);
}
function getRadio(name) {
    elements = getFormGroup(name);
    if (elements) {
        for (i = 0; i < elements.length; i++)
            if (elements[i].checked)
                return elements[i];
        return null;
    }
}
function getRadioValue(name) {
    element = getRadio(name);
    if (element)
        return element.value;
    return'';
}
function go(link) {
    var previousLink = document.forms[0].action;
    document.forms[0].action = link;
    document.forms[0].submit();
    document.forms[0].action = previousLink;
}
function goWithForm(link, formName) {
    form = document.getElementById(formName);
    var previousLink = form.action;
    form.action = link;
    form.submit();
    form.action = previousLink;
}
function refreshPage() {
    document.forms[0].submit();
}
function getSelectedValueFromDD(id) {
    obj = document.getElementById(id);
    if (obj == null)
        return;
    else
        return obj.options[obj.selectedIndex].value
}
function cpArray(orgArray, dstArray, len) {
    for (var i = 0; i < len; i++)
        dstArray[i] = orgArray[i];
}
function qtdClick(id) {
    if (parseInt(document.getElementById(id).value) == 0)
        document.getElementById(id).value = "";
}
function qtdChange(id) {
    if (document.getElementById(id).value == "")
        document.getElementById(id).value = "0";
}


function minClick(name) {
    if (parseInt(document.getElementById(name).value) == '0')
        document.getElementById(name).value = '';
}
function minChange(name) {
    obj = document.getElementById(name);
    if (obj.value == "") {
        obj.value = '00';
    } else {
        if (obj.value.length == 1) {
            obj.value = obj.value + '0';
        }
    }
}


function cleanLeftZeros(str) {
    var aux = "";
    found = false;
    if (str == null)return null;
    if (str == "")return"";
    for (i = 0; i < str.length; i++) {
        if (found) {
            aux += str.charAt(i);
        } else {
            if (str.charAt(i) != '0') {
                aux += str.charAt(i);
                found = true;
            }
        }
    }
    return aux;
}


function jsFillDate(dateArrayName, date) {
    eval(dateArrayName)[kDAY] = date.getDate();
    eval(dateArrayName)[kMONTH] = date.getMonth() + 1;
    eval(dateArrayName)[kYEAR] = date.getFullYear();
}
function jsFillDateArray(dateArrayName, dateArrayName2) {
    eval(dateArrayName)[kDAY] = eval(dateArrayName2)[kDAY];
    eval(dateArrayName)[kMONTH] = eval(dateArrayName2)[kMONTH]
    eval(dateArrayName)[kYEAR] = eval(dateArrayName2)[kYEAR]
}
function jsShowDate(dateArrayName) {
    alert(dateArrayName + " " + eval(dateArrayName)[kDAY] + " / " + eval(dateArrayName)[kMONTH] + " / " + eval(dateArrayName)[kYEAR]);
}
function parseAmountValue(xpto) {
    str = "" + toDecimalPoints(xpto, 2);
    
    newXpto = str.replace(".", ",");
    if (!gotCharStr(newXpto, ","))
        newXpto += ",00";
    return newXpto;
}
function gotCharStr(str, c) {
    if (str == "")return false;
    for (i = 0; i < str.length; i++) {
        if (str.charAt(i) == c)
            return true;
    }
    return false;
}

/** Drop Downs functions **/
/*** take to full JS ***/
function getSelectedValueFromDD(id){
	obj=document.getElementById(id);

	if(obj==null)
		return;
	else
		return obj.options[obj.selectedIndex].value
}

function setOptions(dropDownBox,optionsArray){
	dropDownBox.options.length = 0;
	for(i = 0; i < optionsArray.length; i++){
		if (optionsArray [i] != null){	
			dropDownBox.options [dropDownBox.options.length] = optionsArray [i];
		}
 	}
}

function getOption(dropDownBox,optionValue){
	for(i = 0; i < dropDownBox.options.length; i++){
		if (dropDownBox.options [i] != null){	
			if(dropDownBox.options [i].value == optionValue){
				return i;
			}
		}
 	}
 	return -1;
}

function getOptionByIndex(dropDownBox,index){

	return dropDownBox.options [index];
}



function deleteOptions(dropDownBox){
	var optionsArray = dropDownBox.options
	
	for(i = 0; i < optionsArray.length; i++){
		if (optionsArray [i] != null){	
			optionsArray[i] = null;
		}
 	}
}

function filterDefaultOption(dropDownBox){
	// default options has index 0
	if (dropDownBox.selectedIndex == 0 && dropDownBox.options.length > 1 ){
		dropDownBox.selectedIndex = 1;
	}
}

function hideHtmlElement(e){
	if (e) e.style.display='none';
}

function showHtmlElement(e){
	if (e) e.style.display='';
}

function setHtmlElementValue(e,value){
	if (e) {
		e.value = value;
	}
}
function setInnerHtml(e,value){
	if (e) {
		e.innerHTML = value;
	}
}

function checkHtmlElement(e,value){
	if (e) {
		e.checked = value;
	}
}	
	
function isCheckHtmlElement(e){
	if (e) {
		return e.checked == true;
	}
	return false;
}



/* TOP MENU JS (top_menu.js)****************************************************************/
function jsDownload_JS(linkObj, actionName){
    //actionName = actionName.substring(actionName.lastIndexOf("/"));
    //actionName = actionName.substring(0, actionName.indexOf("."));
    //actionName = actionName.substring(1);
    var downloadFile = actionName;
    var url = actionName+".do?download="+downloadFile+".tsv";
    // linkObj.href = url;
    go(url);
    return true;
}

function jsPrint_JS(linkObj, actionName, queryString){
    //actionName = actionName.substring(actionName.lastIndexOf("/"));
    //actionName = actionName.substring(0, actionName.indexOf("."));
    //actionName = actionName.substring(1);
    var downloadFile = actionName;
    var qStr="";
    var ELE;

    if (document.forms[0] != null) {
        for(i=0; i<document.forms[0].elements.length; i++) {
            var element =document.forms[0].elements[i];
            if (element.type!="undefined") {
                if ( (element.type == "hidden" || element.type == "text" || element.type == "textarea" || element.type == "select-one")
                        || ((element.type == "checkbox" || element.type == "radio") && (element.checked)) ) {
                    qStr +="&"+element.name+"="+element.value;
                }
            }
        }
    } //if

    if (queryString != "") {
        if (qStr != "") {
            qStr = qStr+"&";
        } else {
            qStr = "&"+qStr;
        }
        qStr= qStr+queryString;
    }
    var url = actionName+".do?popup=1&print=1"+qStr;
    w = 620;
      h = 566;
    x = (window.screen.width/2) - ((w/2) + 10);
    y = (window.screen.height/2) - ((h/2) + 50);
    var win = window.open(url,'Impressao','dependent=yes, toolbar=no, location=no, directories=no, status=no, menubar=0, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+' ,left='+x+',top='+y+'');
      // We can also try something like this:
    // document.forms[0].target = "new windows....";
    if(browser.isIE){
    	if(win){
			win.focus();
		}
	}
    return true;
}


function openReceiptWindow(){
	
	var url = document.location.toString();
	 
    if(url.charAt(parseInt(url.length) - 1) == "#"){
		url = url.substring(0, parseInt(url.length) - 1);
	}
	
	var params = "";
	if(document.forms[0]) {
		params = "&"+Form.serialize(document.forms[0])
	}

	url = url + params; //getAjaxRequestParameters();
	
	openWindow(url, 701, 700)
}

/*
function openWindow() {
    var f = document.forms[0];
    f.target = 'foo';
    var win =window.open('',f.target,'dependent=yes, toolbar=no, location=no, directories=no, status=no, menubar=0, scrollbars=yes, resizable=no, copyhistory=no, width=650');
    if(browser.isIE){
    	if(win){
			win.focus();
		}
	}
    f.submit();
    return false;
}
*/
/* TOP MENU JS END ************************************************************/


/** DIV (div_script.js) **/
function writeAlertDiv(okButtonLabel,left) {
    var doc = document;
    if (!left) left = 186;
    doc.writeln('<div id="alertDIV" style="display: none; left: '+left+'px; top: 164px; Z-INDEX: 1001; POSITION: absolute;">');
    doc.writeln('<table border="0" cellspacing="0" cellpadding="0" class="popup_table">');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('		<td id="alertMessage" class="popup_msg2" colspan="2"></td>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="34" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('	<td width="1"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td>');
    doc.writeln('	<td class="popup_msg1" width="399">');
    doc.writeln('		<a onclick="javascript: if (actionCode) { eval(actionCode); };');
    doc.writeln('					if (focusedObj) {if (focusedObj.focus) focusedObj.focus();}');
    doc.writeln('					hideOnTopDIV(\'fullTransparentDIV\');');
    doc.writeln('					hideDIV(\'alertDIV\'); ');
    doc.writeln('					if (kb) { kb.style.display = \'inline\';}"');
    doc.writeln('					href="#" class="Button_1">' + okButtonLabel + '</a>');
    doc.writeln('	</td>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('</table>');
    doc.writeln('</div>');
}
function writeValidatorWADiv(okButtonLabel,left) {
    var doc = document;
    if (!left) left = 186;
    doc.writeln('<div id="validatorDIV" style="display: none; left: '+left+'px; top: 164px; Z-INDEX: 1001; POSITION: absolute;">');
    doc.writeln('<table border="0" cellspacing="0" cellpadding="0" class="popup_table">');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('	<a name="validationFailedDivBookmark"><td id="messages" class="popup_msg2" colspan="2"></td></a>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="34" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('	<td width="1"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td>');
    doc.writeln('	<td class="popup_msg1" width="399">');
    doc.writeln('		<a id="errButtonOk" onclick="hideOnTopDIV(\'fullTransparentDIV\'); ');
    doc.writeln('					hideDIV(\'validatorDIV\'); ');
    doc.writeln('					if (fieldToFocus) { fieldToFocus.focus(); }; ');
    doc.writeln('					if (kb) { kb.style.display = \'inline\'; }" ');
    doc.writeln('					href="#" class="Button_1">'+okButtonLabel+'</a>');
    doc.writeln('	</td>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('</table>');
    doc.writeln('</div>');
}
function writeQuestionDiv(yesButtonLabel, noButtonLabel, left) {
    var doc = document;
    if (!left) left = 186;
    doc.writeln('<div id="questionDIV" style="display: none; left: '+left+'px; top: 164px; Z-INDEX: 1001; POSITION: absolute;">');
    doc.writeln('<table border="0" cellspacing="0" cellpadding="0" class="popup_table">');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('	<td id="questionMessage" class="popup_msg2" colspan="2"></td>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="34" border="0"></td></tr>');
    doc.writeln('<tr>');
    doc.writeln('	<td width="1"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td>');
    doc.writeln('	<td class="popup_msg1" width="399">');
    doc.writeln('		<a id="questionYes" href="#" class="Button_1">'+yesButtonLabel+'</a>');
    doc.writeln('		<a id="questionNo" href="#" class="Button_1">'+noButtonLabel+'</a>');
    doc.writeln('	</td>');
    doc.writeln('</tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('</table>');
    doc.writeln('</div>');
}
function writeWaitDiv(waitMessage, left) {
    var doc = document;
    if (!left) left = 186;
    doc.writeln('<div id="waitPopupDIV" style="display: none; left: '+left+'px; top: 164px; Z-INDEX: 1001; POSITION: absolute;">');
    doc.writeln('<table border="0" cellspacing="0" cellpadding="0" class="popup_table">');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('<tr><td class="popup_msg2" colspan="2" id="waitMessage">'+waitMessage+'</td></tr>');
    doc.writeln('<tr><td colspan="2"><img src="web/images/px.gif" alt="" width="1" height="24" border="0"></td></tr>');
    doc.writeln('</table>');
    doc.writeln('</div>');
}

function writeFullTransparentDiv(width) {
    var doc = document;
    if (!width) width = 760;
    doc.writeln('<div id="fullTransparentDIV" style="opacity: .5; DISPLAY: none; Z-INDEX: 1000; FILTER: alpha(opacity=70); VISIBILITY: visible; POSITION: absolute; -moz-opacity: .6; width: '+width+'px; height: 100%; left: 0px; top: 0px;"></div>');
	
}

/* VIRTUAL KEYBOARD (virtualKey.js) ***********************************************************/
var vKeyActiveField=null;
var vKeyActiveFieldIndex=0;
var vKeyNextFieldId=null;
//identificadores dos campos de input
var inputs = null;
//tamanhos maximos dos campos de input
var inputsMaxLength;
//contentor dos valores dos campos de input
var inputValues;
//indicador do tipo de campo de input (password=true, text=false)
var inputTypes;
var inputStyle='Input_Login';
var inputStyleActive='Input_Login2';
var initialPageName = null;
var browserCompromisedMsg;

var focusTimeout = 3000;

function initKeyboard(inputsArray,inputsMaxLengthArray, inValues, inTypes, _inputStyle,_inputStyleActive, _vKeyNextFieldId){
    inputs=inputsArray;
    inputsMaxLength=inputsMaxLengthArray;
    inputValues = inValues;
    inputTypes = inTypes;
  
    
    if(_inputStyle){
        inputStyle=_inputStyle;
    }
    
    if(_inputStyleActive){
        inputStyleActive=_inputStyleActive;
    }
    
    if(!ez_SAF){
        for(i=0;i<inputs.length;i++){
            document.getElementById(inputs[i]).readOnly=true;
        }
    }
    if (_vKeyNextFieldId) {
    	vKeyNextFieldId = _vKeyNextFieldId;
    }
    
    if (document.getElementById('keyboard'))
    	document.getElementById('keyboard').style.display='block';
}

function checkKeyCode(event){
    var keyCode = null;
    if (event)
        keyCode = (event.which)? event.which: event.keyCode;
    else if (window.event) {
        event = window.event;
        keyCode = (event.which)? event.which: event.keyCode;
    }
    
    if (event.altKey == 1 || event.shiftKey == 1 || event.ctrlKey == 1 ) return true;

    // Tab has been pressed
    if(event.keyCode==9){
        return true;
    }

    // control keys
    // backspace (charcode=8); tab (charcode=9); escape (charcode=27)
    if ((keyCode==null) || (keyCode==0) || (keyCode==8) || (keyCode==9) || (keyCode==27))  return true;
    // enter (charcode=13)
    if ((keyCode==13)) {
        var key;
        if (event.target)
            key = event.target;
        else if (event.srcElement)
            key = event.srcElement;
        var keyChar = key.innerHTML ;
        if (keyChar != undefined && "0123456789".indexOf(keyChar) > -1) {
            addKey(key);
        } else {
        	if(key.id == "deleteOneDigitButton"){
        		deleteDigit();        		
        	}
        	else if(key.id =="clearPressedButton"){
        		clearPressed();
        	}
        }
        return true;
    }

    showAlert(pleaseUseVirtualKeyboardI18n,vKeyActiveField);
    return false;
}

function setInitialPageName(pageName) {
    initialPageName = pageName;
}

function setBrowserCompromisedMessage(msg) {
    browserCompromisedMsg = msg;
}

function generateSpaces(padSize){
   var result = '';
   for (var i = 0; i < padSize; i++){
           result += '&nbsp;';
   }

   return result;
}

var bFocusTimeout= false;        // Has the time to set the focus run out
var focusToElement = undefined;  // The element to set focus on
function returnFocusToVirtualKeypad() {
	if(browser.isIE){
	    return returnFocusToElement('firstNumber');
	}
}
function returnFocusToElement(element) {
	if(browser.isIE){
	    focusToElement = element;
	    if (!bFocusTimeout) {
	        bFocusTimeout = true;
	        //setTimeout("if (focusToElement) document.getElementById(focusToElement).focus(); focusToElement = undefined; bFocusTimeout = false", focusTimeout);
	        setTimeout("if (document.getElementById(focusToElement)) document.getElementById(focusToElement).focus(); focusToElement = undefined; bFocusTimeout = false", focusTimeout);
	    }
	}
}

function addKey(key){


	
    if(vKeyActiveField!=null){
         if ( browserCompromisedMsg!=null
         	 && browserCompromisedMsg!= ""
             && initialPageName!=null
             && document.title.substring(0, initialPageName.length)!=initialPageName ) {
            alert(browserCompromisedMsg);
            alert("browserCompromisedMsg = \""+browserCompromisedMsg+"\"");
            alert("browserCompromisedMsg!=null = " + (browserCompromisedMsg!=null));
            return false;
        }
        if(inputValues[vKeyActiveFieldIndex].length < inputsMaxLength[vKeyActiveFieldIndex] - 1){
           //ainda esta dentro do tamanho permitido do span
            if ( inputTypes[vKeyActiveFieldIndex] ) {
                vKeyActiveField.innerHTML += '*';
            } else {
                vKeyActiveField.innerHTML += key.innerHTML;
            }
            inputValues[vKeyActiveFieldIndex] += key.innerHTML;
            vKeyOnInputFocus(vKeyActiveField);

        }else if(inputValues[vKeyActiveFieldIndex].length == inputsMaxLength[vKeyActiveFieldIndex] - 1){
            if ( inputTypes[vKeyActiveFieldIndex] ) {
                vKeyActiveField.innerHTML += '*';
            } else {
                vKeyActiveField.innerHTML += key.innerHTML;
            }
            inputValues[vKeyActiveFieldIndex] += key.innerHTML;

            if(vKeyActiveFieldIndex < inputs.length - 1){
                var elem = document.getElementById(inputs[vKeyActiveFieldIndex+1]);
                vKeyOnInputFocus(elem);

            } else {
            	if ((vKeyNextFieldId != null) && (document.getElementById(vKeyNextFieldId) != null)) {

            		for(i=0;i<inputs.length;i++){
     					document.getElementById(inputs[i]).className=inputStyle;
     					document.getElementById('keyboard').style.display='none';
        			}
    			}

            }
        } else{
            if(vKeyActiveFieldIndex<inputs.length-1){
                elem = document.getElementById(inputs[vKeyActiveFieldIndex+1]);
                vKeyOnInputFocus(elem);
                addKey(key);
            } else {
                field = document.getElementById('enterLink');
                showAlert(loginMaxDigitsI18n.replace("{0}", inputsMaxLength[vKeyActiveFieldIndex]), field);
            }
        }
    }
}

function addKey2(key){


	alert("key: "+key + "  - "+inputValues[vKeyActiveFieldIndex]);
	
   
        if(inputValues[vKeyActiveFieldIndex].length < inputsMaxLength[vKeyActiveFieldIndex] - 1){
           //ainda esta dentro do tamanho permitido do span
            if ( inputTypes[vKeyActiveFieldIndex] ) {
                vKeyActiveField.innerHTML += '*';
            } else {
                vKeyActiveField.innerHTML += key.innerHTML;
            }
            inputValues[vKeyActiveFieldIndex] += key.innerHTML;
            vKeyOnInputFocus(vKeyActiveField);

        }else if(inputValues[vKeyActiveFieldIndex].length == inputsMaxLength[vKeyActiveFieldIndex] - 1){
            if ( inputTypes[vKeyActiveFieldIndex] ) {
                vKeyActiveField.innerHTML += '*';
            } else {
                vKeyActiveField.innerHTML += key.innerHTML;
            }
            inputValues[vKeyActiveFieldIndex] += key.innerHTML;

            if(vKeyActiveFieldIndex < inputs.length - 1){
                var elem = document.getElementById(inputs[vKeyActiveFieldIndex+1]);
                vKeyOnInputFocus(elem);

            } else {
            	if ((vKeyNextFieldId != null) && (document.getElementById(vKeyNextFieldId) != null)) {

            		for(i=0;i<inputs.length;i++){
     					document.getElementById(inputs[i]).className=inputStyle;
     					document.getElementById('keyboard').style.display='none';
        			}
    			}

            }
        } else{
            if(vKeyActiveFieldIndex<inputs.length-1){
                elem = document.getElementById(inputs[vKeyActiveFieldIndex+1]);
                vKeyOnInputFocus(elem);
                addKey(key);
            } else {
                field = document.getElementById('enterLink');
                showAlert(loginMaxDigitsI18n.replace("{0}", inputsMaxLength[vKeyActiveFieldIndex]), field);
            }
        }
    
}
function addDblKey(key) {
    if (ez_isIE) {
        addKey(key);
    }
}

function deleteDigit(){
    if(vKeyActiveField!=null){
        if(vKeyActiveField.innerHTML.length>0){
            strLen = inputValues[vKeyActiveFieldIndex].length;
            inputValues[vKeyActiveFieldIndex] = inputValues[vKeyActiveFieldIndex].substring(0,strLen-1);
            vKeyActiveField.innerHTML = vKeyActiveField.innerHTML.substring(0,strLen-1);
        }
    }

}

function clearPressed(){
    if(vKeyActiveField!=null){
        vKeyActiveField.innerHTML = '';
        inputValues[vKeyActiveFieldIndex] = '';
    }

}

function vKeyOnInputFocus(input){

	document.getElementById('keyboard').style.display='block';
    vKeyActiveField=input;
    vKeyActiveFieldIndex=getInputIndex(vKeyActiveField);
    onActiveInputChange();
    
}

function onActiveInputChange(){
	
    vKeyActiveField.className=inputStyleActive;
    

    for(i=0;i<inputs.length;i++){
        
        if(inputs[i]!=vKeyActiveField.id){
            document.getElementById(inputs[i]).className=inputStyle;
        }
    }
}

function getInputIndex(input){

    for(i=0;i<inputs.length;i++){
        if(inputs[i]==input.id){
            return i;
        }
    }
    return-1;
}



var dragObj = new Object();
var browser = new Browser();
function Browser() {
    var ua,s,i;
    this.isIE = false;
    this.isNS = false;
    this.version = null;
    ua = navigator.userAgent;
    s = "MSIE";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }
    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }
    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
    s = "Opera";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isOp = true;
        this.version = parseFloat(ua.substr(i + 1 + s.length));
        return;
    }
}
function dragStart(event, id) {
    var el;
    var x,y;
    if (id)
        dragObj.elNode = document.getElementById(id);
    else {
        if (browser.isIE || browser.isOp)
            dragObj.elNode = window.event.srcElement;
        if (browser.isNS)
            dragObj.elNode = event.target;
        if (dragObj.elNode.nodeType == 3)
            dragObj.elNode = dragObj.elNode.parentNode;
    }
    if (browser.isIE || browser.isOp) {
        x = window.event.clientX + document.documentElement.scrollLeft
                + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
                + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    dragObj.cursorStartX = x;
    dragObj.cursorStartY = y;
    dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
    dragObj.elStartTop = parseInt(dragObj.elNode.style.top, 10);
    if (isNaN(dragObj.elStartLeft))dragObj.elStartLeft = 0;
    if (isNaN(dragObj.elStartTop))dragObj.elStartTop = 0;
    dragObj.elNode.style.zIndex = ++dragObj.zIndex;
    if (browser.isIE || browser.isOp) {
        document.attachEvent("onmousemove", dragGo);
        document.attachEvent("onmouseup", dragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", dragGo, true);
        document.addEventListener("mouseup", dragStop, true);
        event.preventDefault();
    }
}
function dragGo(event) {
    var x,y;
    if (browser.isIE || browser.isOp) {
        x = window.event.clientX + document.documentElement.scrollLeft
                + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
                + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top = (dragObj.elStartTop + y - dragObj.cursorStartY) + "px";
    if (browser.isIE || browser.isOp) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS)
        event.preventDefault();
}
function dragStop(event) {
    if (browser.isIE || browser.isOp) {
        document.detachEvent("onmousemove", dragGo);
        document.detachEvent("onmouseup", dragStop);
    }
    if (browser.isNS) {
        document.removeEventListener("mousemove", dragGo, true);
        document.removeEventListener("mouseup", dragStop, true);
    }
}
function goFor(input) {
    form.submit();
}
/******** VIRTUAL KEYBOARD END ************************************************/


/************** SHA1 (sha1.js) **********************************************************/
/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1 Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}

/*
 * Perform a simple self-test to see if the VM is working
 */
function sha1_vm_test()
{
  return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}

/*
 * Calculate the SHA-1 of an array of big-endian words, and a bit length
 */
function core_sha1(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << (24 - len % 32);
  x[((len + 64 >> 9) << 4) + 15] = len;

  var w = Array(80);
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
  var e = -1009589776;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    var olde = e;

    for(var j = 0; j < 80; j++)
    {
      if(j < 16) w[j] = x[i + j];
      else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
      var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
      e = d;
      d = c;
      c = rol(b, 30);
      b = a;
      a = t;
    }

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
    e = safe_add(e, olde);
  }
  return Array(a, b, c, d, e);

}

/*
 * Perform the appropriate triplet combination function for the current
 * iteration
 */
function sha1_ft(t, b, c, d)
{
  if(t < 20) return (b & c) | ((~b) & d);
  if(t < 40) return b ^ c ^ d;
  if(t < 60) return (b & c) | (b & d) | (c & d);
  return b ^ c ^ d;
}

/*
 * Determine the appropriate additive constant for the current iteration
 */
function sha1_kt(t)
{
  return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
         (t < 60) ? -1894007588 : -899497514;
}

/*
 * Calculate the HMAC-SHA1 of a key and some data
 */
function core_hmac_sha1(key, data)
{
  var bkey = str2binb(key);
  if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
  return core_sha1(opad.concat(hash), 512 + 160);
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Convert an 8-bit or 16-bit string to an array of big-endian words
 * In 8-bit function, characters >255 have their hi-byte silently ignored.
 */
function str2binb(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
  return bin;
}

/*
 * Convert an array of big-endian words to a string
 */
function binb2str(bin)
{
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (24 - i%32)) & mask);
  return str;
}

/*
 * Convert an array of big-endian words to a hex string.
 */
function binb2hex(binarray)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
  }
  return str;
}

/*
 * Convert an array of big-endian words to a base-64 string
 */
function binb2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}
/******************************* SHA1 *****************************************/

function changeImage(name, src){ document.getElementById(name).src = src; }

/** Cookies **/
// this function gets the cookie, if it exists
function Get_Cookie( name ) {
	
var start = document.cookie.indexOf( name + "=" );
var len = start + name.length + 1;
if ( ( !start ) &&
( name != document.cookie.substring( 0, name.length ) ) )
{
return null;
}
if ( start == -1 ) return null;
var end = document.cookie.indexOf( ";", len );
if ( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( len, end ) );
}



/*** DIVS Opacity **/
function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 100);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
    if(document.getElementById(id)){
     var object = document.getElementById(id).style;
     object.opacity = (opacity / 100);
     object.MozOpacity = (opacity / 100);
     object.KhtmlOpacity = (opacity / 100);
     object.filter = "alpha(opacity=" + opacity + ")";
    }
} 

function trimString(sInString) {
  return sInString.replace( /^\s+|\s+$/, "" );
}
//forcing to use virtual keyboard
function keyPressAlert() {
    document.onkeypress = function (evt) {
        // alert(evt.target.localName +""+evt.target.id);
        if (!evt)
        {
            evt = window.event;
            var targ = evt.srcElement;
        } else {
            var targ = evt.target;
        }
        //alert("event: "+targ.type );

        if (targ.type == "text") {
            return true;
        }

        if (justNumberOnly(evt)) {
            showAlert(pleaseUseVirtualKeyboardI18n, document.getElementById("virtualKeyElement"));
            //-- hidding this alert below the other alert windows
            if (document.getElementById("alertDIV")) {
                document.getElementById("alertDIV").style.left = "185px";
            }
            return true;
        }
    }
}


function numbersOrLettersOnly(event) {
	return thisCharsetOnly(event,'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890',true);
}

function pasteNumbersOrLettersOnly() {
	return pasteThisCharsetOnly('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890',true);
}


function portugueseNameFilter(event){
    return thisCharsetOnly(event,'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ ',true);
}
function pastePortugueseNameFilter(){
    return pasteThisCharsetOnly('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ ',true);
}


function portugueseAddressFilter(event){
return thisCharsetOnly(event,'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ, -_:/1234567890',true);
}
function pastePortugueseAddressFilter(){
 return pasteThisCharsetOnly('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ, -_:/1234567890',true);
}

function portuguesePasswordFilter(event){
return thisCharsetOnly(event,'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ1234567890',true);
}
function pastePortuguesePasswordFilter(){
 return pasteThisCharsetOnly('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmáàéèíìóòúùãõâôçºª.ÁÀÉÈÍÌÓÒÚÙÔÕÃÂÇ1234567890',true);
}



/** services payments- reference */
function valid(element){
   if (ValidaDigit(element.value)==false){
     //alert ("Incorrect!");
     element.value="";
     element.focus();
     return;
   }
 }
 function ValidaDigit (cad){
  lg=cad.length;
    for (i=0;i<lg;i++) {
        c=cad.charAt(i);
        if (c<'0' || c>'9')
           return false;
    }
    return true;
 }

/* * Netsonda * */

/** open cxdo popup that links to netsonda **/ 
function openCXDONetsondaWindow(key){
	
	var popup = window.open('netsondaPopup.do?key='+key, 'netsonda', 'height=455,width=668,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no,scrollbars=1');
	if(browser.isIE){
		if(popup){
			popup.focus();
		}
	}

 return false;
}

function openNetsondaWindow(key){

	var openPopupInNewWindow = ez_SAF; //only for safari browsers
	var windowId="netsonda";
	
	if (openPopupInNewWindow){
		windowId="netsonda1";
	}
	
	window.open('https://www.netsonda.pt/sw_v2/insite/index.php?inq_id=228&inq_csr=c9418e79d9c29fc0b7b144fae15f9366&key='+key+'&css=1',windowId, 'height=490,width=650,toolbar=no,location=no,directories=no,status=no,scrollbars=1,menubar=no,copyhistory=no')
	
	if (openPopupInNewWindow){
		window.close();
	}
	
}

function openSimulatorWindow(){

	var openPopupInNewWindow = ez_SAF; //only for safari browsers
	var windowId="simulator";
	
	//window.open('openSimulatorWindowAction.do', windowId, 'height=390,width=780,toolbar=no,location=no,directories=no,status=no,scrollbars=0,menubar=no,copyhistory=no')	
	window.open('openSimulatorWindowAction.do', windowId, 'height=550,width=780,toolbar=no,location=no,directories=no,status=yes,scrollbars=yes,menubar=no,copyhistory=no')	
}

function openWindow(url,height,width){
	window.open(url,"id", 'height='+height+',width='+width+',toolbar=no,location=no,directories=no,status=no,scrollbars=1,menubar=no,copyhistory=no')	
}


/* ---- */

function openAjaxDebugWindow(text){

	 top.consoleRef=window.open('','myconsole',
  'width=600,height=500'
   +',menubar=0'
   +',toolbar=0'
   +',status=0'
   +',scrollbars=1'
   +',resizable=1')
 top.consoleRef.document.writeln(
  '<html><head><title>Console</title></head>'
   +'<body bgcolor=white onLoad="self.focus()">'
   +text
   +'</body>'
   +'</html>'
 )
 top.consoleRef.document.close();
	 	
}
//****************************
//******INICIO NETSCOPE*******
//****************************

/* 	
	weboscope.js					 
	Weboscope version 4.0 copyright Weborama 04-01-2003
*/

function webo_zpi(_WEBOZONE,_WEBOPAGE,_WEBOID,_ACC)
{
	return;
}

// Compatible
function webossl_zpi(_WEBOZONE,_WEBOPAGE,_WEBOID,_ACC) {
	return;
}

function flash_zpi(_WEBOZONE,_WEBOPAGE,_WEBOID,_ACC) {
	return;
}



//****************************
//******FIM NETSCOPE*******
//****************************

/** Campanhas +Valor - hide image popup **/

function showImagePopup(obj, div_id, offset, offset2){

	var popup = document.getElementById(div_id);
	
	if(popup != null){
	
		popup.style.left = findPosX(obj) + offset;
		popup.style.top = findPosY(obj) + offset2;
		
		//alert(findPosX(obj)+' '+findPosY(obj));
		
		popup.style.display = 'block';
	}
}

function hideImagePopup(div_id){
	var popup = document.getElementById(div_id);
	popup.style.display = 'none';
}

function findPosX(obj){
	var curleft = 0;
	if (obj.offsetParent){
		while (obj.offsetParent){
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj){
	var curtop = 0;
	if (obj.offsetParent){
		while (obj.offsetParent){
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}



/** \Campanhas +Valor - hide image popup **/



//****************************
//** NOVO MENU
var visiblemenus = [];

/* ** Exit menu functions ** */
var exitmenu = false; /* if true the menu will be exited */
var exittime;         /* time when the menu will be exited */
var isAwaken = false; /* the handler is awaken */
var LOOKUP_PERIOD = 500; /* interval between each menu checking */

// Exits the main menu by closing all the submenus
function ExitMenu() {
    exitmenu = true;
    exittime = new Date().getTime() + LOOKUP_PERIOD;
    WakeExitMenuHandler();
}
function WakeExitMenuHandler() {
    if (!isAwaken) setTimeout("ExitMenuHandler()", LOOKUP_PERIOD);
}
// Handler for exiting the menu
function ExitMenuHandler() {
    if (exitmenu) {
        if (exittime < new Date().getTime()) {
            CloseOtherMenus();
            // IE < 6 BUFIX: Menu overlapped by select boxes
	        if (browser.isIE && browser.version < 6) {
    	        aspnm_restoreSelectElements();
	        }
            exitmenu = false;
        }
        setTimeout("ExitMenuHandler()", LOOKUP_PERIOD);
        return;
    }
    // Going to sleep
    isAwaken = false;
}
/* ** END exit menu functions ** */

// Handler for focusing or hovering a menuitem
function OnFocus(parentId, childId) {
    return function () {
        exitmenu = false;
        CloseOtherMenus(parentId);
        // IE < 6 BUFIX: Menu overlapped by select boxes
        if (browser.isIE && browser.version < 6) {
            aspnm_restoreSelectElements();
            for (var i = 0; i < visiblemenus.length; i++)
                aspnm_hideSelectElements(visiblemenus[i]);
            if (childId != null)
                aspnm_hideSelectElements(childId);
        }
        if(childId != null)
            ShowMenu(childId);
    };
}
// Handler for losing the focus on a menuitem
function OnBlur() {
    return function () { ExitMenu(); };
}
// Activates the menu
function ActivateMenu(nav) {
    var navElement = GetElement(nav);
    var firstAnchor = null;
    if (navElement != undefined) {
        var navroot = GetElement(nav);
        /* Identify first and last LI and add the '.first' and '.last' class */
        var uls = navroot.getElementsByTagName("UL");
		for (var i=0; i < uls.length; i++) {
			if (uls[i].childNodes.length > 0) {
				var first = null;
				var last = null;
				for (var j=0; j < uls[i].childNodes.length; j++) {
					if (uls[i].childNodes[j].tagName == 'LI') {
						if (first == null)
							first = uls[i].childNodes[j];
						last = uls[i].childNodes[j];
					}
				}
				first.className+=first.className?' first':'first';
				last.className+=last.className?' last':'last';
			}
		}
        
        /* Get all the list items within the menu */
        var lis = navroot.getElementsByTagName("A");
        for (var i=0; i < lis.length; i++) {
            var parent = lis[i].parentNode;
            parent.id = '_mli' + i;

            var ulchild = null;
           /* Look for other menu levels */
            for (var j=0; j < parent.childNodes.length; j++) {
                var child = parent.childNodes[j];
                if (child.tagName == 'UL') {
                    child.id = '_mul' + i;
                    ulchild = child;
                    // Create a IFRAME - IE 6.0 BUGFIX: Menu overlapped by select boxes
                    if (browser.isIE && browser.version >= 6 && browser.version < 7) {
                        var iframeEl = document.createElement("IFRAME");
                        iframeEl.frameBorder = 0;
                        
                        /** Nasty, Ugly and Stupid IE BUG, that crapy browser will send a http response with this one */                        
                    	//  iframeEl.src = "javascript:;";
                   		if(document.location.protocol == "https:")
							iframeEl.src="web/images/px.gif";
						else
						 iframeEl.src="javascript:false;";
		
                        iframeEl.style.display = "none";
                        iframeEl.style.position = "absolute";
                        iframeEl.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
                        iframeEl.zindex = "-1";
                        iframeEl.tabIndex = -1;  // omitted from the tabbing order
                        ulchild.iframeEl = ulchild.parentNode.insertBefore(iframeEl, ulchild);
                    }
					HideElement(ulchild);
                    break;
                }
            }
            /* assign the function to the ANCHOR */
            if(window.addEventListener) { // Mozilla, Netscape, Firefox
                parent.addEventListener('mouseover', function() {exitmenu = false;}, false);
                lis[i].addEventListener('focus', OnFocus(parent.id, ulchild != null? ulchild.id: null), false);
                lis[i].addEventListener('mouseover', OnFocus(parent.id, ulchild != null? ulchild.id: null), false);
                lis[i].addEventListener('blur', OnBlur(), false);
                lis[i].addEventListener('mouseout', OnBlur(), false);
            } else { // IE
                parent.attachEvent('onmouseover', function() {exitmenu = false;});
                lis[i].attachEvent('onfocus', OnFocus(parent.id, ulchild != null? ulchild.id: null));
                lis[i].attachEvent('onmouseover', OnFocus(parent.id, ulchild != null? ulchild.id: null));
                lis[i].attachEvent('onblur', OnBlur());
                lis[i].attachEvent('onmouseout', OnBlur());
            }
        }
    }
}

// -- Auxiliary Functions

// Unhides the menu identified by the received id
function ShowMenu(id) {
    exitmenu = false; // Showing a new menu -> cancel the exit menu timeout
    var isVisible = false;
    for (var i = 0; i < visiblemenus.length; i++) {
        if (visiblemenus[i] == id) {
            isVisible = true;
            break;
        }
    }
    if (!isVisible)
        visiblemenus.push(id);

    var elem = GetElement(id);
    ShowElement(elem);
    if (elem.iframeEl != undefined)
    {
        elem.iframeEl.style.left = elem.offsetLeft;
        elem.iframeEl.style.top  = elem.offsetTop;
        elem.iframeEl.style.width  = elem.offsetWidth;
        elem.iframeEl.style.height = elem.offsetHeight;
        elem.iframeEl.style.display = "";
    }
}
// Get an element by its id
function GetElement(id) {
    if (document.getElementById && document.getElementById(id)) {
        return document.getElementById(id);
    } else if (document.all && document.all[id]) {
        return document.all[id];
    } else if (document.layers && document.layers[id]) {
        return document.layers[id];
    }
}
// Close all menus except the one received
function CloseOtherMenus(id) {
    var keptmenus = [];
    for (var i = 0; i < visiblemenus.length; i++) {
        var iterId = visiblemenus[i];
        if (id != iterId && !IsParent(iterId, id)) {
            var elem = GetElement(iterId);
            HideElement(elem);
            if (elem.iframeEl != null)
                elem.iframeEl.style.display = "none";
        }
        else
            keptmenus.push(iterId);
    }
    visiblemenus = keptmenus;
}
// Returns true if the menu n is a parent of c
function IsParent(n, c) {
    if (c == undefined)
        return false;
    var elem = GetElement(c);
    var parent = elem.parentNode;
    while (parent.id == undefined || parent.id != 'vertnav') {
        if (parent.id && parent.id == n)
            return true;
        parent = parent.parentNode;
    }
    return false;
}
// Hides an HTML element
function ShowElement(elem) {
	var className = elem.className;
	if (className != undefined && className.indexOf("hidden") >= 0)
		elem.className = className.replace(/ hidden|hidden |hidden/,""); 
}
// Shows an HTML element
function HideElement(elem) {
	var className = elem.className;
	if (className == undefined || className.indexOf("hidden") < 0)
		elem.className = className? "hidden" : className + " hidden"; 
}
//** FIM DO NOVO MENU
//****************************




/* QUERY STRING -------------------------------------------------------------*/
// Trim whitespace from left and right sides of s.
function trim(s) {
	return s.replace(/^\s*|\s*$/g, "");
}
function trimAjax(s) {
	var r = s.replace(/^(\r\n)*|(\r\n)*$/g, "");
	r = trim(r);
	return r;
}

function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=Querystring_get
	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])
		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name
		this.params[name] = value;
	}
}
function Querystring_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	var value=this.params[key]
	if (value==null) value=default_;
	//alert("key : " + key + " value : " + value);
	return value;
}

var whereToReturnFocusTo;

// old method
function focusToDatePicker(returnFocusTo){
	if(browser.isIE){
		whereToReturnFocusTo = returnFocusTo;
		if(frames['gToday:contrast:agenda.js'].document.getElementById('_yearDPSelect')){
			frames['gToday:contrast:agenda.js'].document.getElementById('_yearDPSelect').focus();
		}
	}
}

// new method, this is now the default one [to revert: copy old method code here]
var focusToDatePickerALT_timeout;
function focusToDatePickerALT(returnFocusTo, enabled) {
	if (enabled) {
		whereToReturnFocusTo = returnFocusTo;
		if(frames['gToday:contrast:agenda.js'].document.getElementById('_yearDPSelect')){
			frames['gToday:contrast:agenda.js'].document.getElementById('_yearDPSelect').focus();
		}
	} else {
		focusToDatePickerALT_timeout = setTimeout('focusToDatePickerALT("'+returnFocusTo+'","true");', 500);
	}
}

// cancels focus
function cancelFocusToDatePickerAlt() {
	if (focusToDatePickerALT_timeout) {
		clearTimeout(focusToDatePickerALT_timeout);
		focusToDatePickerALT_timeout = null;
	}
}

/** creates querySting from form **/
function getAjaxRequestParameters(){

 	var qStr="";

    if (document.forms[0] != null) {
        for(i=0; i<document.forms[0].elements.length; i++) {
            var element =document.forms[0].elements[i];
            if (element.type!="undefined") {
                if ( (element.type == "hidden" || element.type == "text" || element.type == "textarea" || element.type == "select-one")
                        || ((element.type == "checkbox" || element.type == "radio") && (element.checked)) ) {
                   
                   if (qStr == "")
                    qStr += element.name+"="+element.value;
                   else
                   qStr += "&"+element.name+"="+element.value;
                }
            }
        }
    } //if

    
   return qStr;	
	
}

function isAjaxResponseError(ajaxRequest){

/* error control */	
	return (ajaxRequest.status != 200);
}

function isAjaxRequestError(ajaxRequest){

/* error control */	
	return (myAjax.transport.status != 200);
}

/** **/

function isdefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}



/** Teasers **/

function jsTeaser(imageDefault,imageOver,link,name){
 this.image = imageDefault;
 this.imageOver = imageOver;
 this.link = link;
 this.name =name;
}



function getIndexTeaserA(){
	return teasersIndex % teasersSize;
}

function getIndexTeaserB(){
	return (teasersIndex + 1) % teasersSize;
}

function incTeaserIndex(){
	teasersIndex = getIndexTeaserB();
}

function onMouseOverTeaserA(){

	if (teasersSize < 1)
		return;

	var teaserA = document.getElementById('teaserA');

	if (! teaserA)
		return;	
		
	teaserA.src = teasers[getIndexTeaserA()].imageOver.src;
	teaserA.style.cursor='hand';
}

function onMouseOutTeaserA(){
	
	if (teasersSize < 1)
		return;
		
	

	var teaserA = document.getElementById('teaserA');
	if (! teaserA)
		return;
		
	teaserA.src = teasers[getIndexTeaserA()].image.src;
	teaserA.style.cursor='default';
}

function onMouseOverTeaserB(){

	if (teasersSize < 2)
		return;

	var teaserB = document.getElementById('teaserB');
	if (! teaserB)
		return;
		
	teaserB.src = teasers[getIndexTeaserB()].imageOver.src;
	teaserB.style.cursor='hand';
}

function onMouseOutTeaserB(){
	
	if (teasersSize < 2)
		return;

	var teaserB = document.getElementById('teaserB');

	if (! teaserB)
		return;
		
	teaserB.src = teasers[getIndexTeaserB()].image.src;
	teaserB.style.cursor='default';


}

function initTeaserA(){

	if (teasersSize == 0)
		return;

	//image
	var teaserA = document.getElementById('teaserA');
	if (! teaserA)
		return;		
	teaserA.src = teasers[getIndexTeaserA()].image.src;
	
	//link
	var linkTeaserA = document.getElementById('linkTeaserA');
	if (! linkTeaserA)
		return;
	linkTeaserA.href = teasers[getIndexTeaserA()].link;
	linkTeaserA.title = teasers[getIndexTeaserA()].name;
	

}

function initTeaserB(){


	//alert("teasersSize:"+teasersSize);

	if (teasersSize < 2)
		return;
		
	var teaserB = document.getElementById('teaserB');
	if (! teaserB)
		return;
		
	teaserB.src = teasers[getIndexTeaserB()].image.src;
	
	//link
	var linkTeaserB = document.getElementById('linkTeaserB');
	if (! linkTeaserB)
		return;
	linkTeaserB.href = teasers[getIndexTeaserB()].link;	
	linkTeaserB.title = teasers[getIndexTeaserB()].name;

}

/** \Teasers **/



/** VeriSign **/

function vrsn_splash() {
	var url="https://seal.verisign.com/splash?form_file=fdf/splash.fdf&dn=CAIXADIRECTA.CGD.PT&lang=pt";
	var tbar = "location=yes,status=yes,resizable=yes,scrollbars=yes,width=560,height=500";
	sw = window.open(url,'VRSN_Splash',tbar);
	if(browser.isIE){
		if(sw){
			sw.focus();
		}
	}
}


/**\VeriSign **/

/** WAI Confirm Add-in **/
var showConfirmationDivBookmark = false;
var showValidationFailedDivBookmark = false;
function gotoConfirmationDivBookmark(){
	if(showConfirmationDivBookmark){
		window.location="#confirmationDivBookmark";
		/*document.getElementById("continueLink").href="#confirmationDivBookmark";*/
		showConfirmationDivBookmark = false;
	}
	else if(showValidationFailedDivBookmark){
		window.location="#validationFailedDivBookmark";
		/*document.getElementById("continueLink").href="#validationFailedDivBookmark";*/
		showValidationFailedDivBookmark = false;
	}
}

function waitToGoToDiv(timeToWait){
	setTimeout('gotoConfirmationDivBookmark()',timeToWait);
}
//waitToGoToDiv(1000);
/** End WAI Confirm Add-in **/

//----------------------------------------------------
//STOCKS AREA:

//Returns the current session key to have access 
//to the reuters web site;
function getReutersCurrentSessionKey(){
 	
 	alert("i'm deprecated... dont use me :-)");
 	
	return null;
}


function getTimeFrame(period){
	var timeFrame;
	
	if(period == "1D" || !period){
		
		timeFrame = "&CMD=INTRADAY";
 	}
 	else{
	
	 	timeFrame = "&DAY=0&CMD=INTERDAY&amp;ALLDAY=NO&TIME="+period+"&amp;TIMEZONE=LOCAL&amp;HSTCLOSE=YES&amp;FONT=5&amp;ALLEXCHANGEHOURS=YES";
	
		if(period == "3Y"){
			
			timeFrame = timeFrame + "&PERIODICITY=M"		
		}
 	}
 	return timeFrame

}

//Returns the url of the given stock;
//The ReutersKey is the mandatory since without it we cannot have access to reuters
//The market represents the market where SpecieId is negotiated (ex: LS (lisbon); AS (Amsterdam), ...)
function getSpecieChartJS(reutersKey, ric, period){
 	var returnValue;
 	var timeFrame = getTimeFrame(period);
 	
 	if(reutersKey && ric){
 		returnValue = "https://ri3.rois.com/" + reutersKey + "/CTIB/RI3APICHART?RIC=" + ric + "" + timeFrame + "&amp;GRID=YES&amp;GRIDDOTTED=YES&amp;GRIDCOLOR=505050&amp;VOL=NO&amp;STYLE=L&amp;AREA=YES&amp;AREACOLOR=FFFFFF&amp;AREABDCOLOR=FF9900&amp;LABEL=YES&amp;TEXTCOLOR=505050&amp;VALUE=YES&amp;BGIMAGE"
	}
	
	return returnValue;
	
}

//Returns the url of the given stock;
function getMarketChartJS(ReutersKey, period, MarketId){
 	var returnValue;
	var timeFrame = getTimeFrame(period);
 	 	
 	if(ReutersKey && MarketId){
		returnValue = "https://ri3.rois.com/"+ReutersKey+"/CTIB/RI3APICHART?RIC="+ MarketId +""+timeFrame+"&STYLE=L&CMD=INTRADAY&ALLEXCHANGEHOURS=YES&SKIN=2&FILLCOLOR=FFFFFF&FILLBGCOLOR=FFFFFF&LABEL=NO&HEIGHT=200&WIDTH=360&BACKPNG=YES&GRIDDOTTED=YES&GRID=YES&BORDERCOLOR=FFFFFF&AREA=YES&AREABDCOLOR=ff9988&AREACOLOR=FFCC99&TEXTCOLOR=336633&FRAME=YES&DAY=0";
	}

	return returnValue;
}

function getStockHistoryChartJS(ReutersKey, period, ric){
 	var returnValue;
	var timeFrame = getTimeFrame(period);
 	 	
 	if(ReutersKey && ric){
		//returnValue = "http://ri3.rois.com/"+ReutersKey+"/CTIB/RI3APICHART?RIC=ALTR.LS&TIME=1M&PERIODICITY=D&TIMEZONE=LOCAL&HSTCLOSE=YES&FONT=5&ALLEXCHANGEHOURS=YES&GRID=YES&GRIDDOTTED=YES&GRIDCOLOR=505050&VOL=NO&STYLE=L&AREA=YES&AREACOLOR=FFCC99&AREABDCOLOR=FF9988&LABEL=NO&TEXTCOLOR=505050&VALUE=YES&BGIMAGE=0&BACKPNG=YES&BORDERCOLOR=FFFFFF&FILLCOLOR=FFFFFF&FILLBGCOLOR=FFFFFF&FRAME=YES&";
		returnValue = "https://ri3.rois.com/"+ReutersKey+"/CTIB/RI3APICHART?RIC="+ ric +""+timeFrame+"&STYLE=L&CMD=INTRADAY&ALLEXCHANGEHOURS=YES&SKIN=2&FILLCOLOR=FFFFFF&FILLBGCOLOR=FFFFFF&LABEL=NO&HEIGHT=200&WIDTH=550&BACKPNG=YES&GRIDDOTTED=YES&GRID=YES&BORDERCOLOR=FFFFFF&AREA=YES&AREABDCOLOR=ff9988&AREACOLOR=FF9900&TEXTCOLOR=336633&FRAME=YES&DAY=0";
	}

	return returnValue;
}

function openDetailStockQuote(code, action, category){
	var catVar = "&cat=";
	if(category){
		catVar += category
	}



	openPopup(action+"?code="+code+catVar, null, null, 500, 400);
}

function openDetailS(code, action, category, marketId){
	var catVar = "&cat=";
	if(category){
		catVar += category
	}
	
	var marketIdVar = "";
	if (marketId) {
		marketIdVar = "&marketId="+marketId;
	}
	

	openPopup(action+"?code="+code+catVar+marketIdVar, null, null, 500, 450);
}

function openDetailM(code, action, category){
	
	var catVar = "&cat=";
	if(category){
		catVar += category
	}
	openPopup(action+"?code="+code+catVar, null, null, 400, 350);
}

function openDetailL(code, action, category, marketId){
	var catVar = "";
	if(category){
		catVar = "&cat=" + category
	}
	
	var marketIdVar = "";
	if (marketId) {
		marketIdVar = "&marketId="+marketId;
	}

	openPopup(action+"?code="+code+catVar+marketIdVar, null, null, 535, 530);
}

function openDetailWithQueryString(queryString, action, widthArg, heightArg){
	var width = 520;
	var height = 450;
	
	if(widthArg){
		width = widthArg
	}

	if(heightArg){
		height = heightArg
	}

	openPopup(action+"?"+queryString, null, null, width, height);
}


function getStockOrderControlDReceipt(order,type){
	openWindow("getStockOrderControlDReceipt.do?popup=1&order="+order+"&type="+type,600,800);	
}

function formatDecimal(amount, group, decimal) {
    amount = Math.round(amount*100)/100;

    return formatValue(amount, group, decimal);
}

function formatIfNotZero(v) {
    if (v == 0.0 || isNaN(v)) {
        return 'n.d.';
    } else {
        return formatEUR(v);
    }
}

function formatEUR(amount) {
    return  formatDecimal(amount, '.', ',') + " EUR";
}

function formatValue(amount, group, decimal) {
    amount = new String(amount);
    var fAmount = '';
    var gCount = 0;
    var dCount = -1;

    for (i = amount.length ; i > 0; i--) {
        ch = amount.substring(i - 1, i);
        if (ch == '.') {
            dCount = gCount;
            gCount = 0;
            fAmount = decimal + fAmount;
        } else {
            if (++gCount > 3) {
                fAmount = group + fAmount;
                gCount = 1;
            }
            fAmount = ch + fAmount;
        }
    }
    if (dCount == -1) {
        if (decimal != null) {
            fAmount = fAmount + decimal + '00';
        }
    } else if (dCount == 0) {
        fAmount = fAmount + '00';
    } else if (dCount == 1) {
        fAmount = fAmount + '0';
    }
    return fAmount;
}

// Add option to a select element 
function addOption(selectElementName, optionText, optionValue, selectFlag){

	var el= document.getElementById(selectElementName);
	if(el){
		if(el.length == 0){
			el.options[0] = new Option(optionText, optionValue);
		}
		else{
			el.options[el.length] = new Option(optionText, optionValue);
		}
	}
	
	if(selectFlag){
		el.value = el.options[el.length-1].value;
	}
}

// Adds an option, sorted by the option text, beginning from the end of the options array (because the internal transfers select also contains the accounts)
function addSortedOption(selectElementName, optionText, optionValue, selectFlag){
	var el = document.getElementById(selectElementName);
	var newOptionIndex = -1;
	
	if(el){
		
		if(el.length == 0){
			el.options[0] = new Option(optionText, optionValue);
		}
		else{
			var newOptionsArray = new Array();
			var inserted = false;
			var j = el.length - 1;

			for(i = el.length - 1 + 1; /* + 1 for the new option*/ i >= 0 ; i--) {
				
				if(eval(el.options[j].value) < 0){
					
					if(!inserted){
						if(j>=0 && i-1 >=0)
							newOptionsArray[i-1] = new Option(el.options[j].text, el.options[j].value);
						newOptionsArray[i] = new Option(optionText, optionValue);
						inserted = true;
						j++;
						newOptionIndex = i;
					}
					else{
						if(j>=0 && i >=0)
							newOptionsArray[i] = new Option(el.options[j].text, el.options[j].value);
					}					
					break;
				}
				
				if(!inserted &&  j >=0 && optionText.toLowerCase() > el.options[j].text.toLowerCase()) {
					newOptionsArray[i] = new Option(optionText, optionValue);
					inserted = true;
					j++;
					newOptionIndex = i;
				}
				else {
					if(j == -1){
						newOptionsArray[0] = new Option(el.options[0].text, el.options[0].value);
						newOptionsArray[1] = new Option(optionText, optionValue);
						newOptionIndex = 1;
					}
					else{
						newOptionsArray[i] = new Option(el.options[j].text, el.options[j].value);
					}
				}
				j--;
			}
			
			
			for(i = 0; i < newOptionsArray.length; i++) {
				if(newOptionsArray[i] && newOptionsArray[i].text && newOptionsArray[i].value){
					
					el.options[i] = newOptionsArray[i];
				}
			}
		}
	}
	if(selectFlag){
		el.value = el.options[newOptionIndex].value;
	}
}

/*
 * Function to prevent paste in a control
 * 
 * To disable paste in an input just add this: onpaste="fnPaste()"
 *
 * ATENTION: This method prevents paste from keyboard and mouse
 *
 */
function fnPaste() {
	event.returnValue = false;
}

/*
 * Function to prevent copy in a control
 * 
 * To disable copy in an input just add this: oncopy="fnCopy()"
 *
 * ATENTION: This method prevents copy from keyboard and mouse
 *
 */
function fnCopy() {
	event.returnValue = false;
}


/*
 *
 * Ajax.js
 *
 * Prototype Helper
 * initAjax(errorAction) - initializes the action to be called when an error occurs
 * ajaxCallAction(url, params, executeOnCompleteFunction, httpMethod) - does the ajax request
 * checkAjaxResult(originalRequest) - it checks if the ajax call returned error, if so it forwards to the errorAction
 * Error clause: if the response comes with the "<html" text;
 */


	var errorAction = "";

	function initAjax(newErrorAction){
		
		errorAction = newErrorAction;
	}

 	function ajaxCallAction(url, params, executeOnCompleteFunction, httpMethod, postBody){
		
		if(!params){	
			params = "";
		}
		if(!executeOnCompleteFunction){
			executeOnCompleteFunction = checkAjaxResult;
		}
		if(!httpMethod){
			httpMethod = 'get';
		}
		
		var myAjax = new Ajax.Request(
				url, 
				{
					method: httpMethod, 
					postBody: postBody,
					parameters: params, 
					onComplete: executeOnCompleteFunction
					
				}
		);	

	}
	
	
	function checkAjaxResult(originalRequest){
		
		var result = trimAjax(originalRequest.responseText);
		
		// check if the session has expired
		if(result && (result.indexOf("<HTML") != -1 || result.indexOf("<html") != -1) && 
			document.location.toString().lastIndexOf('/') != -1){
					
				var mainURL = document.location.toString().substring(0, document.location.toString().lastIndexOf('/'));
				var loginURL = mainURL + errorAction;
				document.location = loginURL;
				return false;
		}

		return true;
	}	

/* converts a String containing a double to have exacly nrDecimalPoints */	
function toDecimalPoints(input, nrDecimalPoints){
	
	var str = input + '';
	
	var result = '';
	var decimalPart = '';
	
	if(str.indexOf('.') != -1){
		decimalPart = str.substring(str.indexOf('.')+1, str.length+1);
		
		if(decimalPart.length > nrDecimalPoints){
			return str.substring(0, str.indexOf('.')+nrDecimalPoints+1);
		}

		result = str;
	
	}
	else{
		result = str +'.';
	}
	
	for(var i = decimalPart.length; i<nrDecimalPoints; i++){
		result += '0';
		
	}
	
	
	return result;

}	



/**
 *  Credential control via normal keyboard (NOT the virtual keyboard)
 *
 *  NOTE: combine with autojump to automatically jum from one input to the other
 *  
 *  Usage: define «codesArray» as you need to store the values inputed
 *
 */


function storeAndHideCode(element, e, index){
    var key;
    var keychar;

    if (e)
        key = (e.which)? e.which: e.keyCode;
    else if (window.event) {
        e = window.event;
        key = (e.which)?e.which:e.keyCode;
    } else
        return true;
    keychar = String.fromCharCode(key);

    // control keys
    if ((key == null) || (key == 0) || (key == 8) ||
        (key == 9) || (key == 13) || (key == 27))
        return true;

    // numbers
    else if ((("0123456789").indexOf(keychar) > -1)){
    	codesArray[index] = keychar;
 		element.value='*';
 		//WAS: return true;
 	}
 	
 	// Ticket #532 - GIP 9787 & Serviço CDO
 	// we never want nothing to be writen
 	return false;
}

function fillCredValue(nameOfTheField){
	if(document.getElementById(nameOfTheField)){
		document.getElementById(nameOfTheField).value = '';
		for(i=0; i<codesArray.length;i++){
			document.getElementById(nameOfTheField).value += codesArray[i];
		}
	}
}	
	
function putFocusOnTheFirstInput(nameOfTheInput){
	if(document.getElementById(nameOfTheInput)){
		document.getElementById(nameOfTheInput).focus();
	}
}


/* Function to get the focus to a customizable element. 
 *
 * The name of the element must be put in the (hidden) field whereToGetTheFocusTo
 * Won't caus e any JS error if 'whereToGetTheFocusTo' is not defined
 *
 */

function getFocusToCustomizableElement(){
	var nameOfElement;
	
	if(document.getElementById('whereToGetTheFocusTo')){
		nameOfElement = document.getElementById('whereToGetTheFocusTo').value;
		
		if( nameOfElement != null && 
			nameOfElement != "" && 
			nameOfElement.length != 0 &&
			document.getElementById(nameOfElement)){
			//try{
				document.getElementById(nameOfElement).focus();
			//}
			//catch(err){
				//nothing to perform
			//}
		}
	}
}


/**
 * Function to ajust the size of address of cheque agencies to max size
 * without passing the limits of the page
 */

function setChequeAddressComboMaxWidth(){
	setComboMaxWidth('addressIndex', 57, "435");
}
function setComboMaxWidth(comboId, charLimit, widthMaxSizePixel){
	if(document.getElementById(comboId)){
		
		var addressIndexObj = document.getElementById(comboId);
		var limitMaxWidth = charLimit;//characters
		var selectMaxWidth = 0;
		for( i=0; i<addressIndexObj.length;i++){
			if(addressIndexObj.options[i].text.length>selectMaxWidth){
				selectMaxWidth = addressIndexObj.options[i].text.length;
			}
			/*if(i==3){
			var printamos = "texto "+addressIndexObj.options[i].text;
				printamos += "\ntamanho "+addressIndexObj.options[i].text.length;
				alert (printamos);
			}*/
		}
		if(limitMaxWidth<selectMaxWidth){
			addressIndexObj.style.width=widthMaxSizePixel+"px";
		}
	}
}

/* AJAX ERROR MESSAGES */
function errorQueue(errors){
	this.errors = errors;
	this.add = function (msg){this.errors = msg;};
}

jsErrorQueue = new errorQueue('');
/* END AJAX ERROR MESSAGES */

/* DATE Functions */

function getDateDay(date){
	return date.getDate();
}

function getDateMonth(date){
	return (date.getMonth() + 1);
}

function getDateYear(date){
	return date.getUTCFullYear();
}

function printDate(date){
	
			alert(getDateDay(date) + "-" +
  				getDateMonth(date)+ "-" +
  				getDateYear(date));

}
/* \\DATE Functions */




	/* Aux DOM functions */
	
	//set display in style property to 'none' in a html element
	function hideHTMLEl(htmlElId){
		if(document.getElementById(htmlElId)){
			document.getElementById(htmlElId).style.display = 'none';
		}
	}

	//set display in style property to visible in a html element
	function showHTMLEl(htmlElId){
		if(document.getElementById(htmlElId)){
			document.getElementById(htmlElId).style.display = '';
		}
	}
	
	// copies srcText to dstEl.innerHTML 
	function copyText2InnerHtmlEl(srcText, dstHtmlElId){
		
		var dstEl = document.getElementById(dstHtmlElId);
		
		if(dstEl){
			dstEl.innerHTML = srcText;
		}
	}


	// returns value of parameter varName from queryString
	// e.g. var res =  getParamFromQueryString('name=myName&phoneNr=912324543', 'name')
	// (res will have the value myName) 
	function getParamFromQueryString(queryString, varName){
		
		if(!queryString || !varName){
			//wrong parameters
			return ;
		}
		
		if(queryString.indexOf(varName+"=") != -1){
			var value = queryString.substring(queryString.indexOf(varName+"=")+varName.length+1, queryString.length);
			if(value.indexOf("&") != -1){
				value = value.substring(0, value.indexOf("&"));
			}
			
			return value
		}
		return ;
	}


	//sets $el.value = value
	// unless value == '' || el does not exist
	function setVarValue(el, value){
		
		if(value != '' && document.getElementById(el)){
			document.getElementById(el).value = value;
		}
	}
	
	//sets $el.innerHTML = value
	// unless value == '' || el does not exist
	function setVarInnerHTML(el, value){
		
		if(value != '' && document.getElementById(el)){
			document.getElementById(el).innerHTML = value;
		}
	}
	/* Aux DOM functions END */



function removeFlashWarning(){

	var objects = document.getElementsByTagName("object");
	
	if (objects == null || objects.length == 0 )
		return;
	
	for(var i=0; i < objects.length; i++) {
	
		if (objects[i] == null ||  objects[i].outerHTML == null)
			continue;	
		

		objects[i].outerHTML = objects[i].outerHTML;
		
		
	}

}



function getAccountMappingPosition(array, value){
	
	for(i=0;i<array.length;i++){
	
		if(array[i] == value)
			return i;
			
	}
	
	return -1;
		
}


function getSelectedTextFromDropDown(dropDownId){

	if(document.getElementById(dropDownId) && 
		document.getElementById(dropDownId).selectedIndex < document.getElementById(dropDownId).options.length){
		
		return document.getElementById(dropDownId).options[document.getElementById(dropDownId).selectedIndex].text;
	}
	
	return null;
}

/* window.onload Editor */

var windowOnLoadFuncs = new Array();

function addWindowOnLoadFunction( func ) {
	if (windowOnLoadFuncs.length == 0) {
		if (window.onload != null) windowOnLoadFuncs[windowOnLoadFuncs.length] = window.onload;
		window.onload = function() {
							for(var i=0; i<windowOnLoadFuncs.length; i++) {
								windowOnLoadFuncs[i]();
							}
						};
	}
	windowOnLoadFuncs[windowOnLoadFuncs.length] = func;	
}

function clearWindowOnLoadFunctions() {
	windowOnLoadFuncs = new Array();
}

/* a safe parseInt */
function parseInt2(str){
 
 return parseInt(cleanLeftZeros(str));
}


/* replaces the last occurrence of char old, by String newStr*/
function replaceLast(str, oldChar, newStr){

	var charPosition = str.lastIndexOf(oldChar);	
	
	if(charPosition<=0 || charPosition>=str.length){
		return str;
	}
	
	return str.substring(0, charPosition-1) + newStr +  str.substring(charPosition+1);
}




/*******************************
*******    SGAF BOLSA    *******
*******************************/

function calcExpenses(quantidade, limite, ultimaCotacao, isBestPrice) {
    var vIliquido;
    if ((quantidade != null) && (quantidade > 0)) {
    	if(isBestPrice){
			if (ultimaCotacao != null) {
				vIliquido = Multiply(quantidade, ultimaCotacao);
				return parseFloat(vIliquido);
			}
    	}
    	else{
			if (limite != null && limite != '') {
				vIliquido = Multiply(quantidade, limite);
				return parseFloat(vIliquido);
        	}
    	}
	}
	return 0.0;
}


/*********************** PRECISION CALCULATOR ***********************/

   function NilFunction()
     {
       var reporter="No Function Yet."
       return reporter;
     }

   function BuildString (Symbol, Multiple)
     // returns a string that consists of the a Multiple number of Symbols.
     // for example, BuildString(x,5) returns "xxxxx"
   {
   var CompoundString="";
     while (IsEqualTo(Multiple,"0") == "FALSE")
       {
         CompoundString = CompoundString + Symbol;
         Multiple = Subtraction(Multiple,"1");
       }
     return CompoundString;
   }

   function RoundBigNumberUp (BigPositiveNumber)
     // Rounds a 'big' number up.  The assumption is that the number is Positive
     {
       var Answer = "";
       BigPositiveNumber = ZeroTrim(BigPositiveNumber); // in case it has lotsa zeroes at the end
       if (BigPositiveNumber.search(/\./) != (-1)) // if the number contains a decimal...
         {
           Answer = CalculatorAdd(RegExp.leftContext,"1");
         }
       else // there is no decimal in the number, therefore, it is already rounded
         {
           Answer = BigPositiveNumber;
         }
       return Answer;
     }

   function RoundBigNumberDown (BigPositiveNumber)
     // Rounds a 'big' number down.  The assumption is that the number is Positive
     {
       var Answer = "";
       BigPositiveNumber = ZeroTrim(BigPositiveNumber); // in case it has lotsa zeroes at the end
       if (BigPositiveNumber.search(/\./) != (-1)) // if the number contains a decimal...
         {
           Answer = RegExp.leftContext;
         }
       else // there is no decimal in the number, therefore, it is already rounded
         {
           Answer = BigPositiveNumber;
         }
       return Answer;
     }

   function BigNumberCeiling (BigRealNumber)
     // Finds the ceiling of BigRealNumber.
     {
       var Answer = "";
       if (BigRealNumber.charAt(0) == "-") // then it is a negative number
         {Answer = "-" + RoundBigNumberDown(BigRealNumber.substring(1,BigRealNumber.length));}
       else
         {Answer = RoundBigNumberUp(BigRealNumber);}
       return Answer;
     }

   function BigNumberFloor (BigRealNumber)
     // Finds the floor of BigRealNumber.
     {
       var Answer = "";
       if (BigRealNumber.charAt(0) == "-") // then it is a negative number
         {Answer = "-" + RoundBigNumberUp(BigRealNumber.substring(1,BigRealNumber.length));}
       else
         {Answer = RoundBigNumberDown(BigRealNumber);}
       return Answer;
     }

   function SubProduct (Multiplicand, SingleDigitMultiplier)
     // Multiplies Multiplicand (any number of digits) by a single digit Multiplier
     {
       var Carry = "0";
       var SubProduct = "";
       var TempProd = "0";
       for (var counter = Multiplicand.length-1; counter > (-1); counter--)
       {
         var TempProd = (Multiplicand.charAt(counter) * SingleDigitMultiplier) + parseInt(Carry);
         if (TempProd < 10) {TempProd = "0" + TempProd} // Now all small products are 2-digit numbers
         Carry = (TempProd + "").charAt(0);
         SubProduct = (TempProd + "").charAt(1) + SubProduct;
       }
       if (Carry != "0") {SubProduct = (Carry + SubProduct)}
       return SubProduct;
     }

   function ZeroTrim(BloatyAnswer) // trim trailing zeroes after the decimal and leading zeroes before
   {
     if (BloatyAnswer.search(/\./i) == -1)
       {
       BloatyAnswer = BloatyAnswer + ".0";
       }
     if (BloatyAnswer.charAt(0) == ".")
       {
       BloatyAnswer = "0" + BloatyAnswer;
       }
     while (BloatyAnswer.charAt(BloatyAnswer.length - 1) == "0")
       {
         BloatyAnswer = BloatyAnswer.substring(0,BloatyAnswer.length - 1);
         // trim that last character off if it's a zero
       }
       if (BloatyAnswer.charAt(BloatyAnswer.length - 1) == ".")
         // trim off that last decimal point, if it's there
         {
           BloatyAnswer = BloatyAnswer.substring(0,BloatyAnswer.length - 1);
         }
     // trim leading zeroes, but if the answer is simply "0", then stop.
        while ((BloatyAnswer.length>1) && (BloatyAnswer.charAt(0)=="0") && (BloatyAnswer.charAt(1)!="."))
          {
            BloatyAnswer = BloatyAnswer.substring(1,BloatyAnswer.length);
          }
     return BloatyAnswer;
   }

   function SwitchSign(Arg)
   {
     if (Arg.charAt(0)=="-")
       Arg = Arg.substring(1,Arg.length);
     else
       {
         Arg="-"+Arg;
       }
     return Arg;
   }

   function IsLessThan(Arg1,Arg2) // Is Arg1 less than Arg2?
   {
     var Result = "";
     // If Arg1 is negative and Arg2 is positive, then the answer is automatically true
       if (Arg1.charAt(0) == "-" && Arg2.charAt(0) !="-") {Result = "TRUE"}
     // If Arg1 is positive and Arg2 is negative, then the answer is automatically false
       if (Arg1.charAt(0) != "-" && Arg2.charAt(0) =="-") {Result = "FALSE"}
     // If Arg1 = Arg2, then the answer is automatically false
       if (IsEqualTo(Arg1,Arg2) == "TRUE") {Result = "FALSE"}
     // If Arg1 and Arg2 are both negative, then we swap them, switch signs, and try again.
       if (Arg1.charAt(0) == "-" && Arg2.charAt(0) =="-") {Result = IsLessThan(SwitchSign(Arg2),SwitchSign(Arg1))}
     // If Arg1 and Arg2 are both positive
       if (Result == "")
         {
           // Pad them with zeroes to line up the decimal (if it exists)
              var type = "";
              var AnswerArray1 = Arg1.split("."); // Split into an array
              var AnswerArray2 = Arg2.split("."); // Split into an array
              // make sure arrays have '0' instead of 'undefined' or '' as elements
              // split produces a mixed response, an empty string on the left of the split
              // and undefined on the right of the split.  This is further complicated by
              // the fact that Navigator understands "undefined" in comparisions, but
              // IE doesn't, so I have to create a variable and assign it to a typeof.
                 if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
                 type = typeof AnswerArray1[1];
                 if (type == "undefined") {AnswerArray1[1] = "0"}
                 if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
                 type = typeof AnswerArray2[1];
                 if (type == "undefined") {AnswerArray2[1] = "0"}

              // Rebuild operands as strings with decimals.
                 Arg1 = AnswerArray1[0] + "." + AnswerArray1[1];
                 Arg2 = AnswerArray2[0] + "." + AnswerArray2[1];
              // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
                 if (AnswerArray1[1].length > AnswerArray2[1].length)
                   {
                     Arg2 += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
                   }
                 if (AnswerArray2[1].length > AnswerArray1[1].length)
                   {
                     Arg1 += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
                   }

              // if integer split != then equalize by adding leading zeroes to the short integer
                 if (AnswerArray1[0].length > AnswerArray2[0].length)
                   {
                     Arg2 = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Arg2;
                   }
                 if (AnswerArray2[0].length > AnswerArray1[0].length)
                   {
                     Arg1 = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Arg1;
                   }
           var counter = 0;
           while ((Result=="") && (counter < Arg1.length))
           {
             if (Arg2.charAt(counter) < Arg1.charAt(counter)) {Result = "FALSE"}
             if (Arg2.charAt(counter) > Arg1.charAt(counter)) {Result = "TRUE"}
             counter++;
           }
         }
     // Return Result
       return Result;
   }

   function IsGreaterThan(Arg1,Arg2) // Is Arg1 greater than Arg2?
   {
     var Result = "";
     // If Arg1 is negative and Arg2 is positive, then the answer is automatically false
       if (Arg1.charAt(0) == "-" && Arg2.charAt(0) !="-") {Result = "FALSE"}
     // If Arg1 is positive and Arg2 is negative, then the answer is automatically true
       if (Arg1.charAt(0) != "-" && Arg2.charAt(0) =="-") {Result = "TRUE"}
     // If Arg1 = Arg2, then the answer is automatically false
       if (IsEqualTo(Arg1,Arg2) == "TRUE") {Result = "FALSE"}
     // If Arg1 and Arg2 are both negative, then we swap them, switch signs, and try again.
       if (Arg1.charAt(0) == "-" && Arg2.charAt(0) =="-") {Result = IsGreaterThan(SwitchSign(Arg2),SwitchSign(Arg1))}
     // If Arg1 and Arg2 are both positive
       if (Result == "")
         {
           // Pad them with zeroes to line up the decimal (if it exists)
              var type = "";
              var AnswerArray1 = Arg1.split("."); // Split into an array
              var AnswerArray2 = Arg2.split("."); // Split into an array
              // make sure arrays have '0' instead of 'undefined' or '' as elements
              // split produces a mixed response, an empty string on the left of the split
              // and undefined on the right of the split.  This is further complicated by
              // the fact that Navigator understands "undefined" in comparisions, but
              // IE doesn't, so I have to create a variable and assign it to a typeof.
                 if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
                 type = typeof AnswerArray1[1];
                 if (type == "undefined") {AnswerArray1[1] = "0"}
                 if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
                 type = typeof AnswerArray2[1];
                 if (type == "undefined") {AnswerArray2[1] = "0"}

              // Rebuild operands as strings with decimals.
                 Arg1 = AnswerArray1[0] + "." + AnswerArray1[1];
                 Arg2 = AnswerArray2[0] + "." + AnswerArray2[1];
              // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
                 if (AnswerArray1[1].length > AnswerArray2[1].length)
                   {
                     Arg2 += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
                   }
                 if (AnswerArray2[1].length > AnswerArray1[1].length)
                   {
                     Arg1 += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
                   }

              // if integer split != then equalize by adding leading zeroes to the short integer
                 if (AnswerArray1[0].length > AnswerArray2[0].length)
                   {
                     Arg2 = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Arg2;
                   }
                 if (AnswerArray2[0].length > AnswerArray1[0].length)
                   {
                     Arg1 = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Arg1;
                   }
           var counter = 0;
           while ((Result=="") && (counter < Arg1.length))
           {
             if (Arg2.charAt(counter) < Arg1.charAt(counter)) {Result = "TRUE"}
             if (Arg2.charAt(counter) > Arg1.charAt(counter)) {Result = "FALSE"}
             counter++;
           }
         }
     // Return Result
       return Result;
   }

   function IsEqualTo(Arg1,Arg2)
   {
     var Result = "FALSE";
     if (Arg1.length == Arg2.length)
       {
         Result = "TRUE";
         for (counter = 0; counter < Arg1.length; counter++)
           {
             if (Arg1.charAt(counter) != Arg2.charAt(counter)) {Result = "FALSE"}
           }
       }

     // Return Result
       return Result;
   }

   function Subtraction(Minuend,Subtrahend) // Minuend - Subtrahend = Difference
   {
     var Difference = "";
     // Pad them with zeroes to line up the decimal (if it exists)
        var type="";
        var AnswerArray1 = Minuend.split("."); // Split into an array
        var AnswerArray2 = Subtrahend.split("."); // Split into an array
        // make sure arrays have '0' instead of 'undefined' or '' as elements
        // split produces a mixed response, an empty string on the left of the split
        // and undefined on the right of the split.  This is further complicated by
        // the fact that Navigator understands "undefined" in comparisions, but
        // IE doesn't, so I have to create a variable and assign it to a typeof.
           if (AnswerArray1[0] == "") {AnswerArray1[0] = "0"}
           type = typeof AnswerArray1[1];
           if (type == "undefined") {AnswerArray1[1] = "0"}
           if (AnswerArray2[0] == "") {AnswerArray2[0] = "0"}
           type = typeof AnswerArray2[1];
           if (type == "undefined") {AnswerArray2[1] = "0"}

        // Rebuild operands as strings with decimals.
           Minuend = AnswerArray1[0] + "." + AnswerArray1[1];
           Subtrahend = AnswerArray2[0] + "." + AnswerArray2[1];
        // if decimal split !=, then equalize by adding trailing zeroes to the short decimal
           if (AnswerArray1[1].length > AnswerArray2[1].length)
             {
               Subtrahend += BuildString("0",AnswerArray1[1].length-AnswerArray2[1].length+"");
             }
           if (AnswerArray2[1].length > AnswerArray1[1].length)
             {
               Minuend += BuildString("0",AnswerArray2[1].length-AnswerArray1[1].length+"");
             }
        // if integer split != then equalize by adding leading zeroes to the short integer
           if (AnswerArray1[0].length > AnswerArray2[0].length)
             {
               Subtrahend = BuildString("0",AnswerArray1[0].length-AnswerArray2[0].length+"") + Subtrahend;
             }
           if (AnswerArray2[0].length > AnswerArray1[0].length)
             {
               Minuend = BuildString("0",AnswerArray2[0].length-AnswerArray1[0].length+"") + Minuend;
             }
     // If Minuend == Subtrahend, then the answer is simply 0
        if (!Difference && (IsEqualTo(Minuend,Subtrahend)=="TRUE")) {Difference= "0"}
     // If Minuend is positive and Subtrahend is negative,
     // then this is an addition problem
        if (!Difference && Minuend.charAt(0)!="-" && Subtrahend.charAt(0)=="-")
          {
            Subtrahend=Subtrahend.substring(1,Subtrahend.length);
            Difference = CalculatorAdd(Minuend,Subtrahend);
          }
     // If Minuend and Subtrahend are negative, invert both
     //  signs and reverse operands -- continue
        if (!Difference && Minuend.charAt(0)=="-" && Subtrahend.charAt(0)=="-")
          {
            Subtrahend=Subtrahend.substring(1,Subtrahend.length);
            Minuend=Minuend.substring(1,Minuend.length);
            var TemporaryVariable = Subtrahend;
            Subtrahend = Minuend;
            Minuend = TemporaryVariable;
          }
     // If Minuend is negative and Subtrahend is positive, then
     // remove Minuend sign, process as an addition, and then
     // append negative sign.
        if (!Difference && Minuend.charAt(0) == "-" && Subtrahend.charAt(0) !="-")
          {
            Minuend=Minuend.substring(1,Minuend.length);
            Difference = "-" + CalculatorAdd(Minuend,Subtrahend);
          }
     // Minuend and Subtrahend are both positive numbers,
     // either because they started out that way, or they started
     // out as both negative numbers and were converted by an
     // earlier process.  For all other cases, Difference has
     // already been assigned a value
        if (!Difference)
          {
            // If the Minuend is smaller than the Subtrahend, then the
            // result will be a negative number, so set a "negative"
            // tag (NegativeTag = "-" instead of ""), reverse the
            // operands, and continue.
               var NegativeTag = "";
               if (IsLessThan(Minuend,Subtrahend)=="TRUE")
               {
                 var TempVariable = Minuend;
                 Minuend = Subtrahend;
                 Subtrahend = TempVariable;
                 NegativeTag="-";
               }
            // Perform the digit-by-digit subtraction
               var BorrowFlag="0";
               for (counter = Minuend.length-1; counter > -1; counter--)
               {
                 if (Minuend.charAt(counter) ==".") // then it's a decimal point
                   Difference = "." + Difference
                 else // it's a genuine number
                   {
                     // because it's a number, perform the subtraction and append it to Difference
                     var MinuendPiece = parseInt(Minuend.charAt(counter));
                     var SubtrahendPiece = parseInt(Subtrahend.charAt(counter));
                     if (BorrowFlag == 1) {BorrowFlag = 0; MinuendPiece = MinuendPiece -1}
                     if (MinuendPiece < 0) {MinuendPiece = 9; BorrowFlag = 1}
                     if (MinuendPiece < SubtrahendPiece)
                       {
                         MinuendPiece = MinuendPiece + 10;
                         BorrowFlag = 1;
                       }
                     Difference = (MinuendPiece - SubtrahendPiece) + Difference;
                   }
               }
            // Remove trailing and leading zeroes
               Difference = ZeroTrim(Difference);
            // Append to the NegativeTag
               Difference = NegativeTag + Difference;
          }
       // Return Difference
     return Difference;
   }

   function CalculatorAdd(operand1,operand2)
   {
     var answer = "";

     if (operand1.charAt(0)!="-" && operand2.charAt(0)=="-") {answer = Subtraction(operand1,SwitchSign(operand2))}
     if (operand1.charAt(0)=="-" && operand2.charAt(0)!="-") {answer = Subtraction(operand2,SwitchSign(operand1))}
     if (operand1.charAt(0)=="-" && operand2.charAt(0)=="-") {answer = Subtraction(operand1,SwitchSign(operand2))}
     if (answer=="")
     {
       // Equalize both sides of the decimals
          var Operand1LeftPad = "";
          var Operand2LeftPad = "";
          var Operand1RightPad = "";
          var Operand2RightPad = "";
          var Operand1RightSide = "";
          var Operand2RightSide = "";
          var Operand1LeftSide = "";
          var Operand2LeftSide = "";

          if (operand1.search(/\./) == -1) // then there is no decimal in operand1
            {
              Operand1RightSide = "0";
              Operand1LeftSide = operand1;
            }
            else // there is a decimal and we must determine the values of the sides
              {
                Operand1RightSide=RegExp.rightContext;
                Operand1LeftSide=RegExp.leftContext;
              }
          if (operand2.search(/\./) == -1) // then there is no decimal in operand2
            {
              Operand2RightSide = "0";
              Operand2LeftSide = operand2;
            }
            else // there is a decimal and we must determine the values of the sides
              {
                Operand2RightSide=RegExp.rightContext;
                Operand2LeftSide=RegExp.leftContext;
              }
          if (Operand1LeftSide.length > Operand2LeftSide.length)
            { Operand2LeftPad = BuildString("0",(Operand1LeftSide.length - Operand2LeftSide.length+"")+""); }
          if (Operand1LeftSide.length < Operand2LeftSide.length)
            { Operand1LeftPad = BuildString("0",(Operand2LeftSide.length - Operand1LeftSide.length)+""); }

          if (Operand1RightSide.length > Operand2RightSide.length)
            { Operand2RightPad = BuildString("0",(Operand1RightSide.length - Operand2RightSide.length)+""); }
          if (Operand1RightSide.length < Operand2RightSide.length)
            { Operand1RightPad = BuildString("0",(Operand2RightSide.length - Operand1RightSide.length)+""); }

          operand1 = Operand1LeftPad + Operand1LeftSide + "." + Operand1RightSide + Operand1RightPad;
          operand2 = Operand2LeftPad + Operand2LeftSide + "." + Operand2RightSide + Operand2RightPad;

     // perform digit-by-digit addition
        var CarryFlag = 0;
            answer = "";
        for (counter=operand1.length-1; counter > (-1); counter--)
          {
            var temp = parseInt(operand1.charAt(counter)) + parseInt(operand2.charAt(counter)) + parseInt(CarryFlag);
            if ((temp > (-1)) && (temp < 20))
              {
              if (temp > 9)
                {
                  CarryFlag = 1;
                  answer = temp-10 + answer;
                }
              else
                {
                  CarryFlag = 0;
                  answer = temp + answer;
                }
              }
            else
              {
                answer = "." + answer;
                // unless the answer is an actual number, it's going 
                // to be NaN or undefined, or perhaps something else.  
                // I just force the conversion to a decimal, but I 
                // should consider adding some kind of error catching 
                // routine here.
              }
          }
        // and just in case the CarryFlag is carrying something after all the digits are done...
        if (CarryFlag == 1) {answer = "1" + answer}

     //  In order to make things smoother earlier, I just converted both numbers to
     //  decimals, even if they weren't.  So now that the addition's over, there are
     //  two possibilities that would leave a number unattractive.  One, if I added
     //  two whole numbers such as 5 & 7, the result looks like 12.0, in which case
     //  I want to trim off the trailing zero AND the decimal point.  Another
     //  possibility is if trailing digits totaled out to 0, in which case they would
     //  still be there.  For example, 1.05 and 1.05 should be 2.1, but reports as
     //  2.10 so time to clean that up.
         answer = ZeroTrim(answer);
     }
     return answer;
   }

   function Multiply(Multiplicand,Multiplier)
     {
       var Product = "";
       var DecimalShift = "0";
       var ProductSign = "";
       // Determine the Product Sign and render both numbers positive
         if (Multiplicand.charAt(0) == "-" && Multiplier.charAt(0) != "-") {ProductSign = "-"}
         if (Multiplicand.charAt(0) != "-" && Multiplier.charAt(0) == "-") {ProductSign = "-"}
         if (Multiplicand.charAt(0) == "-") {Multiplicand = Multiplicand.substring(1,Multiplicand.length)}
         if (Multiplier.charAt(0) == "-") {Multiplier = Multiplier.substring(1,Multiplier.length)}

       // Handle the easy cases (when either the Muliplicand or the Multiplier is "1" or "0")
         if (ZeroTrim(Multiplicand) == "0")
           {
             Product = "0";
             ProductSign="";
           }
         if (ZeroTrim(Multiplier) == "0")
           {
             Product = "0";
             ProductSign="";
           }
         if (ZeroTrim(Multiplicand) == "1")
           {
             Product = Multiplier;
           }
         if (ZeroTrim(Multiplier) == "1")
           {
             Product = Multiplicand;
           }
       // If the Product ISN'T a no-brainer...
         if (Product == "")
           {
            // Determine the Product Decimal Shift
              // If there is a decimal in either factor, then the answer will include a 
              // decimal (unless it zeroes out), so we must determine where in the final 
              // Product the new decimal will appear.
              var DecimalShift = 0;
              var DecimalShiftMultiplicand = Multiplicand.length-(Multiplicand.indexOf(".")+1);
              var DecimalShiftMultiplier = Multiplier.length-(Multiplier.indexOf(".")+1);
              if(DecimalShiftMultiplicand == Multiplicand.length) { DecimalShiftMultiplicand = 0; }
              if(DecimalShiftMultiplier == Multiplier.length) { DecimalShiftMultiplier = 0; }
              DecimalShift = DecimalShiftMultiplier + DecimalShiftMultiplicand;
            // Remove the decimals from the numbers
              Multiplicand=ZeroTrim(Multiplicand.replace(".",""));
              Multiplier=ZeroTrim(Multiplier.replace(".",""));
              
            // Multiply the Multiplicand by the Multiplier
              Product = "0";
              for (var counter = Multiplier.length-1; counter > -1; counter--)
                {
                  NumberOfZeroes = BuildString("0",Multiplier.length - counter - 1+"");
                  Product = CalculatorAdd(Product,(SubProduct(Multiplicand,Multiplier.charAt(counter)) + NumberOfZeroes));
                }

            // Split the Product and re-insert the Decimal
               if (DecimalShift > Product.length)
                 { Product = "0." + BuildString("0",DecimalShift - Product.length + "") + Product; }
               else if (DecimalShift == Product.length)
                 { Product = "0." + Product; }
               else if (DecimalShift < Product.length)
                 { Product = Product.substr(0,Product.length - DecimalShift) + "." + Product.substr(Product.length - DecimalShift,DecimalShift); }
           }

       // Sign the Product
         Product = ZeroTrim(ProductSign + Product);

       // Return the Result
          return Product;
     }

   function DIV_MOD(Divisor,Dividend,Operation)
     {
       // Declare variables
          var Quotient = "";
          var Remainder = "";
          var Answer = "";
          var QuotientSign = "";
          var counterDiv = 0;
          var DivHashTable = new Array(10);
          var OldDivisor;
          var OldDividend;
          var temp = "";

       // Set the Operation to English
          if (Operation == 0) {Operation = "DIV"}
          if (Operation == 1) {Operation = "MOD"}

       // Handle the situation if the Divisor = 0
          if (Divisor == "0")
          {
            Quotient = "Undefined";
            Remainder = "Undefined";
          }

       // Handle the situation if the Dividend = 0
          if (Dividend == "0" && !Quotient)
          {
            Quotient = "0";
            Remainder = "0";
          }

       // Determine the sign of the quotient and strip sign from the Divisor and Dividend
          // If Divisor is positive, but Dividend is negative, then the Quotient is Negative
             if (!Quotient && Divisor.charAt(0)!="-" && Dividend.charAt(0)=="-")
               {
                 QuotientSign = "-"
                 Dividend = Dividend.substring(1,Dividend.length)
               }
          // If Dividend is positive, but Divisor is negative, then the Quotient is Negative
             if (!Quotient && Divisor.charAt(0)=="-" && Dividend.charAt(0)!="-")
               {
                 QuotientSign = "-"
                 Divisor = Divisor.substring(1,Divisor.length)
               }
          // If Divisor AND Dividend are negative, then the Quotient is Positive
             if (!Quotient && Divisor.charAt(0)=="-" && Dividend.charAt(0)=="-")
               {
                 Dividend = Dividend.substring(1,Dividend.length)
                 Divisor = Divisor.substring(1,Divisor.length)
               }

       // Handle the situation if the Divisor is greater than the Dividend
          if (IsLessThan(Dividend,Divisor) == "TRUE" && !Quotient) // Is Arg1 less than Arg2?
          {
            Quotient = "0";
            Remainder = Dividend;
          }

       // Handle the situation if the Divisor and the Dividend are equal
          if (IsEqualTo(Divisor,Dividend) == "TRUE" && !Quotient)
          {
            Quotient = "1";
            Remainder = "0";
          }

       // Handle the situation if the Divisor == 1
          if (Divisor == "1" && !Quotient)
          {
            Quotient = Dividend;
            Remainder = "0";
          }


       // At this point, we probably have a normal, well-behaved division
          if (Quotient == "")
          {
            OldDivisor = Divisor;
            OldDividend = Dividend;
            if ((Divisor.search(/\./) == -1) && (Dividend.search(/\./) == -1)) // if each number contains no decimal, do nothing
            ;
            else // but if either one contains a decimal, then they must both be multiplied until they are Whole numbers.

              {
                // Multiply by a power of 10 to remove the decimals.
                   var Throwaway = "";
                   var DivisorMultiplier = "";
                   var DividendMultiplier = "";
                   if (Divisor.search(/\./) == (-1)) DivisorMultiplier = ""; else {DivisorMultiplier = RegExp.rightContext};
                   if (Dividend.search(/\./) == (-1)) DividendMultiplier = ""; else {DividendMultiplier = RegExp.rightContext};
                   var TempMultiplier = Math.max(DivisorMultiplier.length,DividendMultiplier.length)+"";
                   TempMultiplier = "1" + BuildString("0",TempMultiplier+""); // Build the Multiplier
                   Divisor=Multiply(Divisor,TempMultiplier); // Perform the Big Multiplication
                   Dividend=Multiply(Dividend,TempMultiplier); // Perform the Big Multiplication
              }

            // Create a searchable hash table of Divisor values
               for (counterDiv = 0; counterDiv < 10; counterDiv++)
                 {
                   DivHashTable[counterDiv] = Multiply(Divisor,(counterDiv + '')); // the "+''" converts counterDiv to a string
                   // DivHashTable[0] = 0 * Divisor and so on...
                 }

            // Perform an ordinary division
                  
               // Set up variables
                  var CurrentAnswer = "";
                  var NewDividend = Dividend;
                  var Pointer = "";
                  var DividendMultiplierSubstring = "";
                  var TempMultiplier = "";
                  var HashCounter;
               // Start Looping through Dividend
                  while ((IsGreaterThan(NewDividend,Divisor) == "TRUE") || (IsEqualTo(NewDividend,Divisor) == "TRUE"))
                    {
                      // Set pointer at beginning of NewDividend
                         Pointer = 1;
                      // Increment the Pointer until DividendMultiplierString >= Divisor
                         while (IsLessThan(NewDividend.substring(0,Pointer),Divisor) == "TRUE")
                           {
                             Pointer++ ;
                           }
                         DividendMultiplierSubstring = NewDividend.substring(0,Pointer);
                      // Find the largest result in the hash table still less than DividendMultiplierSubstring
                         HashCounter = 9;
                         while (IsGreaterThan(DivHashTable[HashCounter]+"",DividendMultiplierSubstring) == "TRUE")
                           {
                             HashCounter-- ;
                           }
                      // HashCounter is its key in the Hash Table

                      // Append the same number of zeroes to the key as decimals to the right of pointer, making TempMultiplier
                         TempMultiplier = HashCounter+"" + BuildString("0",NewDividend.length-DividendMultiplierSubstring.length+"");

                      // Add TempMultiplier to CurrentAnswer
                         CurrentAnswer = CalculatorAdd(CurrentAnswer,TempMultiplier);
                      // Subtract the product of Divisor and TempMultiplier from NewDividend to get a NEW NewDividend
                         NewDividend = Subtraction(NewDividend,Multiply(Divisor,TempMultiplier));
                    } // while ((IsGreaterThan(NewDividend,Divisor) == "TRUE") ||...

            // Nail the calculated values down
               Quotient = CurrentAnswer;
               Remainder = Subtraction(OldDividend,Multiply(OldDivisor,Quotient));

            } // if (Quotient == "")

       // Return Answer to main program
          if (Operation == "DIV") {Answer = QuotientSign + Quotient}
          if (Operation == "MOD") {Answer = Remainder}
          return Answer;
     }

   function Factorial(StartNumber) // Look, Mom -- no recursion!
     {
       // Declare variables
          var Answer = "";
          var BigCounter = "";
          var RangeCheck = "";
          var Warning = "NOTE:"
                        + "\n"
                        + "The Factorial operator is designed to function only"
                        + "\n"
                        + "for the non-negative integers: {0, 1, 2, 3,...}."
                        + "\n\n"
                        + "Negative or Decimal arguments are not valid.";

       // If StartNumber = 0 or 1 then Answer = 1
          if (StartNumber == "0") {Answer = "1"}

       // Check and invalidate for Decimals
          if (!Answer && (StartNumber.indexOf(".") != "-1"))
            {
              Answer = "Undefined";
              alert(Warning);
            }

       // Check and invalidate for negative numbers
          if (!Answer && (StartNumber.charAt(0) == "-"))
            {
              Answer = "Undefined";
              alert(Warning);
            }

       // If the answer is nontrivial, then perform the calculation
          if (!Answer)
            {
              Answer = "1";
              BigCounter = "1";
              RangeCheck = CalculatorAdd(StartNumber,"1");
              while (BigCounter != RangeCheck)
                {
                  Answer = Multiply(Answer,BigCounter);
                  BigCounter = CalculatorAdd(BigCounter,"1");
                }
            }

       // Return the Answer
          return Answer;
     }

   function Power(StartNumber,Exponent)
     {
       // Declare variables
          var Answer = "";
          var BigCounter = "";
          var RangeCheck = "";
          var Warning = "NOTE:"
                        + "\n"
                        + "The Power operator is designed to function only with exponents"
                        + "\n"
                        + "that are non-negative integers {0, 1, 2, 3,...}."
                        + "\n\n"
                        + "Negative or Decimal exponents are not valid at this time.";

       // If Exponent = 0 then Answer = 1
          if (Exponent == "0") {Answer = "1"}

       // If Exponent = 1 then Answer = StartNumber
          if (Exponent == "1") {Answer = StartNumber}

       // If StartNumber = 0 then Answer = 0
          if (StartNumber == "0") {Answer = "0"}

       // If StartNumber = 1 then Answer = 1
          if (StartNumber == "1") {Answer = "1"}

       // Check and invalidate for Decimals
          if (!Answer && (Exponent.indexOf(".") != "-1"))
            {
              Answer = "Not valid at this time.";
              alert(Warning);
            }

       // Check and invalidate for negative numbers
          if (!Answer && (Exponent.charAt(0) == "-"))
            {
              Answer = "Not valid at this time.";
              alert(Warning);
            }

       // If the answer is nontrivial, then perform the calculation
          if (!Answer)
            {
              Answer = "1";
              BigCounter = "1";
              RangeCheck = CalculatorAdd(Exponent,"1");
              while (BigCounter != RangeCheck)
                {
                  Answer = Multiply(Answer,StartNumber);
                  BigCounter = CalculatorAdd(BigCounter,"1");
                }
            }

       // Return the Answer
          return Answer;
     }

   function GCD(XValue,YValue)
     {
       // Declare variables
          var Answer = "";
          var ZValue = "";
          var TempNumber = "";
          var Warning = "NOTE:"
                        + "\n"
                        + "The GCD operator is designed to function only"
                        + "\n"
                        + "for the non-negative integers: {0, 1, 2, 3,...}."
                        + "\n\n"
                        + "Negative or Decimal arguments are not valid.";
       // Error Checking
         if ((XValue.charAt(0) == "-") || (YValue.charAt(0) == "-") || ZeroTrim(XValue).search(/\./) != (-1) || ZeroTrim(YValue).search(/\./) != (-1))
           {
             Answer = "";
             alert(Warning);
           }
         else // We can do the calculation
           {
             while (IsEqualTo(XValue,YValue) == "FALSE")
               {
                 if (IsLessThan(XValue,YValue) == "TRUE") // then swap 'em
                   {
                     TempNumber = XValue;
                     XValue = YValue;
                     YValue = TempNumber;
                   }
                 ZValue = Subtraction(XValue,YValue);
                 XValue = YValue;
                 YValue = ZValue;
               }
             Answer = XValue; // The revised XValue from above
           }
       // Return Answer
          return Answer;
     }

   function LCM(XValue,YValue)
     {
       // Declare variables
          var Answer = "";
          var Warning = "NOTE:"
                        + "\n"
                        + "The LCM operator is designed to function only"
                        + "\n"
                        + "for the non-negative integers: {0, 1, 2, 3,...}."
                        + "\n\n"
                        + "Negative or Decimal arguments are not valid.";
       // Error Checking
         if ((XValue.charAt(0) == "-") || (YValue.charAt(0) == "-") || ZeroTrim(XValue).search(/\./) != (-1) || ZeroTrim(YValue).search(/\./) != (-1))
           {
             Answer = "";
             alert(Warning);
           }
         else // We can do the calculation
           {
             Answer = DIV_MOD(GCD(XValue,YValue),Multiply(XValue,YValue),"DIV");
           }
       // Return Answer
          return Answer;
     }

   function IsPrime(Argument) // Returns FALSE if Argument is Composite, TRUE if Argument is Prime
     {
       // Declare variables
          var Answer = "TRUE";
          var RollingNumber = "";
          var Counter;
          var DigitSum;
          var Warning = "NOTE:"
                        + "\n"
                        + "The Is Prime function is designed to function only"
                        + "\n"
                        + "for non-negative integers greater than 1: {2, 3, 4,...}."
                        + "\n\n"
                        + "0, 1, Negative or Decimal arguments are not valid.";
          var PrimeArray=["2","3","5","7","11","13","17","19","23","29","31","37","41","43","47","53","59","61","67","71","73","79","83","89","97","101","103","107","109","113","127","131","137","139","149","151","157","163","167","173","179","181","191","193","197","199","211","223","227","229","233","239","241","251","257","263","269","271","277","281","283","293","307","311","313","317","331","337","347","349","353","359","367","373","379","383","389","397","401","409","419","421","431","433","439","443","449","457","461","463","467","479","487","491","499","503","509","521","523","541","547","557","563","569","571","577","587","593","599","601","607","613","617","619","631","641","643","647","653","659","661","673","677","683","691","701","709","719","727","733","739","743","751","757","761","769","773","787","797","809","811","821","823","827","829","839","853","857","859","863","877","881","883","887","907","911","919","929","937","941","947","953","967","971","977","983","991","997","1009","1013","1019","1021","1031","1033","1039","1049","1051","1061","1063","1069","1087","1091","1093","1097","1103","1109","1117","1123","1129","1151","1153","1163","1171","1181","1187","1193","1201","1213","1217","1223","1229","1231","1237","1249","1259","1277","1279","1283","1289","1291","1297","1301","1303","1307","1319","1321","1327","1361","1367","1373","1381","1399","1409","1423","1427","1429","1433","1439","1447","1451","1453","1459","1471","1481","1483","1487","1489","1493","1499","1511","1523","1531","1543","1549","1553","1559","1567","1571","1579","1583","1597","1601","1607","1609","1613","1619","1621","1627","1637","1657","1663","1667","1669","1693","1697","1699","1709","1721","1723","1733","1741","1747","1753","1759","1777","1783","1787","1789","1801","1811","1823","1831","1847","1861","1867","1871","1873","1877","1879","1889","1901","1907","1913","1931","1933","1949","1951","1973","1979","1987","1993","1997","1999","2003","2011","2017","2027","2029","2039","2053","2063","2069","2081","2083","2087","2089","2099","2111","2113","2129","2131","2137","2141","2143","2153","2161","2179","2203","2207","2213","2221","2237","2239","2243","2251","2267","2269","2273","2281","2287","2293","2297","2309","2311","2333","2339","2341","2347","2351","2357","2371","2377","2381","2383","2389","2393","2399","2411","2417","2423","2437","2441","2447","2459","2467","2473","2477","2503","2521","2531","2539","2543","2549","2551","2557","2579","2591","2593","2609","2617","2621","2633","2647","2657","2659","2663","2671","2677","2683","2687","2689","2693","2699","2707","2711","2713","2719","2729","2731","2741","2749","2753","2767","2777","2789","2791","2797","2801","2803","2819","2833","2837","2843","2851","2857","2861","2879","2887","2897","2903","2909","2917","2927","2939","2953","2957","2963","2969","2971","2999","3001","3011","3019","3023","3037","3041","3049","3061","3067","3079","3083","3089","3109","3119","3121","3137","3163","3167","3169","3181","3187","3191","3203","3209","3217","3221","3229","3251","3253","3257","3259","3271","3299","3301","3307","3313","3319","3323","3329","3331","3343","3347","3359","3361","3371","3373","3389","3391","3407","3413","3433","3449","3457","3461","3463","3467","3469","3491","3499","3511","3517","3527","3529","3533","3539","3541","3547","3557","3559","3571","3581","3583","3593","3607","3613","3617","3623","3631","3637","3643","3659","3671","3673","3677","3691","3697","3701","3709","3719","3727","3733","3739","3761","3767","3769","3779","3793","3797","3803","3821","3823","3833","3847","3851","3853","3863","3877","3881","3889","3907","3911","3917","3919","3923","3929","3931","3943","3947","3967","3989","4001","4003","4007","4013","4019","4021","4027","4049","4051","4057","4073","4079","4091","4093","4099","4111","4127","4129","4133","4139","4153","4157","4159","4177","4201","4211","4217","4219","4229","4231","4241","4243","4253","4259","4261","4271","4273","4283","4289","4297","4327","4337","4339","4349","4357","4363","4373","4391","4397","4409","4421","4423","4441","4447","4451","4457","4463","4481","4483","4493","4507","4513","4517","4519","4523","4547","4549","4561","4567","4583","4591","4597","4603","4621","4637","4639","4643","4649","4651","4657","4663","4673","4679","4691","4703","4721","4723","4729","4733","4751","4759","4783","4787","4789","4793","4799","4801","4813","4817","4831","4861","4871","4877","4889","4903","4909","4919","4931","4933","4937","4943","4951","4957","4967","4969","4973","4987","4993","4999","5003","5009","5011","5021","5023","5039","5051","5059","5077","5081","5087","5099","5101","5107","5113","5119","5147","5153","5167","5171","5179","5189","5197","5209","5227","5231","5233","5237","5261","5273","5279","5281","5297","5303","5309","5323","5333","5347","5351","5381","5387","5393","5399","5407","5413","5417","5419","5431","5437","5441","5443","5449","5471","5477","5479","5483","5501","5503","5507","5519","5521","5527","5531","5557","5563","5569","5573","5581","5591","5623","5639","5641","5647","5651","5653","5657","5659","5669","5683","5689","5693","5701","5711","5717","5737","5741","5743","5749","5779","5783","5791","5801","5807","5813","5821","5827","5839","5843","5849","5851","5857","5861","5867","5869","5879","5881","5897","5903","5923","5927","5939","5953","5981","5987","6007","6011","6029","6037","6043","6047","6053","6067","6073","6079","6089","6091","6101","6113","6121","6131","6133","6143","6151","6163","6173","6197","6199","6203","6211","6217","6221","6229","6247","6257","6263","6269","6271","6277","6287","6299","6301","6311","6317","6323","6329","6337","6343","6353","6359","6361","6367","6373","6379","6389","6397","6421","6427","6449","6451","6469","6473","6481","6491","6521","6529","6547","6551","6553","6563","6569","6571","6577","6581","6599","6607","6619","6637","6653","6659","6661","6673","6679","6689","6691","6701","6703","6709","6719","6733","6737","6761","6763","6779","6781","6791","6793","6803","6823","6827","6829","6833","6841","6857","6863","6869","6871","6883","6899","6907","6911","6917","6947","6949","6959","6961","6967","6971","6977","6983","6991","6997","7001","7013","7019","7027","7039","7043","7057","7069","7079","7103","7109","7121","7127","7129","7151","7159","7177","7187","7193","7207","7211","7213","7219","7229","7237","7243","7247","7253","7283","7297","7307","7309","7321","7331","7333","7349","7351","7369","7393","7411","7417","7433","7451","7457","7459","7477","7481","7487","7489","7499","7507","7517","7523","7529","7537","7541","7547","7549","7559","7561","7573","7577","7583","7589","7591","7603","7607","7621","7639","7643","7649","7669","7673","7681","7687","7691","7699","7703","7717","7723","7727","7741","7753","7757","7759","7789","7793","7817","7823","7829","7841","7853","7867","7873","7877","7879","7883","7901","7907","7919","7927","7933","7937","7949","7951","7963","7993","8009","8011","8017","8039","8053","8059","8069","8081","8087","8089","8093","8101","8111","8117","8123","8147","8161","8167","8171","8179","8191","8209","8219","8221","8231","8233","8237","8243","8263","8269","8273","8287","8291","8293","8297","8311","8317","8329","8353","8363","8369","8377","8387","8389","8419","8423","8429","8431","8443","8447","8461","8467","8501","8513","8521","8527","8537","8539","8543","8563","8573","8581","8597","8599","8609","8623","8627","8629","8641","8647","8663","8669","8677","8681","8689","8693","8699","8707","8713","8719","8731","8737","8741","8747","8753","8761","8779","8783","8803","8807","8819","8821","8831","8837","8839","8849","8861","8863","8867","8887","8893","8923","8929","8933","8941","8951","8963","8969","8971","8999","9001","9007","9011","9013","9029","9041","9043","9049","9059","9067","9091","9103","9109","9127","9133","9137","9151","9157","9161","9173","9181","9187","9199","9203","9209","9221","9227","9239","9241","9257","9277","9281","9283","9293","9311","9319","9323","9337","9341","9343","9349","9371","9377","9391","9397","9403","9413","9419","9421","9431","9433","9437","9439","9461","9463","9467","9473","9479","9491","9497","9511","9521","9533","9539","9547","9551","9587","9601","9613","9619","9623","9629","9631","9643","9649","9661","9677","9679","9689","9697","9719","9721","9733","9739","9743","9749","9767","9769","9781","9787","9791","9803","9811","9817","9829","9833","9839","9851","9857","9859","9871","9883","9887","9901","9907","9923","9929","9931","9941","9949","9967","9973","10007","10009","10037","10039","10061","10067","10069","10079","10091","10093","10099","10103","10111","10133","10139","10141","10151","10159","10163","10169","10177","10181","10193","10211","10223","10243","10247","10253","10259","10267","10271","10273","10289","10301","10303","10313","10321","10331","10333","10337","10343","10357","10369","10391","10399","10427","10429","10433","10453","10457","10459","10463","10477","10487","10499","10501","10513","10529","10531","10559","10567","10589","10597","10601","10607","10613","10627","10631","10639","10651","10657","10663","10667","10687","10691","10709","10711","10723","10729","10733","10739","10753","10771","10781","10789","10799","10831","10837","10847","10853","10859","10861","10867","10883","10889","10891","10903","10909","10937","10939","10949","10957","10973","10979","10987","10993","11003","11027","11047","11057","11059","11069","11071","11083","11087","11093","11113","11117","11119","11131","11149","11159","11161","11171","11173","11177","11197","11213","11239","11243","11251","11257","11261","11273","11279","11287","11299","11311","11317","11321","11329","11351","11353","11369","11383","11393","11399","11411","11423","11437","11443","11447","11467","11471","11483","11489","11491","11497","11503","11519","11527","11549","11551","11579","11587","11593","11597","11617","11621","11633","11657","11677","11681","11689","11699","11701","11717","11719","11731","11743","11777","11779","11783","11789","11801","11807","11813","11821","11827","11831","11833","11839","11863","11867","11887","11897","11903","11909","11923","11927","11933","11939","11941","11953","11959","11969","11971","11981","11987","12007","12011","12037","12041","12043","12049","12071","12073","12097","12101","12107","12109","12113","12119","12143","12149","12157","12161","12163","12197","12203","12211","12227","12239","12241","12251","12253","12263","12269","12277","12281","12289","12301","12323","12329","12343","12347","12373","12377","12379","12391","12401","12409","12413","12421","12433","12437","12451","12457","12473","12479","12487","12491","12497","12503","12511","12517","12527","12539","12541","12547","12553","12569","12577","12583","12589","12601","12611","12613","12619","12637","12641","12647","12653","12659","12671","12689","12697","12703","12713","12721","12739","12743","12757","12763","12781","12791","12799","12809","12821","12823","12829","12841","12853","12889","12893","12899","12907","12911","12917","12919","12923","12941","12953","12959","12967","12973","12979","12983","13001","13003","13007","13009","13033","13037","13043","13049","13063","13093","13099","13103","13109","13121","13127","13147","13151","13159","13163","13171","13177","13183","13187","13217","13219","13229","13241","13249","13259","13267","13291","13297","13309","13313","13327","13331","13337","13339","13367","13381","13397","13399","13411","13417","13421","13441","13451","13457","13463","13469","13477","13487","13499","13513","13523","13537","13553","13567","13577","13591","13597","13613","13619","13627","13633","13649","13669","13679","13681","13687","13691","13693","13697","13709","13711","13721","13723","13729","13751","13757","13759","13763","13781","13789","13799","13807","13829","13831","13841","13859","13873","13877","13879","13883","13901","13903","13907","13913","13921","13931","13933","13963","13967","13997","13999","14009","14011","14029","14033","14051","14057","14071","14081","14083","14087","14107","14143","14149","14153","14159","14173","14177","14197","14207","14221","14243","14249","14251","14281","14293","14303","14321","14323","14327","14341","14347","14369","14387","14389","14401","14407","14411","14419","14423","14431","14437","14447","14449","14461","14479","14489","14503","14519","14533","14537","14543","14549","14551","14557","14561","14563","14591","14593","14621","14627","14629","14633","14639","14653","14657","14669","14683","14699","14713","14717","14723","14731","14737","14741","14747","14753","14759","14767","14771","14779","14783","14797","14813","14821","14827","14831","14843","14851","14867","14869","14879","14887","14891","14897","14923","14929","14939","14947","14951","14957","14969","14983","15013","15017","15031","15053","15061","15073","15077","15083","15091","15101","15107","15121","15131","15137","15139","15149","15161","15173","15187","15193","15199","15217","15227","15233","15241","15259","15263","15269","15271","15277","15287","15289","15299","15307","15313","15319","15329","15331","15349","15359","15361","15373","15377","15383","15391","15401","15413","15427","15439","15443","15451","15461","15467","15473","15493","15497","15511","15527","15541","15551","15559","15569","15581","15583","15601","15607","15619","15629","15641","15643","15647","15649","15661","15667","15671","15679","15683","15727","15731","15733","15737","15739","15749","15761","15767","15773","15787","15791","15797","15803","15809","15817","15823","15859","15877","15881","15887","15889","15901","15907","15913","15919","15923","15937","15959","15971","15973","15991","16001","16007","16033","16057","16061","16063","16067","16069","16073","16087","16091","16097","16103","16111","16127","16139","16141","16183","16187","16189","16193","16217","16223","16229","16231","16249","16253","16267","16273","16301","16319","16333","16339","16349","16361","16363","16369","16381","16411","16417","16421","16427","16433","16447","16451","16453","16477","16481","16487","16493","16519","16529","16547","16553","16561","16567","16573","16603","16607","16619","16631","16633","16649","16651","16657","16661","16673","16691","16693","16699","16703","16729","16741","16747","16759","16763","16787","16811","16823","16829","16831","16843","16871","16879","16883","16889","16901","16903","16921","16927","16931","16937","16943","16963","16979","16981","16987","16993","17011","17021","17027","17029","17033","17041","17047","17053","17077","17093","17099","17107","17117","17123","17137","17159","17167","17183","17189","17191","17203","17207","17209","17231","17239","17257","17291","17293","17299","17317","17321","17327","17333","17341","17351","17359","17377","17383","17387","17389","17393","17401","17417","17419","17431","17443","17449","17467","17471","17477","17483","17489","17491","17497","17509","17519","17539","17551","17569","17573","17579","17581","17597","17599","17609","17623","17627","17657","17659","17669","17681","17683","17707","17713","17729","17737","17747","17749","17761","17783","17789","17791","17807","17827","17837","17839","17851","17863","17881","17891","17903","17909","17911","17921","17923","17929","17939","17957","17959","17971","17977","17981","17987","17989","18013","18041","18043","18047","18049","18059","18061","18077","18089","18097","18119","18121","18127","18131","18133","18143","18149","18169","18181","18191","18199","18211","18217","18223","18229","18233","18251","18253","18257","18269","18287","18289","18301","18307","18311","18313","18329","18341","18353","18367","18371","18379","18397","18401","18413","18427","18433","18439","18443","18451","18457","18461","18481","18493","18503","18517","18521","18523","18539","18541","18553","18583","18587","18593","18617","18637","18661","18671","18679","18691","18701","18713","18719","18731","18743","18749","18757","18773","18787","18793","18797","18803","18839","18859","18869","18899","18911","18913","18917","18919","18947","18959","18973","18979","19001","19009","19013","19031","19037","19051","19069","19073","19079","19081","19087","19121","19139","19141","19157","19163","19181","19183","19207","19211","19213","19219","19231","19237","19249","19259","19267","19273","19289","19301","19309","19319","19333","19373","19379","19381","19387","19391","19403","19417","19421","19423","19427","19429","19433","19441","19447","19457","19463","19469","19471","19477","19483","19489","19501","19507","19531","19541","19543","19553","19559","19571","19577","19583","19597","19603","19609","19661","19681","19687","19697","19699","19709","19717","19727","19739","19751","19753","19759","19763","19777","19793","19801","19813","19819","19841","19843","19853","19861","19867","19889","19891","19913","19919","19927","19937","19949","19961","19963","19973","19979","19991","19993","19997","20011","20021","20023","20029","20047","20051","20063","20071","20089","20101","20107","20113","20117","20123","20129","20143","20147","20149","20161","20173","20177","20183","20201","20219","20231","20233","20249","20261","20269","20287","20297","20323","20327","20333","20341","20347","20353","20357","20359","20369","20389","20393","20399","20407","20411","20431","20441","20443","20477","20479","20483","20507","20509","20521","20533","20543","20549","20551","20563","20593","20599","20611","20627","20639","20641","20663","20681","20693","20707","20717","20719","20731","20743","20747","20749","20753","20759","20771","20773","20789","20807","20809","20849","20857","20873","20879","20887","20897","20899","20903","20921","20929","20939","20947","20959","20963","20981","20983","21001","21011","21013","21017","21019","21023","21031","21059","21061","21067","21089","21101","21107","21121","21139","21143","21149","21157","21163","21169","21179","21187","21191","21193","21211","21221","21227","21247","21269","21277","21283","21313","21317","21319","21323","21341","21347","21377","21379","21383","21391","21397","21401","21407","21419","21433","21467","21481","21487","21491","21493","21499","21503","21517","21521","21523","21529","21557","21559","21563","21569","21577","21587","21589","21599","21601","21611","21613","21617","21647","21649","21661","21673","21683","21701","21713","21727","21737","21739","21751","21757","21767","21773","21787","21799","21803","21817","21821","21839","21841","21851","21859","21863","21871","21881","21893","21911","21929","21937","21943","21961","21977","21991","21997","22003","22013","22027","22031","22037","22039","22051","22063","22067","22073","22079","22091","22093","22109","22111","22123","22129","22133","22147","22153","22157","22159","22171","22189","22193","22229","22247","22259","22271","22273","22277","22279","22283","22291","22303","22307","22343","22349","22367","22369","22381","22391","22397","22409","22433","22441","22447","22453","22469","22481","22483","22501","22511","22531","22541","22543","22549","22567","22571","22573","22613","22619","22621","22637","22639","22643","22651","22669","22679","22691","22697","22699","22709","22717","22721","22727","22739","22741","22751","22769","22777","22783","22787","22807","22811","22817","22853","22859","22861","22871","22877","22901","22907","22921","22937","22943","22961","22963","22973","22993","23003","23011","23017","23021","23027","23029","23039","23041","23053","23057","23059","23063","23071","23081","23087","23099","23117","23131","23143","23159","23167","23173","23189","23197","23201","23203","23209","23227","23251","23269","23279","23291","23293","23297","23311","23321","23327","23333","23339","23357","23369","23371","23399","23417","23431","23447","23459","23473","23497","23509","23531","23537","23539","23549","23557","23561","23563","23567","23581","23593","23599","23603","23609","23623","23627","23629","23633","23663","23669","23671","23677","23687","23689","23719","23741","23743","23747","23753","23761","23767","23773","23789","23801","23813","23819","23827","23831","23833","23857","23869","23873","23879","23887","23893","23899","23909","23911","23917","23929","23957","23971","23977","23981","23993","24001","24007","24019","24023","24029","24043","24049","24061","24071","24077","24083","24091","24097","24103","24107","24109","24113","24121","24133","24137","24151","24169","24179","24181","24197","24203","24223","24229","24239","24247","24251","24281","24317","24329","24337","24359","24371","24373","24379","24391","24407","24413","24419","24421","24439","24443","24469","24473","24481","24499","24509","24517","24527","24533","24547","24551","24571","24593","24611","24623","24631","24659","24671","24677","24683","24691","24697","24709","24733","24749","24763","24767","24781","24793","24799","24809","24821","24841","24847","24851","24859","24877","24889","24907","24917","24919","24923","24943","24953","24967","24971","24977","24979","24989","25013","25031","25033","25037","25057","25073","25087","25097","25111","25117","25121","25127","25147","25153","25163","25169","25171","25183","25189","25219","25229","25237","25243","25247","25253","25261","25301","25303","25307","25309","25321","25339","25343","25349","25357","25367","25373","25391","25409","25411","25423","25439","25447","25453","25457","25463","25469","25471","25523","25537","25541","25561","25577","25579","25583","25589","25601","25603","25609","25621","25633","25639","25643","25657","25667","25673","25679","25693","25703","25717","25733","25741","25747","25759","25763","25771","25793","25799","25801","25819","25841","25847","25849","25867","25873","25889","25903","25913","25919","25931","25933","25939","25943","25951","25969","25981","25997","25999","26003","26017","26021","26029","26041","26053","26083","26099","26107","26111","26113","26119","26141","26153","26161","26171","26177","26183","26189","26203","26209","26227","26237","26249","26251","26261","26263","26267","26293","26297","26309","26317","26321","26339","26347","26357","26371","26387","26393","26399","26407","26417","26423","26431","26437","26449","26459","26479","26489","26497","26501","26513","26539","26557","26561","26573","26591","26597","26627","26633","26641","26647","26669","26681","26683","26687","26693","26699","26701","26711","26713","26717","26723","26729","26731","26737","26759","26777","26783","26801","26813","26821","26833","26839","26849","26861","26863","26879","26881","26891","26893","26903","26921","26927","26947","26951","26953","26959","26981","26987","26993","27011","27017","27031","27043","27059","27061","27067","27073","27077","27091","27103","27107","27109","27127","27143","27179","27191","27197","27211","27239","27241","27253","27259","27271","27277","27281","27283","27299","27329","27337","27361","27367","27397","27407","27409","27427","27431","27437","27449","27457","27479","27481","27487","27509","27527","27529","27539","27541","27551","27581","27583","27611","27617","27631","27647","27653","27673","27689","27691","27697","27701","27733","27737","27739","27743","27749","27751","27763","27767","27773","27779","27791","27793","27799","27803","27809","27817","27823","27827","27847","27851","27883","27893","27901","27917","27919","27941","27943","27947","27953","27961","27967","27983","27997","28001","28019","28027","28031","28051","28057","28069","28081","28087","28097","28099","28109","28111","28123","28151","28163","28181","28183","28201","28211","28219","28229","28277","28279","28283","28289","28297","28307","28309","28319","28349","28351","28387","28393","28403","28409","28411","28429","28433","28439","28447","28463","28477","28493","28499","28513","28517","28537","28541","28547","28549","28559","28571","28573","28579","28591","28597","28603","28607","28619","28621","28627","28631","28643","28649","28657","28661","28663","28669","28687","28697","28703","28711","28723","28729","28751","28753","28759","28771","28789","28793","28807","28813","28817","28837","28843","28859","28867","28871","28879","28901","28909","28921","28927","28933","28949","28961","28979","29009","29017","29021","29023","29027","29033","29059","29063","29077","29101","29123","29129","29131","29137","29147","29153","29167","29173","29179","29191","29201","29207","29209","29221","29231","29243","29251","29269","29287","29297","29303","29311","29327","29333","29339","29347","29363","29383","29387","29389","29399","29401","29411","29423","29429","29437","29443","29453","29473","29483","29501","29527","29531","29537","29567","29569","29573","29581","29587","29599","29611","29629","29633","29641","29663","29669","29671","29683","29717","29723","29741","29753","29759","29761","29789","29803","29819","29833","29837","29851","29863","29867","29873","29879","29881","29917","29921","29927","29947","29959","29983","29989","30011","30013","30029","30047","30059","30071","30089","30091","30097","30103","30109","30113","30119","30133","30137","30139","30161","30169","30181","30187","30197","30203","30211","30223","30241","30253","30259","30269","30271","30293","30307","30313","30319","30323","30341","30347","30367","30389","30391","30403","30427","30431","30449","30467","30469","30491","30493","30497","30509","30517","30529","30539","30553","30557","30559","30577","30593","30631","30637","30643","30649","30661","30671","30677","30689","30697","30703","30707","30713","30727","30757","30763","30773","30781","30803","30809","30817","30829","30839","30841","30851","30853","30859","30869","30871","30881","30893","30911","30931","30937","30941","30949","30971","30977","30983","31013","31019","31033","31039","31051","31063","31069","31079","31081","31091","31121","31123","31139","31147","31151","31153","31159","31177","31181","31183","31189","31193","31219","31223","31231","31237","31247","31249","31253","31259","31267","31271","31277","31307","31319","31321","31327","31333","31337","31357","31379","31387","31391","31393","31397","31469","31477","31481","31489","31511","31513","31517","31531","31541","31543","31547","31567","31573","31583","31601","31607","31627","31643","31649","31657","31663","31667","31687","31699","31721","31723","31727","31729","31741","31751","31769","31771","31793","31799","31817","31847","31849","31859","31873","31883","31891","31907","31957","31963","31973","31981","31991","32003","32009","32027","32029","32051","32057","32059","32063","32069","32077","32083","32089","32099","32117","32119","32141","32143","32159","32173","32183","32189","32191","32203","32213","32233","32237","32251","32257","32261","32297","32299","32303","32309","32321","32323","32327","32341","32353","32359","32363","32369","32371","32377","32381","32401","32411","32413","32423","32429","32441","32443","32467","32479","32491","32497","32503","32507","32531","32533","32537","32561","32563","32569","32573","32579","32587","32603","32609","32611","32621","32633","32647","32653","32687","32693","32707","32713","32717","32719","32749","32771","32779","32783","32789","32797","32801","32803","32831","32833","32839","32843","32869","32887","32909","32911","32917","32933","32939","32941","32957","32969","32971","32983","32987","32993","32999","33013","33023","33029","33037","33049","33053","33071","33073","33083","33091","33107","33113","33119","33149","33151","33161","33179","33181","33191","33199","33203","33211","33223","33247","33287","33289","33301","33311","33317","33329","33331","33343","33347","33349","33353","33359","33377","33391","33403","33409","33413","33427","33457","33461","33469","33479","33487","33493","33503","33521","33529","33533","33547","33563","33569","33577","33581","33587","33589","33599","33601","33613","33617","33619","33623","33629","33637","33641","33647","33679","33703","33713","33721","33739","33749","33751","33757","33767","33769","33773","33791","33797","33809","33811","33827","33829","33851","33857","33863","33871","33889","33893","33911","33923","33931","33937","33941","33961","33967","33997","34019","34031","34033","34039","34057","34061","34123","34127","34129","34141","34147","34157","34159","34171","34183","34211","34213","34217","34231","34253","34259","34261","34267","34273","34283","34297","34301","34303","34313","34319","34327","34337","34351","34361","34367","34369","34381","34403","34421","34429","34439","34457","34469","34471","34483","34487","34499","34501","34511","34513","34519","34537","34543","34549","34583","34589","34591","34603","34607","34613","34631","34649","34651","34667","34673","34679","34687","34693","34703","34721","34729","34739","34747","34757","34759","34763","34781","34807","34819","34841","34843","34847","34849","34871","34877","34883","34897","34913","34919","34939","34949","34961","34963","34981","35023","35027","35051","35053","35059","35069","35081","35083","35089","35099","35107","35111","35117","35129","35141","35149","35153","35159","35171","35201","35221","35227","35251","35257","35267","35279","35281","35291","35311","35317","35323","35327","35339","35353","35363","35381","35393","35401","35407","35419","35423","35437","35447","35449","35461","35491","35507","35509","35521","35527","35531","35533","35537","35543","35569","35573","35591","35593","35597","35603","35617","35671","35677","35729","35731","35747","35753","35759","35771","35797","35801","35803","35809","35831","35837","35839","35851","35863","35869","35879","35897","35899","35911","35923","35933","35951","35963","35969","35977","35983","35993","35999","36007","36011","36013","36017","36037","36061","36067","36073","36083","36097","36107","36109","36131","36137","36151","36161","36187","36191","36209","36217","36229","36241","36251","36263","36269","36277","36293","36299","36307","36313","36319","36341","36343","36353","36373","36383","36389","36433","36451","36457","36467","36469","36473","36479","36493","36497","36523","36527","36529","36541","36551","36559","36563","36571","36583","36587","36599","36607","36629","36637","36643","36653","36671","36677","36683","36691","36697","36709","36713","36721","36739","36749","36761","36767","36779","36781","36787","36791","36793","36809","36821","36833","36847","36857","36871","36877","36887","36899","36901","36913","36919","36923","36929","36931","36943","36947","36973","36979","36997","37003","37013","37019","37021","37039","37049","37057","37061","37087","37097","37117","37123","37139","37159","37171","37181","37189","37199","37201","37217","37223","37243","37253","37273","37277","37307","37309","37313","37321","37337","37339","37357","37361","37363","37369","37379","37397","37409","37423","37441","37447","37463","37483","37489","37493","37501","37507","37511","37517","37529","37537","37547","37549","37561","37567","37571","37573","37579","37589","37591","37607","37619","37633","37643","37649","37657","37663","37691","37693","37699","37717","37747","37781","37783","37799","37811","37813","37831","37847","37853","37861","37871","37879","37889","37897","37907","37951","37957","37963","37967","37987","37991","37993","37997","38011","38039","38047","38053","38069","38083","38113","38119","38149","38153","38167","38177","38183","38189","38197","38201","38219","38231","38237","38239","38261","38273","38281","38287","38299","38303","38317","38321","38327","38329","38333","38351","38371","38377","38393","38431","38447","38449","38453","38459","38461","38501","38543","38557","38561","38567","38569","38593","38603","38609","38611","38629","38639","38651","38653","38669","38671","38677","38693","38699","38707","38711","38713","38723","38729","38737","38747","38749","38767","38783","38791","38803","38821","38833","38839","38851","38861","38867","38873","38891","38903","38917","38921","38923","38933","38953","38959","38971","38977","38993","39019","39023","39041","39043","39047","39079","39089","39097","39103","39107","39113","39119","39133","39139","39157","39161","39163","39181","39191","39199","39209","39217","39227","39229","39233","39239","39241","39251","39293","39301","39313","39317","39323","39341","39343","39359","39367","39371","39373","39383","39397","39409","39419","39439","39443","39451","39461","39499","39503","39509","39511","39521","39541","39551","39563","39569","39581","39607","39619","39623","39631","39659","39667","39671","39679","39703","39709","39719","39727","39733","39749","39761","39769","39779","39791","39799","39821","39827","39829","39839","39841","39847","39857","39863","39869","39877","39883","39887","39901","39929","39937","39953","39971","39979","39983","39989","40009","40013","40031","40037","40039","40063","40087","40093","40099","40111","40123","40127","40129","40151","40153","40163","40169","40177","40189","40193","40213","40231","40237","40241","40253","40277","40283","40289","40343","40351","40357","40361","40387","40423","40427","40429","40433","40459","40471","40483","40487","40493","40499","40507","40519","40529","40531","40543","40559","40577","40583","40591","40597","40609","40627","40637","40639","40693","40697","40699","40709","40739","40751","40759","40763","40771","40787","40801","40813","40819","40823","40829","40841","40847","40849","40853","40867","40879","40883","40897","40903","40927","40933","40939","40949","40961","40973","40993","41011","41017","41023","41039","41047","41051","41057","41077","41081","41113","41117","41131","41141","41143","41149","41161","41177","41179","41183","41189","41201","41203","41213","41221","41227","41231","41233","41243","41257","41263","41269","41281","41299","41333","41341","41351","41357","41381","41387","41389","41399","41411","41413","41443","41453","41467","41479","41491","41507","41513","41519","41521","41539","41543","41549","41579","41593","41597","41603","41609","41611","41617","41621","41627","41641","41647","41651","41659","41669","41681","41687","41719","41729","41737","41759","41761","41771","41777","41801","41809","41813","41843","41849","41851","41863","41879","41887","41893","41897","41903","41911","41927","41941","41947","41953","41957","41959","41969","41981","41983","41999","42013","42017","42019","42023","42043","42061","42071","42073","42083","42089","42101","42131","42139","42157","42169","42179","42181","42187","42193","42197","42209","42221","42223","42227","42239","42257","42281","42283","42293","42299","42307","42323","42331","42337","42349","42359","42373","42379","42391","42397","42403","42407","42409","42433","42437","42443","42451","42457","42461","42463","42467","42473","42487","42491","42499","42509","42533","42557","42569","42571","42577","42589","42611","42641","42643","42649","42667","42677","42683","42689","42697","42701","42703","42709","42719","42727","42737","42743","42751","42767","42773","42787","42793","42797","42821","42829","42839","42841","42853","42859","42863","42899","42901","42923","42929","42937","42943","42953","42961","42967","42979","42989","43003","43013","43019","43037","43049","43051","43063","43067","43093","43103","43117","43133","43151","43159","43177","43189","43201","43207","43223","43237","43261","43271","43283","43291","43313","43319","43321","43331","43391","43397","43399","43403","43411","43427","43441","43451","43457","43481","43487","43499","43517","43541","43543","43573","43577","43579","43591","43597","43607","43609","43613","43627","43633","43649","43651","43661","43669","43691","43711","43717","43721","43753","43759","43777","43781","43783","43787","43789","43793","43801","43853","43867","43889","43891","43913","43933","43943","43951","43961","43963","43969","43973","43987","43991","43997","44017","44021","44027","44029","44041","44053","44059","44071","44087","44089","44101","44111","44119","44123","44129","44131","44159","44171","44179","44189","44201","44203","44207","44221","44249","44257","44263","44267","44269","44273","44279","44281","44293","44351","44357","44371","44381","44383","44389","44417","44449","44453","44483","44491","44497","44501","44507","44519","44531","44533","44537","44543","44549","44563","44579","44587","44617","44621","44623","44633","44641","44647","44651","44657","44683","44687","44699","44701","44711","44729","44741","44753","44771","44773","44777","44789","44797","44809","44819","44839","44843","44851","44867","44879","44887","44893","44909","44917","44927","44939","44953","44959","44963","44971","44983","44987","45007","45013","45053","45061","45077","45083","45119","45121","45127","45131","45137","45139","45161","45179","45181","45191","45197","45233","45247","45259","45263","45281","45289","45293","45307","45317","45319","45329","45337","45341","45343","45361","45377","45389","45403","45413","45427","45433","45439","45481","45491","45497","45503","45523","45533","45541","45553","45557","45569","45587","45589","45599","45613","45631","45641","45659","45667","45673","45677","45691","45697","45707","45737","45751","45757","45763","45767","45779","45817","45821","45823","45827","45833","45841","45853","45863","45869","45887","45893","45943","45949","45953","45959","45971","45979","45989","46021","46027","46049","46051","46061","46073","46091","46093","46099","46103","46133","46141","46147","46153","46171","46181","46183","46187","46199","46219","46229","46237","46261","46271","46273","46279","46301","46307","46309","46327","46337","46349","46351","46381","46399","46411","46439","46441","46447","46451","46457","46471","46477","46489","46499","46507","46511","46523","46549","46559","46567","46573","46589","46591","46601","46619","46633","46639","46643","46649","46663","46679","46681","46687","46691","46703","46723","46727","46747","46751","46757","46769","46771","46807","46811","46817","46819","46829","46831","46853","46861","46867","46877","46889","46901","46919","46933","46957","46993","46997","47017","47041","47051","47057","47059","47087","47093","47111","47119","47123","47129","47137","47143","47147","47149","47161","47189","47207","47221","47237","47251","47269","47279","47287","47293","47297","47303","47309","47317","47339","47351","47353","47363","47381","47387","47389","47407","47417","47419","47431","47441","47459","47491","47497","47501","47507","47513","47521","47527","47533","47543","47563","47569","47581","47591","47599","47609","47623","47629","47639","47653","47657","47659","47681","47699","47701","47711","47713","47717","47737","47741","47743","47777","47779","47791","47797","47807","47809","47819","47837","47843","47857","47869","47881","47903","47911","47917","47933","47939","47947","47951","47963","47969","47977","47981","48017","48023","48029","48049","48073","48079","48091","48109","48119","48121","48131","48157","48163","48179","48187","48193","48197","48221","48239","48247","48259","48271","48281","48299","48311","48313","48337","48341","48353","48371","48383","48397","48407","48409","48413","48437","48449","48463","48473","48479","48481","48487","48491","48497","48523","48527","48533","48539","48541","48563","48571","48589","48593","48611","48619","48623","48647","48649","48661","48673","48677","48679","48731","48733","48751","48757","48761","48767","48779","48781","48787","48799","48809","48817","48821","48823","48847","48857","48859","48869","48871","48883","48889","48907","48947","48953","48973","48989","48991","49003","49009","49019","49031","49033","49037","49043","49057","49069","49081","49103","49109","49117","49121","49123","49139","49157","49169","49171","49177","49193","49199","49201","49207","49211","49223","49253","49261","49277","49279","49297","49307","49331","49333","49339","49363","49367","49369","49391","49393","49409","49411","49417","49429","49433","49451","49459","49463","49477","49481","49499","49523","49529","49531","49537","49547","49549","49559","49597","49603","49613","49627","49633","49639","49663","49667","49669","49681","49697","49711","49727","49739","49741","49747","49757","49783","49787","49789","49801","49807","49811","49823","49831","49843","49853","49871","49877","49891","49919","49921","49927","49937","49939","49943","49957","49991","49993","49999","50021","50023","50033","50047","50051","50053","50069","50077","50087","50093","50101","50111","50119","50123","50129","50131","50147","50153","50159","50177","50207","50221","50227","50231","50261","50263","50273","50287","50291","50311","50321","50329","50333","50341","50359","50363","50377","50383","50387","50411","50417","50423","50441","50459","50461","50497","50503","50513","50527","50539","50543","50549","50551","50581","50587","50591","50593","50599","50627","50647","50651","50671","50683","50707","50723","50741","50753","50767","50773","50777","50789","50821","50833","50839","50849","50857","50867","50873","50891","50893","50909","50923","50929","50951","50957","50969","50971","50989","50993","51001","51031","51043","51047","51059","51061","51071","51109","51131","51133","51137","51151","51157","51169","51193","51197","51199","51203","51217","51229","51239","51241","51257","51263","51283","51287","51307","51329","51341","51343","51347","51349","51361","51383","51407","51413","51419","51421","51427","51431","51437","51439","51449","51461","51473","51479","51481","51487","51503","51511","51517","51521","51539","51551","51563","51577","51581","51593","51599","51607","51613","51631","51637","51647","51659","51673","51679","51683","51691","51713","51719","51721","51749","51767","51769","51787","51797","51803","51817","51827","51829","51839","51853","51859","51869","51871","51893","51899","51907","51913","51929","51941","51949","51971","51973","51977","51991","52009","52021","52027","52051","52057","52067","52069","52081","52103","52121","52127","52147","52153","52163","52177","52181","52183","52189","52201","52223","52237","52249","52253","52259","52267","52289","52291","52301","52313","52321","52361","52363","52369","52379","52387","52391","52433","52453","52457","52489","52501","52511","52517","52529","52541","52543","52553","52561","52567","52571","52579","52583","52609","52627","52631","52639","52667","52673","52691","52697","52709","52711","52721","52727","52733","52747","52757","52769","52783","52807","52813","52817","52837","52859","52861","52879","52883","52889","52901","52903","52919","52937","52951","52957","52963","52967","52973","52981","52999","53003","53017","53047","53051","53069","53077","53087","53089","53093","53101","53113","53117","53129","53147","53149","53161","53171","53173","53189","53197","53201","53231","53233","53239","53267","53269","53279","53281","53299","53309","53323","53327","53353","53359","53377","53381","53401","53407","53411","53419","53437","53441","53453","53479","53503","53507","53527","53549","53551","53569","53591","53593","53597","53609","53611","53617","53623","53629","53633","53639","53653","53657","53681","53693","53699","53717","53719","53731","53759","53773","53777","53783","53791","53813","53819","53831","53849","53857","53861","53881","53887","53891","53897","53899","53917","53923","53927","53939","53951","53959","53987","53993","54001","54011","54013","54037","54049","54059","54083","54091","54101","54121","54133","54139","54151","54163","54167","54181","54193","54217","54251","54269","54277","54287","54293","54311","54319","54323","54331","54347","54361","54367","54371","54377","54401","54403","54409","54413","54419","54421","54437","54443","54449","54469","54493","54497","54499","54503","54517","54521","54539","54541","54547","54559","54563","54577","54581","54583","54601","54617","54623","54629","54631","54647","54667","54673","54679","54709","54713","54721","54727","54751","54767","54773","54779","54787","54799","54829","54833","54851","54869","54877","54881","54907","54917","54919","54941","54949","54959","54973","54979","54983","55001","55009","55021","55049","55051","55057","55061","55073","55079","55103","55109","55117","55127","55147","55163","55171","55201","55207","55213","55217","55219","55229","55243","55249","55259","55291","55313","55331","55333","55337","55339","55343","55351","55373","55381","55399","55411","55439","55441","55457","55469","55487","55501","55511","55529","55541","55547","55579","55589","55603","55609","55619","55621","55631","55633","55639","55661","55663","55667","55673","55681","55691","55697","55711","55717","55721","55733","55763","55787","55793","55799","55807","55813","55817","55819","55823","55829","55837","55843","55849","55871","55889","55897","55901","55903","55921","55927","55931","55933","55949","55967","55987","55997","56003","56009","56039","56041","56053","56081","56087","56093","56099","56101","56113","56123","56131","56149","56167","56171","56179","56197","56207","56209","56237","56239","56249","56263","56267","56269","56299","56311","56333","56359","56369","56377","56383","56393","56401","56417","56431","56437","56443","56453","56467","56473","56477","56479","56489","56501","56503","56509","56519","56527","56531","56533","56543","56569","56591","56597","56599","56611","56629","56633","56659","56663","56671","56681","56687","56701","56711","56713","56731","56737","56747","56767","56773","56779","56783","56807","56809","56813","56821","56827","56843","56857","56873","56891","56893","56897","56909","56911","56921","56923","56929","56941","56951","56957","56963","56983","56989","56993","56999","57037","57041","57047","57059","57073","57077","57089","57097","57107","57119","57131","57139","57143","57149","57163","57173","57179","57191","57193","57203","57221","57223","57241","57251","57259","57269","57271","57283","57287","57301","57329","57331","57347","57349","57367","57373","57383","57389","57397","57413","57427","57457","57467","57487","57493","57503","57527","57529","57557","57559","57571","57587","57593","57601","57637","57641","57649","57653","57667","57679","57689","57697","57709","57713","57719","57727","57731","57737","57751","57773","57781","57787","57791","57793","57803","57809","57829","57839","57847","57853","57859","57881","57899","57901","57917","57923","57943","57947","57973","57977","57991","58013","58027","58031","58043","58049","58057","58061","58067","58073","58099","58109","58111","58129","58147","58151","58153","58169","58171","58189","58193","58199","58207","58211","58217","58229","58231","58237","58243","58271","58309","58313","58321","58337","58363","58367","58369","58379","58391","58393","58403","58411","58417","58427","58439","58441","58451","58453","58477","58481","58511","58537","58543","58549","58567","58573","58579","58601","58603","58613","58631","58657","58661","58679","58687","58693","58699","58711","58727","58733","58741","58757","58763","58771","58787","58789","58831","58889","58897","58901","58907","58909","58913","58921","58937","58943","58963","58967","58979","58991","58997","59009","59011","59021","59023","59029","59051","59053","59063","59069","59077","59083","59093","59107","59113","59119","59123","59141","59149","59159","59167","59183","59197","59207","59209","59219","59221","59233","59239","59243","59263","59273","59281","59333","59341","59351","59357","59359","59369","59377","59387","59393","59399","59407","59417","59419","59441","59443","59447","59453","59467","59471","59473","59497","59509","59513","59539","59557","59561","59567","59581","59611","59617","59621","59627","59629","59651","59659","59663","59669","59671","59693","59699","59707","59723","59729","59743","59747","59753","59771","59779","59791","59797","59809","59833","59863","59879","59887","59921","59929","59951","59957","59971","59981","59999","60013","60017","60029","60037","60041","60077","60083","60089","60091","60101","60103","60107","60127","60133","60139","60149","60161","60167","60169","60209","60217","60223","60251","60257","60259","60271","60289","60293","60317","60331","60337","60343","60353","60373","60383","60397","60413","60427","60443","60449","60457","60493","60497","60509","60521","60527","60539","60589","60601","60607","60611","60617","60623","60631","60637","60647","60649","60659","60661","60679","60689","60703","60719","60727","60733","60737","60757","60761","60763","60773","60779","60793","60811","60821","60859","60869","60887","60889","60899","60901","60913","60917","60919","60923","60937","60943","60953","60961","61001","61007","61027","61031","61043","61051","61057","61091","61099","61121","61129","61141","61151","61153","61169","61211","61223","61231","61253","61261","61283","61291","61297","61331","61333","61339","61343","61357","61363","61379","61381","61403","61409","61417","61441","61463","61469","61471","61483","61487","61493","61507","61511","61519","61543","61547","61553","61559","61561","61583","61603","61609","61613","61627","61631","61637","61643","61651","61657","61667","61673","61681","61687","61703","61717","61723","61729","61751","61757","61781","61813","61819","61837","61843","61861","61871","61879","61909","61927","61933","61949","61961","61967","61979","61981","61987","61991","62003","62011","62017","62039","62047","62053","62057","62071","62081","62099","62119","62129","62131","62137","62141","62143","62171","62189","62191","62201","62207","62213","62219","62233","62273","62297","62299","62303","62311","62323","62327","62347","62351","62383","62401","62417","62423","62459","62467","62473","62477","62483","62497","62501","62507","62533","62539","62549","62563","62581","62591","62597","62603","62617","62627","62633","62639","62653","62659","62683","62687","62701","62723","62731","62743","62753","62761","62773","62791","62801","62819","62827","62851","62861","62869","62873","62897","62903","62921","62927","62929","62939","62969","62971","62981","62983","62987","62989","63029","63031","63059","63067","63073","63079","63097","63103","63113","63127","63131","63149","63179","63197","63199","63211","63241","63247","63277","63281","63299","63311","63313","63317","63331","63337","63347","63353","63361","63367","63377","63389","63391","63397","63409","63419","63421","63439","63443","63463","63467","63473","63487","63493","63499","63521","63527","63533","63541","63559","63577","63587","63589","63599","63601","63607","63611","63617","63629","63647","63649","63659","63667","63671","63689","63691","63697","63703","63709","63719","63727","63737","63743","63761","63773","63781","63793","63799","63803","63809","63823","63839","63841","63853","63857","63863","63901","63907","63913","63929","63949","63977","63997","64007","64013","64019","64033","64037","64063","64067","64081","64091","64109","64123","64151","64153","64157","64171","64187","64189","64217","64223","64231","64237","64271","64279","64283","64301","64303","64319","64327","64333","64373","64381","64399","64403","64433","64439","64451","64453","64483","64489","64499","64513","64553","64567","64577","64579","64591","64601","64609","64613","64621","64627","64633","64661","64663","64667","64679","64693","64709","64717","64747","64763","64781","64783","64793","64811","64817","64849","64853","64871","64877","64879","64891","64901","64919","64921","64927","64937","64951","64969","64997","65003","65011","65027","65029","65033","65053","65063","65071","65089","65099","65101","65111","65119","65123","65129","65141","65147","65167","65171","65173","65179","65183","65203","65213","65239","65257","65267","65269","65287","65293","65309","65323","65327","65353","65357","65371","65381","65393","65407","65413","65419","65423","65437","65447","65449","65479","65497","65519","65521","65537","65539","65543","65551","65557","65563","65579","65581","65587","65599","65609","65617","65629","65633","65647","65651","65657","65677","65687","65699","65701","65707","65713","65717","65719","65729","65731","65761","65777","65789","65809","65827","65831","65837","65839","65843","65851","65867","65881","65899","65921","65927","65929","65951","65957","65963","65981","65983","65993","66029","66037","66041","66047","66067","66071","66083","66089","66103","66107","66109","66137","66161","66169","66173","66179","66191","66221","66239","66271","66293","66301","66337","66343","66347","66359","66361","66373","66377","66383","66403","66413","66431","66449","66457","66463","66467","66491","66499","66509","66523","66529","66533","66541","66553","66569","66571","66587","66593","66601","66617","66629","66643","66653","66683","66697","66701","66713","66721","66733","66739","66749","66751","66763","66791","66797","66809","66821","66841","66851","66853","66863","66877","66883","66889","66919","66923","66931","66943","66947","66949","66959","66973","66977","67003","67021","67033","67043","67049","67057","67061","67073","67079","67103","67121","67129","67139","67141","67153","67157","67169","67181","67187","67189","67211","67213","67217","67219","67231","67247","67261","67271","67273","67289","67307","67339","67343","67349","67369","67391","67399","67409","67411","67421","67427","67429","67433","67447","67453","67477","67481","67489","67493","67499","67511","67523","67531","67537","67547","67559","67567","67577","67579","67589","67601","67607","67619","67631","67651","67679","67699","67709","67723","67733","67741","67751","67757","67759","67763","67777","67783","67789","67801","67807","67819","67829","67843","67853","67867","67883","67891","67901","67927","67931","67933","67939","67943","67957","67961","67967","67979","67987","67993","68023","68041","68053","68059","68071","68087","68099","68111","68113","68141","68147","68161","68171","68207","68209","68213","68219","68227","68239","68261","68279","68281","68311","68329","68351","68371","68389","68399","68437","68443","68447","68449","68473","68477","68483","68489","68491","68501","68507","68521","68531","68539","68543","68567","68581","68597","68611","68633","68639","68659","68669","68683","68687","68699","68711","68713","68729","68737","68743","68749","68767","68771","68777","68791","68813","68819","68821","68863","68879","68881","68891","68897","68899","68903","68909","68917","68927","68947","68963","68993","69001","69011","69019","69029","69031","69061","69067","69073","69109","69119","69127","69143","69149","69151","69163","69191","69193","69197","69203","69221","69233","69239","69247","69257","69259","69263","69313","69317","69337","69341","69371","69379","69383","69389","69401","69403","69427","69431","69439","69457","69463","69467","69473","69481","69491","69493","69497","69499","69539","69557","69593","69623","69653","69661","69677","69691","69697","69709","69737","69739","69761","69763","69767","69779","69809","69821","69827","69829","69833","69847","69857","69859","69877","69899","69911","69929","69931","69941","69959","69991","69997","70001","70003","70009","70019","70039","70051","70061","70067","70079","70099","70111","70117","70121","70123","70139","70141","70157","70163","70177","70181","70183","70199","70201","70207","70223","70229","70237","70241","70249","70271","70289","70297","70309","70313","70321","70327","70351","70373","70379","70381","70393","70423","70429","70439","70451","70457","70459","70481","70487","70489","70501","70507","70529","70537","70549","70571","70573","70583","70589","70607","70619","70621","70627","70639","70657","70663","70667","70687","70709","70717","70729","70753","70769","70783","70793","70823","70841","70843","70849","70853","70867","70877","70879","70891","70901","70913","70919","70921","70937","70949","70951","70957","70969","70979","70981","70991","70997","70999","71011","71023","71039","71059","71069","71081","71089","71119","71129","71143","71147","71153","71161","71167","71171","71191","71209","71233","71237","71249","71257","71261","71263","71287","71293","71317","71327","71329","71333","71339","71341","71347","71353","71359","71363","71387","71389","71399","71411","71413","71419","71429","71437","71443","71453","71471","71473","71479","71483","71503","71527","71537","71549","71551","71563","71569","71593","71597","71633","71647","71663","71671","71693","71699","71707","71711","71713","71719","71741","71761","71777","71789","71807","71809","71821","71837","71843","71849","71861","71867","71879","71881","71887","71899","71909","71917","71933","71941","71947","71963","71971","71983","71987","71993","71999","72019","72031","72043","72047","72053","72073","72077","72089","72091","72101","72103","72109","72139","72161","72167","72169","72173","72211","72221","72223","72227","72229","72251","72253","72269","72271","72277","72287","72307","72313","72337","72341","72353","72367","72379","72383","72421","72431","72461","72467","72469","72481","72493","72497","72503","72533","72547","72551","72559","72577","72613","72617","72623","72643","72647","72649","72661","72671","72673","72679","72689","72701","72707","72719","72727","72733","72739","72763","72767","72797","72817","72823","72859","72869","72871","72883","72889","72893","72901","72907","72911","72923","72931","72937","72949","72953","72959","72973","72977","72997","73009","73013","73019","73037","73039","73043","73061","73063","73079","73091","73121","73127","73133","73141","73181","73189","73237","73243","73259","73277","73291","73303","73309","73327","73331","73351","73361","73363","73369","73379","73387","73417","73421","73433","73453","73459","73471","73477","73483","73517","73523","73529","73547","73553","73561","73571","73583","73589","73597","73607","73609","73613","73637","73643","73651","73673","73679","73681","73693","73699","73709","73721","73727","73751","73757","73771","73783","73819","73823","73847","73849","73859","73867","73877","73883","73897","73907","73939","73943","73951","73961","73973","73999","74017","74021","74027","74047","74051","74071","74077","74093","74099","74101","74131","74143","74149","74159","74161","74167","74177","74189","74197","74201","74203","74209","74219","74231","74257","74279","74287","74293","74297","74311","74317","74323","74353","74357","74363","74377","74381","74383","74411","74413","74419","74441","74449","74453","74471","74489","74507","74509","74521","74527","74531","74551","74561","74567","74573","74587","74597","74609","74611","74623","74653","74687","74699","74707","74713","74717","74719","74729","74731","74747","74759","74761","74771","74779","74797","74821","74827","74831","74843","74857","74861","74869","74873","74887","74891","74897","74903","74923","74929","74933","74941","74959","75011","75013","75017","75029","75037","75041","75079","75083","75109","75133","75149","75161","75167","75169","75181","75193","75209","75211","75217","75223","75227","75239","75253","75269","75277","75289","75307","75323","75329","75337","75347","75353","75367","75377","75389","75391","75401","75403","75407","75431","75437","75479","75503","75511","75521","75527","75533","75539","75541","75553","75557","75571","75577","75583","75611","75617","75619","75629","75641","75653","75659","75679","75683","75689","75703","75707","75709","75721","75731","75743","75767","75773","75781","75787","75793","75797","75821","75833","75853","75869","75883","75913","75931","75937","75941","75967","75979","75983","75989","75991","75997","76001","76003","76031","76039","76079","76081","76091","76099","76103","76123","76129","76147","76157","76159","76163","76207","76213","76231","76243","76249","76253","76259","76261","76283","76289","76303","76333","76343","76367","76369","76379","76387","76403","76421","76423","76441","76463","76471","76481","76487","76493","76507","76511","76519","76537","76541","76543","76561","76579","76597","76603","76607","76631","76649","76651","76667","76673","76679","76697","76717","76733","76753","76757","76771","76777","76781","76801","76819","76829","76831","76837","76847","76871","76873","76883","76907","76913","76919","76943","76949","76961","76963","76991","77003","77017","77023","77029","77041","77047","77069","77081","77093","77101","77137","77141","77153","77167","77171","77191","77201","77213","77237","77239","77243","77249","77261","77263","77267","77269","77279","77291","77317","77323","77339","77347","77351","77359","77369","77377","77383","77417","77419","77431","77447","77471","77477","77479","77489","77491","77509","77513","77521","77527","77543","77549","77551","77557","77563","77569","77573","77587","77591","77611","77617","77621","77641","77647","77659","77681","77687","77689","77699","77711","77713","77719","77723","77731","77743","77747","77761","77773","77783","77797","77801","77813","77839","77849","77863","77867","77893","77899","77929","77933","77951","77969","77977","77983","77999","78007","78017","78031","78041","78049","78059","78079","78101","78121","78137","78139","78157","78163","78167","78173","78179","78191","78193","78203","78229","78233","78241","78259","78277","78283","78301","78307","78311","78317","78341","78347","78367","78401","78427","78437","78439","78467","78479","78487","78497","78509","78511","78517","78539","78541","78553","78569","78571","78577","78583","78593","78607","78623","78643","78649","78653","78691","78697","78707","78713","78721","78737","78779","78781","78787","78791","78797","78803","78809","78823","78839","78853","78857","78877","78887","78889","78893","78901","78919","78929","78941","78977","78979","78989","79031","79039","79043","79063","79087","79103","79111","79133","79139","79147","79151","79153","79159","79181","79187","79193","79201","79229","79231","79241","79259","79273","79279","79283","79301","79309","79319","79333","79337","79349","79357","79367","79379","79393","79397","79399","79411","79423","79427","79433","79451","79481","79493","79531","79537","79549","79559","79561","79579","79589","79601","79609","79613","79621","79627","79631","79633","79657","79669","79687","79691","79693","79697","79699","79757","79769","79777","79801","79811","79813","79817","79823","79829","79841","79843","79847","79861","79867","79873","79889","79901","79903","79907","79939","79943","79967","79973","79979","79987","79997","79999","80021","80039","80051","80071","80077","80107","80111","80141","80147","80149","80153","80167","80173","80177","80191","80207","80209","80221","80231","80233","80239","80251","80263","80273","80279","80287","80309","80317","80329","80341","80347","80363","80369","80387","80407","80429","80447","80449","80471","80473","80489","80491","80513","80527","80537","80557","80567","80599","80603","80611","80621","80627","80629","80651","80657","80669","80671","80677","80681","80683","80687","80701","80713","80737","80747","80749","80761","80777","80779","80783","80789","80803","80809","80819","80831","80833","80849","80863","80897","80909","80911","80917","80923","80929","80933","80953","80963","80989","81001","81013","81017","81019","81023","81031","81041","81043","81047","81049","81071","81077","81083","81097","81101","81119","81131","81157","81163","81173","81181","81197","81199","81203","81223","81233","81239","81281","81283","81293","81299","81307","81331","81343","81349","81353","81359","81371","81373","81401","81409","81421","81439","81457","81463","81509","81517","81527","81533","81547","81551","81553","81559","81563","81569","81611","81619","81629","81637","81647","81649","81667","81671","81677","81689","81701","81703","81707","81727","81737","81749","81761","81769","81773","81799","81817","81839","81847","81853","81869","81883","81899","81901","81919","81929","81931","81937","81943","81953","81967","81971","81973","82003","82007","82009","82013","82021","82031","82037","82039","82051","82067","82073","82129","82139","82141","82153","82163","82171","82183","82189","82193","82207","82217","82219","82223","82231","82237","82241","82261","82267","82279","82301","82307","82339","82349","82351","82361","82373","82387","82393","82421","82457","82463","82469","82471","82483","82487","82493","82499","82507","82529","82531","82549","82559","82561","82567","82571","82591","82601","82609","82613","82619","82633","82651","82657","82699","82721","82723","82727","82729","82757","82759","82763","82781","82787","82793","82799","82811","82813","82837","82847","82883","82889","82891","82903","82913","82939","82963","82981","82997","83003","83009","83023","83047","83059","83063","83071","83077","83089","83093","83101","83117","83137","83177","83203","83207","83219","83221","83227","83231","83233","83243","83257","83267","83269","83273","83299","83311","83339","83341","83357","83383","83389","83399","83401","83407","83417","83423","83431","83437","83443","83449","83459","83471","83477","83497","83537","83557","83561","83563","83579","83591","83597","83609","83617","83621","83639","83641","83653","83663","83689","83701","83717","83719","83737","83761","83773","83777","83791","83813","83833","83843","83857","83869","83873","83891","83903","83911","83921","83933","83939","83969","83983","83987","84011","84017","84047","84053","84059","84061","84067","84089","84121","84127","84131","84137","84143","84163","84179","84181","84191","84199","84211","84221","84223","84229","84239","84247","84263","84299","84307","84313","84317","84319","84347","84349","84377","84389","84391","84401","84407","84421","84431","84437","84443","84449","84457","84463","84467","84481","84499","84503","84509","84521","84523","84533","84551","84559","84589","84629","84631","84649","84653","84659","84673","84691","84697","84701","84713","84719","84731","84737","84751","84761","84787","84793","84809","84811","84827","84857","84859","84869","84871","84913","84919","84947","84961","84967","84977","84979","84991","85009","85021","85027","85037","85049","85061","85081","85087","85091","85093","85103","85109","85121","85133","85147","85159","85193","85199","85201","85213","85223","85229","85237","85243","85247","85259","85297","85303","85313","85331","85333","85361","85363","85369","85381","85411","85427","85429","85439","85447","85451","85453","85469","85487","85513","85517","85523","85531","85549","85571","85577","85597","85601","85607","85619","85621","85627","85639","85643","85661","85667","85669","85691","85703","85711","85717","85733","85751","85781","85793","85817","85819","85829","85831","85837","85843","85847","85853","85889","85903","85909","85931","85933","85991","85999","86011","86017","86027","86029","86069","86077","86083","86111","86113","86117","86131","86137","86143","86161","86171","86179","86183","86197","86201","86209","86239","86243","86249","86257","86263","86269","86287","86291","86293","86297","86311","86323","86341","86351","86353","86357","86369","86371","86381","86389","86399","86413","86423","86441","86453","86461","86467","86477","86491","86501","86509","86531","86533","86539","86561","86573","86579","86587","86599","86627","86629","86677","86689","86693","86711","86719","86729","86743","86753","86767","86771","86783","86813","86837","86843","86851","86857","86861","86869","86923","86927","86929","86939","86951","86959","86969","86981","86993","87011","87013","87037","87041","87049","87071","87083","87103","87107","87119","87121","87133","87149","87151","87179","87181","87187","87211","87221","87223","87251","87253","87257","87277","87281","87293","87299","87313","87317","87323","87337","87359","87383","87403","87407","87421","87427","87433","87443","87473","87481","87491","87509","87511","87517","87523","87539","87541","87547","87553","87557","87559","87583","87587","87589","87613","87623","87629","87631","87641","87643","87649","87671","87679","87683","87691","87697","87701","87719","87721","87739","87743","87751","87767","87793","87797","87803","87811","87833","87853","87869","87877","87881","87887","87911","87917","87931","87943","87959","87961","87973","87977","87991","88001","88003","88007","88019","88037","88069","88079","88093","88117","88129","88169","88177","88211","88223","88237","88241","88259","88261","88289","88301","88321","88327","88337","88339","88379","88397","88411","88423","88427","88463","88469","88471","88493","88499","88513","88523","88547","88589","88591","88607","88609","88643","88651","88657","88661","88663","88667","88681","88721","88729","88741","88747","88771","88789","88793","88799","88801","88807","88811","88813","88817","88819","88843","88853","88861","88867","88873","88883","88897","88903","88919","88937","88951","88969","88993","88997","89003","89009","89017","89021","89041","89051","89057","89069","89071","89083","89087","89101","89107","89113","89119","89123","89137","89153","89189","89203","89209","89213","89227","89231","89237","89261","89269","89273","89293","89303","89317","89329","89363","89371","89381","89387","89393","89399","89413","89417","89431","89443","89449","89459","89477","89491","89501","89513","89519","89521","89527","89533","89561","89563","89567","89591","89597","89599","89603","89611","89627","89633","89653","89657","89659","89669","89671","89681","89689","89753","89759","89767","89779","89783","89797","89809","89819","89821","89833","89839","89849","89867","89891","89897","89899","89909","89917","89923","89939","89959","89963","89977","89983","89989","90001","90007","90011","90017","90019","90023","90031","90053","90059","90067","90071","90073","90089","90107","90121","90127","90149","90163","90173","90187","90191","90197","90199","90203","90217","90227","90239","90247","90263","90271","90281","90289","90313","90353","90359","90371","90373","90379","90397","90401","90403","90407","90437","90439","90469","90473","90481","90499","90511","90523","90527","90529","90533","90547","90583","90599","90617","90619","90631","90641","90647","90659","90677","90679","90697","90703","90709","90731","90749","90787","90793","90803","90821","90823","90833","90841","90847","90863","90887","90901","90907","90911","90917","90931","90947","90971","90977","90989","90997","91009","91019","91033","91079","91081","91097","91099","91121","91127","91129","91139","91141","91151","91153","91159","91163","91183","91193","91199","91229","91237","91243","91249","91253","91283","91291","91297","91303","91309","91331","91367","91369","91373","91381","91387","91393","91397","91411","91423","91433","91453","91457","91459","91463","91493","91499","91513","91529","91541","91571","91573","91577","91583","91591","91621","91631","91639","91673","91691","91703","91711","91733","91753","91757","91771","91781","91801","91807","91811","91813","91823","91837","91841","91867","91873","91909","91921","91939","91943","91951","91957","91961","91967","91969","91997","92003","92009","92033","92041","92051","92077","92083","92107","92111","92119","92143","92153","92173","92177","92179","92189","92203","92219","92221","92227","92233","92237","92243","92251","92269","92297","92311","92317","92333","92347","92353","92357","92363","92369","92377","92381","92383","92387","92399","92401","92413","92419","92431","92459","92461","92467","92479","92489","92503","92507","92551","92557","92567","92569","92581","92593","92623","92627","92639","92641","92647","92657","92669","92671","92681","92683","92693","92699","92707","92717","92723","92737","92753","92761","92767","92779","92789","92791","92801","92809","92821","92831","92849","92857","92861","92863","92867","92893","92899","92921","92927","92941","92951","92957","92959","92987","92993","93001","93047","93053","93059","93077","93083","93089","93097","93103","93113","93131","93133","93139","93151","93169","93179","93187","93199","93229","93239","93241","93251","93253","93257","93263","93281","93283","93287","93307","93319","93323","93329","93337","93371","93377","93383","93407","93419","93427","93463","93479","93481","93487","93491","93493","93497","93503","93523","93529","93553","93557","93559","93563","93581","93601","93607","93629","93637","93683","93701","93703","93719","93739","93761","93763","93787","93809","93811","93827","93851","93871","93887","93889","93893","93901","93911","93913","93923","93937","93941","93949","93967","93971","93979","93983","93997","94007","94009","94033","94049","94057","94063","94079","94099","94109","94111","94117","94121","94151","94153","94169","94201","94207","94219","94229","94253","94261","94273","94291","94307","94309","94321","94327","94331","94343","94349","94351","94379","94397","94399","94421","94427","94433","94439","94441","94447","94463","94477","94483","94513","94529","94531","94541","94543","94547","94559","94561","94573","94583","94597","94603","94613","94621","94649","94651","94687","94693","94709","94723","94727","94747","94771","94777","94781","94789","94793","94811","94819","94823","94837","94841","94847","94849","94873","94889","94903","94907","94933","94949","94951","94961","94993","94999","95003","95009","95021","95027","95063","95071","95083","95087","95089","95093","95101","95107","95111","95131","95143","95153","95177","95189","95191","95203","95213","95219","95231","95233","95239","95257","95261","95267","95273","95279","95287","95311","95317","95327","95339","95369","95383","95393","95401","95413","95419","95429","95441","95443","95461","95467","95471","95479","95483","95507","95527","95531","95539","95549","95561","95569","95581","95597","95603","95617","95621","95629","95633","95651","95701","95707","95713","95717","95723","95731","95737","95747","95773","95783","95789","95791","95801","95803","95813","95819","95857","95869","95873","95881","95891","95911","95917","95923","95929","95947","95957","95959","95971","95987","95989","96001","96013","96017","96043","96053","96059","96079","96097","96137","96149","96157","96167","96179","96181","96199","96211","96221","96223","96233","96259","96263","96269","96281","96289","96293","96323","96329","96331","96337","96353","96377","96401","96419","96431","96443","96451","96457","96461","96469","96479","96487","96493","96497","96517","96527","96553","96557","96581","96587","96589","96601","96643","96661","96667","96671","96697","96703","96731","96737","96739","96749","96757","96763","96769","96779","96787","96797","96799","96821","96823","96827","96847","96851","96857","96893","96907","96911","96931","96953","96959","96973","96979","96989","96997","97001","97003","97007","97021","97039","97073","97081","97103","97117","97127","97151","97157","97159","97169","97171","97177","97187","97213","97231","97241","97259","97283","97301","97303","97327","97367","97369","97373","97379","97381","97387","97397","97423","97429","97441","97453","97459","97463","97499","97501","97511","97523","97547","97549","97553","97561","97571","97577","97579","97583","97607","97609","97613","97649","97651","97673","97687","97711","97729","97771","97777","97787","97789","97813","97829","97841","97843","97847","97849","97859","97861","97871","97879","97883","97919","97927","97931","97943","97961","97967","97973","97987","98009","98011","98017","98041","98047","98057","98081","98101","98123","98129","98143","98179","98207","98213","98221","98227","98251","98257","98269","98297","98299","98317","98321","98323","98327","98347","98369","98377","98387","98389","98407","98411","98419","98429","98443","98453","98459","98467","98473","98479","98491","98507","98519","98533","98543","98561","98563","98573","98597","98621","98627","98639","98641","98663","98669","98689","98711","98713","98717","98729","98731","98737","98773","98779","98801","98807","98809","98837","98849","98867","98869","98873","98887","98893","98897","98899","98909","98911","98927","98929","98939","98947","98953","98963","98981","98993","98999","99013","99017","99023","99041","99053","99079","99083","99089","99103","99109","99119","99131","99133","99137","99139","99149","99173","99181","99191","99223","99233","99241","99251","99257","99259","99277","99289","99317","99347","99349","99367","99371","99377","99391","99397","99401","99409","99431","99439","99469","99487","99497","99523","99527","99529","99551","99559","99563","99571","99577","99581","99607","99611","99623","99643","99661","99667","99679","99689","99707","99709","99713","99719","99721","99733","99761","99767","99787","99793","99809","99817","99823","99829","99833","99839","99859","99871","99877","99881","99901","99907","99923","99929","99961","99971","99989","99991","100003","100019","100043","100049","100057","100069","100103","100109","100129","100151","100153","100169","100183","100189","100193","100207","100213","100237","100267","100271","100279","100291","100297","100313","100333","100343","100357","100361","100363","100379","100391","100393","100403","100411","100417","100447","100459","100469","100483","100493","100501","100511","100517","100519","100523","100537","100547","100549","100559","100591","100609","100613","100621","100649","100669","100673","100693","100699","100703","100733","100741","100747","100769","100787","100799","100801","100811","100823","100829","100847","100853","100907","100913","100927","100931","100937","100943","100957","100981","100987","100999","101009","101021","101027","101051","101063","101081","101089","101107","101111","101113","101117","101119","101141","101149","101159","101161","101173","101183","101197","101203","101207","101209","101221","101267","101273","101279","101281","101287","101293","101323","101333","101341","101347","101359","101363","101377","101383","101399","101411","101419","101429","101449","101467","101477","101483","101489","101501","101503","101513","101527","101531","101533","101537","101561","101573","101581","101599","101603","101611","101627","101641","101653","101663","101681","101693","101701","101719","101723","101737","101741","101747","101749","101771","101789","101797","101807","101833","101837","101839","101863","101869","101873","101879","101891","101917","101921","101929","101939","101957","101963","101977","101987","101999","102001","102013","102019","102023","102031","102043","102059","102061","102071","102077","102079","102101","102103","102107","102121","102139","102149","102161","102181","102191","102197","102199","102203","102217","102229","102233","102241","102251","102253","102259","102293","102299","102301","102317","102329","102337","102359","102367","102397","102407","102409","102433","102437","102451","102461","102481","102497","102499","102503","102523","102533","102539","102547","102551","102559","102563","102587","102593","102607","102611","102643","102647","102653","102667","","102673","102677","102679","102701","102761","102763","102769","102793","102797","102811","102829","102841","102859","102871","102877","102881","102911","102913","102929","102931","102953","102967","102983","103001","103007","103043","103049","103067","103069","103079","103087","103091","103093","103099","103123","103141","103171","103177","103183","103217","103231","103237","103289","103291","103307","103319","103333","103349","103357","103387","103391","103393","103399","103409","103421","103423","103451","103457","103471","103483","103511","103529","103549","103553","103561","103567","103573","103577","103583","103591","103613","103619","103643","103651","103657","103669","103681","103687","103699","103703","103723","103769","103787","103801","103811","103813","103837","103841","103843","103867","103889","103903","103913","103919","103951","103963","103967","103969","103979","103981","103991","103993","103997","104003","104009","104021","104033","104047","104053","104059","104087","104089","104107","104113","104119","104123","104147","104149","104161","104173","104179","104183","104207","104231","104233","104239","104243","104281","104287","104297","104309","104311","104323","104327","104347","104369","104381","104383","104393","104399","104417","104459","104471","104473","104479","104491","104513","104527","104537","104543","104549","104551","104561","104579","104593","104597","104623","104639","104651","104659","104677","104681","104683","104693","104701","104707","104711","104717","104723","104729"];

       // Error Checking
         if ((Argument.charAt(0) == "-") || ZeroTrim(Argument).search(/\./) != (-1) || Argument == "0" || Argument == "1")
           {
             Answer = "";
             alert(Warning);
           }
         else
           {
             // Check for easy divisions
                if (((parseInt(Argument.charAt(Argument.length-1))) % 2 == 0) && (Argument != "2")) // is divisible by 2
                  { Answer = "FALSE"; }
                if ((Argument.charAt(Argument.length-1) == "5") && (Argument != "5")) // is divisible by 5
                  { Answer = "FALSE"; }
                DigitSum = 0;
                for (Counter = 0; Counter < Argument.length; Counter++)
                  {
                    DigitSum = DigitSum + parseInt(Argument.charAt(Counter));
                  }
                if ((DigitSum % 3 == 0) && (Argument != "3")) // is divisible by 3
                  { Answer = "FALSE"; }
                if (Answer == "TRUE")
                   {
                     // Now we check a big array of primes
                        for(var PrimeCounter=0; PrimeCounter < (PrimeArray.length + 1); PrimeCounter++) // Is a divisor of the Argument in the array?
                          {
                            if (PrimeArray[PrimeCounter] == Argument) // if it's one of the primes in the list...
                              { return "TRUE"; }
                          }
                        for(var PrimeCounter=0; PrimeCounter < (PrimeArray.length + 1); PrimeCounter++) // Is a divisor of the Argument in the array?
                          {
                            if (DIV_MOD(PrimeArray[PrimeCounter],Argument,"MOD") == "0") // then a divisor has been found in the list
                              { return "FALSE"; }
                          }
                   }
             // If no easy shortcuts, then do it the hard way...
                if (Answer == "TRUE")
                   // then the number is not divisible by any prime from the list, meaning
                   // it must be greater than the square of the highest prime on the list. 
                   // (a number is either a prime or divisible by primes and we just 
                   // finished checking a crapload of primes...)
                  {
                    // RollingNumber is the square of the highest prime on the list.
                    RollingNumber = Multiply(PrimeArray[PrimeArray.length-1],PrimeArray[PrimeArray.length-1]);
                    while ((IsLessThan(Multiply(RollingNumber,RollingNumber),Argument) == "TRUE") && (Answer == "TRUE"))
                      {
                        RollingNumber = CalculatorAdd(RollingNumber,"2"); // only odd numbers
                        if ((DIV_MOD(RollingNumber,Argument,"MOD") == "0") && (IsEqualTo(RollingNumber,Argument) == "FALSE"))
                          {
                            Answer = "FALSE";
                            // alert(Argument + " is evenly divided by " + RollingNumber); // uncomment this if you want to know the first divisor of Argument.
                          }
                      }
                  }
           }
       // Return Answer
          return Answer;
     }

   function SqrtFloor(Argument) // Returns the FLOOR of the Square Root of Argument
     {
       // Declare variables
          var Estimate = "";
          var ContinueLoop = "TRUE";
          var Warning = "NOTE:"
                        + "\n"
                        + "The Square Root function is designed"
                        + "\n"
                        + "only for non-negative numbers."
                        + "\n\n"
                        + "Negative arguments are not valid.";
       // If it's a non-negative number...
          if (Argument.charAt(0) == "-")
            {
              alert(Warning);
            }
          else
            {
              Estimate = "2";
              while (ContinueLoop == "TRUE")
                {
                  Estimate = DIV_MOD("2",(CalculatorAdd(Estimate,DIV_MOD(Estimate,Argument,"DIV"))),"DIV");
                  if (IsEqualTo(Argument,Multiply(Estimate,Estimate)) == "TRUE")
                    { ContinueLoop = "FALSE"; }
                  if ((IsLessThan(Multiply(Estimate,Estimate),Argument) == "TRUE") && (IsGreaterThan(Multiply(CalculatorAdd(Estimate,"1"),CalculatorAdd(Estimate,"1")),Argument) == "TRUE"))
                    { ContinueLoop = "FALSE"; }
                }
            }

       // Return Answer
          return Estimate;
     }

   function PerfectSquare(Argument) // Returns TRUE if the argument is a perfect square, otherwise FALSE
     {
       // Declare variables
          var Answer = "";
          var Warning = "NOTE:"
                        + "\n"
                        + "The IsPerfectSquare function is designed"
                        + "\n"
                        + "only for non-negative numbers."
                        + "\n\n"
                        + "Negative arguments are not valid.";
       // If it's a non-negative number...
          if (Argument.charAt(0) == "-")
            {
              alert(Warning);
            }
          else
            {
              Answer = IsEqualTo(Multiply(SqrtFloor(Argument),SqrtFloor(Argument)),Argument);
            }

       // Return Answer
          return Answer;
     }

   
/* EOF */