﻿var SEARCH_ENGINES =
[   {name:'Google', url:'http://www.google.co.il/search?q=foobar'},
    {name:'וואלה', url:'http://search.walla.co.il/?e=hew&q=foobar'},
    {name:'Yahoo', url:'http://search.yahoo.com/search?p=foobar&fr=yfp-t-501&toggle=1&cop=mss&ei=UTF-8'},
    {name:'נענע', url:'http://index.nana10.co.il/google.asp?q=foobar&cr=1&rd=1&channel=NanaFrontPage'},
    {name:'AltaVista', url:'http://www.altavista.com/web/results?itag=ody&q=foobar&kgs=1&kls=0'}
];

var MAIL_SERVERS =
[   {   name:'Yahoo', url:'http://login.yahoo.com/config/login', uname:'login', pass:'passwd', args:
        [   {key:'.tries', value:''},
            {key:'.src', value:'ym'},
            {key:'.last', value:''},
            {key:'promo', value:''},
            {key:'lg', value:'us'},
            {key:'.intl', value:''},
            {key:'.bypass', value:''}
        ]
    },
    {   name:'נענע', url:'http://mail.nana10.co.il/HandleVars.asp', uname:'username', pass:'password', args:
        [   {key:'RememberMe', value:'1'},
            {key:'language', value:'he'},
            {key:'country', value:'IL'}
        ]
    },
    {   name:'Hotmail', url:'https://login.live.com/ppsecure/post.sf?id=2&svc=mail&cbid=24325&msppjph=1&tw=0&fsa=1&fsat=1296000&lc=1033&_lang=EN&bk=1155535883',
        uname:'login', pass:'passwd', args:
        [   {key:'PPFT', value:'B4AhQsifBxDDjC9loPglKhPg100WzZKeaxIPE4HXP3qgwQq7epJZJKLIcUq4VEYftyJu5pg%21IiGtnO9Si%21W2bK6P9p2Y'},
            {key:'PPSX', value:'PassportR'},
            {key:'LoginOptions', value:'2'}
        ]
    },
    {   name:'MSN', url:'https://hotmail.msn.co.il/authenticate.asp', uname:'login', pass:'passwd', args:[]
    }
];

function write_search(onsearch)
{   window.write_search_onsubmit = function(engine, search)
    {   onsearch(SEARCH_ENGINES[engine].url.replace('foobar', encodeURIComponent(search)));
    };
    document.write
    (   '<form onsubmit="window.write_search_onsubmit(this.engine.value, this.search.value); return false">'+
        '   <select name="engine">'
    );
    for (var i=0; i<SEARCH_ENGINES.length; i++)
    {   document.write('<option value="'+i+'">'+SEARCH_ENGINES[i].name+'</option>');
    }
    document.write
    (   '   </select>'+
        '   <input type="text" name="search" />'+
        '   <input type="submit" value="חפש" />'+
        '</form>'
    );
}

function write_mail(target, onsubmit)
{   window.write_mail_onsubmit = function(server, uname, pass)
    {   var s = MAIL_SERVERS[server];
        var html =
            '<form style="display:inline" name="write_mail_form" action='+jsquote(s.url)+' target='+jsquote(target)+'>'+
            '   <input type="hidden" name='+jsquote(s.uname)+' value="'+jshtml(uname)+'" />'+
            '   <input type="hidden" name='+jsquote(s.pass)+' value="'+jshtml(pass)+'" />';
        for (var i=0; i<s.args.length; i++) html += '<input type="hidden" name='+jsquote(s.args[i].key)+' value='+jsquote(s.args[i].value)+' />';
        html += '</form>';
        document.getElementById('mail_login_form').innerHTML = html;
        setTimeout(function() {onsubmit(s.name); setTimeout('document.forms.write_mail_form.submit()', 1)}, 1);
    };
    document.write
    (   '<form style="direction:ltr" onsubmit="window.write_mail_onsubmit(this.server.value, this.uname.value, this.pass.value); return false">'+
        '   <table><tr><td align="right">שירות</td><td align="right">שם משתמש</td><td align="right">סיסמא</td><td></td></tr><tr>'+
        '   <td><select name="server">'
    );
    for (var i=0; i<MAIL_SERVERS.length; i++)
    {   document.write('<option value="'+i+'">'+MAIL_SERVERS[i].name+'</option>');
    }
    document.write
    (   '   </select></td>'+
        '   <td><input type="text" name="uname" /></td>'+
        '   <td><input type="password" name="pass" /></td>'+
        '   <td><input type="submit" value="כנס" /></td>'+
        '   </tr></table>'+
        '</form>'+
        '<div id="mail_login_form"></div>'
    );
}

var sheq_in_dol=1.0, sheq_in_euro=1.0;
function calc_sheqel(opnd)
{   var c = document.getElementById('calc_currency').value;
    if (c == '0') return opnd; // sheqel
    if (c == '1') return opnd / sheq_in_dol; // dollar
    if (c == '2') return opnd / sheq_in_euro; // euro
    throw new Error();
}
function calc_dollar(opnd)
{   var c = document.getElementById('calc_currency').value;
    if (c == '1') return opnd; // dollar
    if (c == '0') return opnd * sheq_in_dol; // sheqel
    if (c == '2') return opnd / sheq_in_euro * sheq_in_dol; // euro   
    throw new Error();
}
function calc_euro(opnd)
{   var c = document.getElementById('calc_currency').value;
    if (c == '2') return opnd; // euro 
    if (c == '0') return opnd * sheq_in_euro; // sheqel 
    if (c == '1') return opnd * sheq_in_euro / sheq_in_euro; // dollar 
    throw new Error();
}
function calc_degree(opnd)
{   var t = document.getElementById('calc_trigonometry').value;
    if (t == '1') return opnd; // degree
    if (t == '0') return opnd * Math.PI / 180.0; // radian     
    throw new Error();
}
function calc_rad(opnd)
{   var t = document.getElementById('calc_trigonometry').value;
    if (t == '0') return opnd; // radian
    if (t == '1') return opnd * 180.0 / Math.PI; // degree  
    throw new Error();
}
function dec2hex(dec)
{	var DIGITS = '0123456789ABCDEF';
    var res = '';
    dec = dec>0 ? Math.floor(dec) : Math.ceil(dec);
    while (dec)
    {   var d = dec % 0x10;
        res = DIGITS.charAt(d) + res;
        dec -= d;
        dec /= 0x10;
    }
	return res || '0';
}

function write_calc(sheq_in_dol, sheq_in_euro, button, button_pressed, button_width, button_height, padding)
{   if (!padding) padding = 0;
    window.sheq_in_dol = sheq_in_dol || 1;
    window.sheq_in_euro = sheq_in_euro || 1;
    var BUTTONS =
    [   [   ['7','8','9','+','.'], ['4','5','6','-','^'], ['1','2','3','*','\u221A'], ['(','0',')','/','log ']
        ],
        [   ['sin ','asin '], ['cos ','acos '], ['tan ','atan '], ['\u00B0','\u03C0']
        ],
        [   ['&','|','~'], ['','0x',''], ['A','B','C'], ['D','E','F']
        ],
        [   ['\u20AA'], ['$'], ['\u20AC'], [' rad']
        ]
    ];
    var OPS =
    [   {sign:'\u20AA', regexp:'\\u20AA', type:'prefix', func:'calc_sheqel'},
        {sign:'$', regexp:'\\$', type:'prefix', func:'calc_dollar'},
        {sign:'\u20AC', regexp:'\\u20AC', type:'prefix', func:'calc_euro'},
        {sign:'\u00B0', regexp:'\\u00B0', type:'postfix', func:'calc_degree'},
        {sign:'rad', regexp:'rad', type:'postfix', func:'calc_rad'},
        {sign:'\u005E', regexp:'\\u005E', type:'binary', func:'Math.pow'}
    ];
    var button_html = 'align="center" style="padding:'+padding+'px; color:white; font-weight:bold; background-image:url('+button+')" onmousedown="this.style.backgroundImage=\'url('+button_pressed+')\'" onmouseup="this.style.backgroundImage=\'url('+button+')\'"'+(button_width?' width="'+(button_width-padding*2)+'"':'')+(button_height?' height="'+(button_height-padding*2)+'"':'');
    document.write
    (   '<table cellpadding="0" cellspacing="0" style="direction:ltr; cursor:default; background-color:#FFFF99; border:double gray"><tr>'+
        '<td colspan="'+(BUTTONS.length+1)+'" align="center" style="padding:5px">'+
        '<input type="text" style="border:inset gray; width:90%; background-color:white; color:gray; font-weight:bold; font-family:monospace; font-size:x-large; letter-spacing:1px" id="calc_display" />'+
        '</td></tr><tr><td valign="top">'
    );
    for (var b=0; b<BUTTONS.length; b++)
    {   if (b > 0) document.write('</td><td valign="top">');
        document.write('<input type="checkbox" onclick="document.getElementById(\'calc_button_set_'+b+'\').style.display = this.checked ? \'block\' : \'none\'" checked id="calc_checkbox_'+b+'" /><div id="calc_button_set_'+b+'"><table cellpadding="2" cellspacing="6">');
        for (var i=0; i<BUTTONS[b].length; i++)
        {   document.write('<tr>');
            for (var j=0; j<BUTTONS[b][i].length; j++) document.write('<td '+button_html+' onclick="with (document.getElementById(\'calc_display\')) {if (value==\'Error\') value=\'\'; value += \''+BUTTONS[b][i][j]+'\'}">'+BUTTONS[b][i][j]+'</td>');
            document.write('</tr>');
        }
        document.write('</table></div>');
    }
    document.write
    (   '</td><td><table><tr><td '+button_html+' onclick="document.getElementById(\'calc_display\').value = \'\'">C</td></tr><tr><td '+button_html+' onclick="window.write_calc_solve()">=</td></tr></table></td></tr>'+
        '<tr><td colspan="'+(BUTTONS.length+1)+'" align="center"><table><tr><td><select id="calc_trigonometry"><option value="0">rad</option><option value="1">&deg;</option></select> <select id="calc_radix"><option value="0">dec</option><option value="1">0x</option></select> <select id="calc_currency"><option value="0">\u20AA</option><option value="1">$</option><option value="2">\u20AC</option></select></td></tr></table>'+
        '</td></tr></table>'
    );
    for (var b=0; b<BUTTONS.length; b++) document.getElementById('calc_checkbox_'+b).onclick();
    var parse = function(expr)
    {   var stack=[], indices=[], level=0, close=expr.length;
        for (var i=expr.length-1; i>=0; i--)
        {   if (expr.charAt(i) == ')')
            {   close = i;
                for (var j=0; j<OPS.length; j++)
                {   if (OPS[j].type=='postfix' && expr.substring(i+1).match(new RegExp('^\\s*'+OPS[j].regexp)))
                    {   stack[stack.length] = {level:level, close:close, op:j};
                    }
                }
                level++;
            }
            else if (expr.charAt(i) == '(')
            {   level--;
                for (var j=stack.length-1; j>=0; j--)
                {   if (stack[j].level == level)
                    {   indices[indices.length] = {open:i, close:stack[j].close, op:stack[j].op};
                        if (OPS[stack[j].op].type=='binary') close = stack[j].close;
                        stack.length--;
                    }
                }
                for (var j=0; j<OPS.length; j++)
                {   if (OPS[j].type!='postfix' && i>0 && expr.substr(0, i).match(new RegExp(OPS[j].regexp+'\\s*$')))
                    {   if (OPS[j].type=='prefix')
                            indices[indices.length] = {open:i, close:close, op:j};
                        else
                            stack[stack.length] = {level:level, close:close, op:j};
                    }
                }
            }
        }
        for (var j=0; j<OPS.length; j++)
        {   expr = expr.replace(new RegExp(OPS[j].regexp, 'g'), OPS[j].type=='binary'?',':' '); 
        }
        var expr2 = '';
        for (var i=0; i<expr.length; i++)
        {   for (var j=0; j<indices.length; j++)
            {   if (i == indices[j].open) expr2 += '('+OPS[indices[j].op].func+'(';
                else if (i == indices[j].close) expr2 += '))';
            }
            expr2 += expr.charAt(i);
        }
        return expr2;
    };
    window.write_calc_solve = function()
    {   var expr = document.getElementById('calc_display').value;
        expr = expr.
            replace(/\b(0x[\da-f]+)\b/ig, function(all,m1) {return eval(m1)}).
            replace(/(\d*\.?\d+)/g, '($1)'). 
            replace(/\blog\b/ig, '\u1000').
            replace(/\bsin\b/ig, '\u1001').
            replace(/\basin\b/ig, '\u1002').
            replace(/\bcos\b/ig, '\u1003').
            replace(/\bacos\b/ig, '\u1004').
            replace(/\btan\b/ig, '\u1005').
            replace(/\batan\b/ig, '\u1006').
            replace(/\brad\b/ig, '\u1007').
            replace(/[^0-9\.\(\)\+\-\*\/\%\^\$\u20AC\u00B0\u221A\u03C0\u20AA\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\?\:\!\=\>\<\&\|\~]/ig, ' ').
            replace(/\u03C0/g, '(Math.PI)'). 
            replace(/\u221A/g, 'Math.sqrt').
            replace(/\u1000/g, 'Math.log'). 
            replace(/\u1001/g, 'Math.sin'). 
            replace(/\u1002/g, 'Math.asin'). 
            replace(/\u1003/g, 'Math.cos'). 
            replace(/\u1004/g, 'Math.acos'). 
            replace(/\u1005/g, 'Math.tan'). 
            replace(/\u1006/g, 'Math.atan').
            replace(/\u1007/g, 'rad');
        var res;
        try {res = eval(parse(expr))} catch (e) {res = 'Error'}
        if (res+'' == 'undefined') res = 'Error';
        if (res!='Error' && document.getElementById('calc_radix').value=='1') res = '0x'+dec2hex(res);
        document.getElementById('calc_display').value = res;
    };
}
