//var agt = navigator.userAgent.toLowerCase();
var dm = '@=#=@';
var is_gecko = (navigator.userAgent.toLowerCase().indexOf('gecko') != -1);
var ie_ver;
if(!is_gecko) { ie_ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion()); }

//var is_gecko = (navigator.userAgent.toLowerCase().indexOf('gecko') != -1);
//var is_ie5up = (!is_gecko && Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion()) > 5.1 ? true : false);

var i_regexp_width = 80;
var i_result_width = 80;
var i_target_width = 80;

// this portion courtesy of: Jim Tucek

// <!--Quick! Hide the java!
// Speaking of Java, this particular script is (C) Copyright 2002 Jim Tucek
// If you wish to use my Email Encryption script, these comments must be left
// alone!  That is all.

// Visit www.jracademy.com/~jtucek/ for script information and a bit of help
// setting it up, or www.jracademy.com/~jtucek/email.html for contact
// information.

// A brief history of this script can be found (and it's rather entertaining)
// at www.jracademy.com/~jtucek/eencrypt.html


function goForth()
{
    var c = '815 206 333 51 506 689 797 206 848 233 178 561 739 307 692 461 692 142 719 412 526 730 552 178 333 412';
    var n = 851;
    var d = 317;
    c += ' ';
    var length = c.length;
    var number = 0;
    var bar = 0;
    var answer = '';
    for(var i = 0; i < length; i++)
    {
        number = 0;
        bar = 0;
        while(c.charCodeAt(i) != 32)
        {
            number = number * 10;
            number = number + c.charCodeAt(i)-48;
            i++;
        }
        answer += String.fromCharCode(decrypt(number,n,d));
    }
    return answer;
}

function decrypt(c,n,d)
{
    // Split exponents up
    if (d % 2== 0)
    {
        bar = 1;
        for(var i = 1; i <= d/2; i++)
        {
            foo = (c*c) % n;
            bar = (foo*bar) % n;
        }
    }
    else
    {
        bar = c;
        for(var i = 1; i <= d/2; i++)
        {
            foo = (c*c) % n;
            bar = (foo*bar) % n;
        }
    }
    return bar;
}

function dumpEmail()
{
    emailAddress = goForth();
    //emailAddress is the decrypted version of your email address, ie none@none.com
    document.write('<a href="mailto:' + emailAddress + '" title="send an email about JRX">drop me an email.</a>');
}

// Stop hiding the script


var counter=0;
// currently only partially used used for newline stripping
// will be later used for extended regexp's
function stripExtendedWhitespace(str)
{
    // maybe some regular expressions??? can be a lil bit hairy :)
    return str.replace(/(\r\n|\n|\r)+/, '');
    for(var i=0; i < str.length; i++)
    {
        curChar = str.charAt(i);
        if(curChar == '\\')
        {
            // skip next char
            i++;
        }
        //alert(curChar);
    }

    return str;
}

function checkMultiline()
{
    if(!is_gecko) elementById('jrxform').i_multiline.disabled='true';
}


function getResult (str, regexpstr)
{

    var myStatus = -1;
    var myArray = new Array;
    var dummyArray= new Array;
    var lidx = -1;
    var myLen = -1;

    try
    {
        regexpstr = stripExtendedWhitespace(regexpstr);
        var evalstr = '/' + regexpstr + '/';
        if(elementById('jrxform').i_global.checked)
            evalstr += 'g';
        if(elementById('jrxform').i_multiline.checked)
            evalstr += 'm';
        if(elementById('jrxform').i_insensitive.checked)
            evalstr += 'i';


        // display the regexp for copy-paste
        /* elementById('jrxform').i_regexp_preview.size = evalstr.length + 1; */
        elementById('jrxform').i_regexp_preview.value = evalstr.length + ' ' + evalstr;

        /* self.status = evalstr; */

        // assign and use it
        evalstr = "myRe = " + evalstr + ";";

        eval(evalstr);

        // myArray = myRe.exec(str);


        if(!elementById('jrxform').i_global.checked)
        {
            myArray = myRe.exec(str);
        }
        else
        {
            //alert("array: " + dummyArray + "\n" + "lidx: " + lidx);
            var counter = 0;
            while( counter++ < 250 && (dummyArray =myRe.exec(str)) != null)
            {
                if(is_gecko || ie_ver>5.1)
                {
                    //alert("GECKO -- arr: " + dummyArray + " lidx: " + myRe.lastIndex);
                }
                //else if(ie_ver>5.1)
                //{
                //    //alert('Hello');
                //}
                else
                {
                    //alert("IE -- arr: " + dummyArray + " lidx: " + dummyArray.lastIndex);
                    str = str.substring(dummyArray.lastIndex - 1);
                }
                //alert("GEN -- arr: " + dummyArray + " lidx: " + dummyArray.lastIndex);
                for(i=0; i< dummyArray.length; i++)
                {
                    x = dummyArray[i];
                    //alert('x:' + x);
                    // fucking IE5 doesn't know array.push method! %@%§!&
                    //myArray.push(x);
                    myArray[myArray.length] = x;
                    //alert('pushed: ' + dummyArray.lastIndex);
                }

            }
        }

        myStatus = 0;
    }
    catch(e)
    {
        // do nothing
        // necessary avoid the errors if the regexp is empty
        // this will be corrected in the next version
        myStatus = 2;
    }

    // this block is just a workaround for Array.length bug/quirk(?) in JavaScript
    // even if an Array is created, but is empty, you cannot use .length method
    // this produces an exception!!!
    try
    {
        myLen = myArray.length;
    }
    catch(e)
    {
        // preserve status if status is something else
        myStatus = (myStatus == 0 ? 1 : myStatus);
    }


    // delete the old results
    for(var o = elementById('jrxform').i_result.options.length; o >= 0; o--)
      elementById('jrxform').i_result.options[o] = null;

    // insert the results into select field
    try
    {
        var sel, text, opt;
        //alert(myStatus);
        if(myStatus == 1)
            myArray = ["Совпадений с шаблоном нет"];
        if(myStatus == 2)
            myArray = ["Результаты не найдены. Пустое или неправильное выражение?"];


        for(var i = 0; i < myArray.length; i++)
        {
            text = ( myStatus == 0  ?  i + ': (' + myArray[i] + ')'  :  myArray[i] ); // new text
            opt = new Option(text, i);              // new item to be added
            sel = elementById('jrxform').i_result;        // select object
            sel.options[sel.options.length] = opt;  // add the item at the end
        }
		if (myStatus!=1 && myStatus!=2) elementById('num_results').innerHTML = myArray.length.toString(); else elementById('num_results').innerHTML = '0';
        myArray = null;
    }
    catch (e)
    {
        // do nothing
    }

}
function toHex(value)
{
	var radix = 16;
	var out = new Array();
	var digits = new Array(0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F");//цифры системы
	/*Число переводим в другую систему, деля на новое основание и получая остатки от деления*/
	if(!isNaN(value)&&(value>=0))
	{
	do
	{
	out.push(digits[value%radix]);
	value/=radix;
	value = Math.floor(value);
	}
	while(value!=0)
	//остатки получены в обратном порядке
	out.reverse();// "переворачиваем" массив цифр числа
	out = out.join("");//в качестве разделителя ничего не выбираем
	}
	if (out.length!=4 && out.length!=2) out = '0' + out;
	return out;
}
function encodeLink(s)
{
	var re;
	re = /\//g;
	s = s.replace(re, "&2f;");
	re = /\n/g;
	s = s.replace(re, "&2a;")
	s = encodeURIComponent(s);
	return s;
}
function updateResults()
{
    getResult(elementById('jrxform').i_target.value, elementById('jrxform').i_regexp.value);
	var lnk = elementById('jrxform').i_regexp.value + dm + (elementById('i_global').checked?1:0) + (elementById('i_multiline').checked?1:0) + (elementById('i_insensitive').checked?1:0) + dm + elementById('i_target').value;
	//alert(encodeLink(lnk));
	elementById('jrxform').link.value = base_href + 'eval/' + encodeLink(lnk) + '/';
}
function emphasizeRefresh()
{
    elementById('jrxform').refreshbutton.className = (elementById('jrxform').i_autoupdate.checked ? "legend_button" : "legend_button_emp") ;
    updateResults();
}
function setInputFocus()
{
    elementById('jrxform').i_regexp.focus();
}
function clearTargetText()
{
    elementById('jrxform').i_target.value = '';
}
function setTargetFocus()
{
    elementById('jrxform').i_target.focus();
}
function countInputChars()
{
    elementById('input_length').innerHTML = elementById('jrxform').i_target.value.length;
}
function resizeInput()
{
    str = elementById('jrxform').i_regexp.value;
    iArr = str.split("\n");
    len = (iArr ? iArr.length : 0);
    rows = 10;
    if(len-6 <= 3) rows = 9;
    if(len-2 <= 3) rows = 5;
    if(len-1 <= 0) rows = 1;
}
function toggleMiniRef()
{
     if (elementById("inlinehelp").style.visibility == 'hidden') 
	{
		elementById("inlinehelp").style.visibility = 'visible';
		elementById("i_result").style.visibility = 'hidden';
	}
	else
	{
		elementById("inlinehelp").style.visibility = 'hidden';
		elementById("i_result").style.visibility = 'visible';
	}
}
function copyToClipboard()
{	
	if(navigator.userAgent.indexOf("MSIE")!=-1 && navigator.userAgent.indexOf("Opera")==-1) elementById('jrxform').link.createTextRange().execCommand('Copy'); else alert('Данная возможность в вашем браузере не поддерживается.');
}
function sendToCollection()
{
	var res = (elementById('jrxform').nm.value != '') && (elementById('jrxform').cm.value != '') && (elementById('jrxform').link.value != 'http://pcre.ru/eval/');
	if (!res) alert('Не заполнены обязательные поля! Заполните их и повторите запрос.');
	return res;
}
