/* Changes
    1.04    Removed non-working gifts
    1.03    Skip unnamed friends
    1.02    New messages from mafia wars
    1.01    Change for new response message from mw, and add update notice
*/
javascript:(//)
    function() {
        var version='FreeGift 1.04',
            i=0, j=0, m, a, s, res,
            xmlHTTP,
            last_url=null,
            resume_msg="",
            retries=0,
            apps_mw='http://apps.facebook.com/inthemafia/index.php?xw_controller=',
            gifting_url=apps_mw+'gift&xw_action=view',
            mw_url=apps_mw+'stats&ajax=1&xw_action=view&user=',
            gifts_received=0,
            friends_checked=0,
            friends=[],
            log=[],
            extralog=[],
            first=true,
            wait,
            skip,
            item,
            max,
            selected,
            items_collected={},
            collected,
            items={
                //"0:4":"Sawed-off Shotgun",
                //"0:12":"Motorcycle",
                //"0:19":"Liquor x20",
                //"0:20":"Tokens x20",
                //"0:21":"Cards x20",
                //"0:22":"Wiretap Device",
                "1:6":"Tactical Shotgun",
                "1:8":"Stab-Proof Vest",
                "1:11":"Armored Truck",
                "1:18":"Bodyguards",
                "1:19":"Night Vision Goggles",
                "1:63":"Computer Set-Up",
                "1:64":"Untraceable Cell Phone",
                "1:65":"Blackmail Photos",
                "1:68":"Illegal Transaction Records"},
            content=$('app10979261223_content_row'),
            mafia_size=$("app10979261223_user_group_size").parentNode.parentNode,
            mwtools_div=$('mwtools'),
            xpath="//input[@name='recipients[]']",
            running_html =
                '<style type="text/css">'+
                    '.messages img{margin:0 3px}'+
                    '#pl{display:none}'+
                '</style>'+
                '<table class="messages">'+
                    '<tr>'+
                        '<td><a href="http://vern.com/mwtools/">Vern\'s MW Tools</a></td>'+
                        '<td class="title">'+version+'</td>'+
                        '<td style="text-align:right">'+
                            '<a href="#" id="pa"><img src="http://vern.com/mwtools/pa.gif" title="Pause" width="14" height="14"></a>'+
                            '<a href="#" id="pl"><img src="http://vern.com/mwtools/pl.gif" title="Play" width="14" height="14"></a>'+
                            '<a href="#" id="cl"><img src="http://vern.com/mwtools/cl.gif" title="Close" width="14" height="14"></a>'+
                            '<form name="mwtform">'+
                                '<input type="hidden" name="go" id="go" value="1">'+
                            '</form>'+
                        '<td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td width="20%">Friends checked:</td>'+
                        '<td id="friends_checked"></td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Items collected:</td>'+
                        '<td id="items_collected"></td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Status:</td>'+
                        '<td id="status" colspan="2"></td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td valign="top">Log:</td>'+
                        '<td id="log" colspan="2"></td>'+
                    '</tr>'+
                '</table>',
            config_html,
            results=document.evaluate(xpath,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
        wait = readCookie('mwtfg_wait'); if (!wait) wait = 0;
        skip = readCookie('mwtfg_skip'); if (!skip) skip = 0;
        item = readCookie('mwtfg_item'); if (!item) item = "1:64";
        max  = readCookie('mwtfg_max');  if (!max)  max  = 100;
        config_html=
            '<style type="text/css">'+
                '.messages img{margin:0 3px}'+
            '</style>'+
            '<form name="mwtform">'+
                '<input type="hidden" name="go" id="go" value="1">'+
                '<table class="messages">'+
                    '<tr>'+
                        '<td colspan="2" class="title">'+version+' Configuration</td>'+
                        '<td style="text-align:right;font-size:0.8em">'+
                            '<a href="http://vern.com/mwtools/">Vern\'s MW Tools</a> '+
                            '<a href="#" id="cl"><img src="http://vern.com/mwtools/cl.gif" title="Close" width="14" height="14"></a>'+
                        '</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Wait: </td>'+
                        '<td>'+
                            '<input type="text" name="wait" id="wait" value="'+wait+'">'+
                        '</td>'+
                        '<td colspan="2">The delay between requests in seconds.</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Skip: </td>'+
                        '<td>'+
                            '<input type="text" name="skip" id="skip" value="'+skip+'">'+
                        '</td>'+
                        '<td colspan="2">How many mafia friends to skip before checking.</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Max: </td>'+
                        '<td>'+
                            '<input type="text" name="max" id="max" value="'+max+'">'+
                        '</td>'+
                        '<td colspan="2">Stop after collecting this number of items.</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>Item: </td>'+
                        '<td>'+
                            '<select name="item" id="item">';
        for (a in items) {
            selected="";
            if (item == a) { selected=" selected"; }
            config_html+='<option'+selected+' value="'+a+'">'+items[a]+'</option>';
        }
        config_html+=
                            '</select>'+
                        '</td>'+
                        '<td colspan="2">The item to collect.</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td></td>'+
                        '<td>'+
                            '<a class="sexy_button" id="start">Start</a>'+
                        '</td>'+
                    '</tr>'+
                '</table>'+
            '</form>';
        while((res=results.snapshotItem(i))!=null) {
            friends[j]={'id':res.value,'name':res.nextSibling.nodeValue};
            friends[j].name=friends[j].name.replace(/[\n\s]+$/g, '');
            if (friends[j].name.length == 0)
                delete friends[j];
            else
                j++;
            i++;
        }
        if (!mwtools_div) {
            mwtools_div=document.createElement('div');
            mwtools_div.setAttribute('id','mwtools');
            mwtools_div.innerHTML='<table class="messages"></table>';
            content.insertBefore(mwtools_div,content.firstChild);
        }
        mwtools_div.innerHTML=config_html;
        // fix the mafia count, just in case it line-wrapped
        mafia_size.innerHTML='<nobr>'+mafia_size.innerHTML.replace(/&nbsp;/g,'')+'</nobr>';
        function get_xmlHTTP() {
            if(window.XMLHttpRequest)
                return new XMLHttpRequest();
            if(window.ActiveXObject)
                return new ActiveXObject("Microsoft.XMLHTTP");
            return null;
        }
        function createCookie(name,value) {
            /* expire one month from now */
            var expires = new Date();
            expires.setDate(expires.getDate()+30);
            document.cookie = name+"="+value+";expires="+expires.toGMTString()+"; path=/";
        }
        function readCookie(name) {
            var c, i,
                nameEQ = name + "=",
                ca = document.cookie.split(';');
            for(i=0;i < ca.length;i++) {
                c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
            }
            return null;
        }
        function request(url) {
            if (document.mwtform.go.value == 1) {
                xmlHTTP.onreadystatechange=state_change;
                xmlHTTP.open("GET",url,true);
                xmlHTTP.send(null);
            } else {
                resume_msg=$('status').innerHTML;
                status('Paused');
            }
            last_url=url;
        }
        $("cl").onclick=function(e) { /* close */
            $("app10979261223_content_row").removeChild($("mwtools"));
        }
        $("start").onclick=function(e) {
            wait = document.mwtform.wait.value; createCookie("mwtfg_wait",wait);
            skip = document.mwtform.skip.value; createCookie("mwtfg_skip",skip);
            max  = document.mwtform.max.value;  createCookie("mwtfg_max", max);
            item = document.mwtform.item.value; createCookie("mwtfg_item",item);
            mwtools_div.innerHTML=running_html;
            $("pl").style.display = 'none';
            $("cl").onclick=function(e) { /* close */
                $("app10979261223_content_row").removeChild($("mwtools"));
            }
            $("pa").onclick=function(e) { /* pause */
                document.mwtform.go.value = 0;
                $("pa").style.display = 'none';
                $("pl").style.display = 'inline';
            }
            $("pl").onclick=function(e) { /* play */
                document.mwtform.go.value = 1;
                $("pl").style.display = 'none';
                $("pa").style.display = 'inline';
                status('Resuming: '+resume_msg);
                request(last_url);
            }
            logger("Found "+i+" mafia friends.");
            friends=friends.slice(skip);
            i=skip;
            request_next();
        }
        function retry(s) {
            if(retries>9) {
                status(s+'; not retrying any more.');
            } else {
                function f(){
                    retries++;
                    logger(s+'; retry #'+retries+'...');
                    request(last_url);
                }
                setTimeout(f,3000);
            }
        }
        function logger(line) {
            $('friends_checked').innerHTML=friends_checked;
            collected="";
            for (a in items_collected) {
                collected+=a+": "+items_collected[a]+"<br/>";
            }
            $('items_collected').innerHTML=collected;
            log.unshift(line)
            if (log.length>10) {
                line=log.pop();
                if (/(Found)/.test(line)) {
                    extralog.unshift(line);
                }
            }
            $("log").innerHTML=log.concat(extralog,"").join("<br/>");
        }
        function status(s) {
            $('status').innerHTML=s;
        }
        function mwlink(s) {
            return'<a href="'+mw_url+friends[0].id+'">'+s+'</a>';
        }
        function outi() {
            return'<span class="more_in">'+i+'</span>';
        }
        function gift_url(item) {
            m=item.split(":");
            return apps_mw+"interstitial&xw_action=accept_gift&interstitial_gift_id="+m[1]+"&interstitial_gift_cat="+m[0]+"&from_user=";
        }
        function request_next() {
            function f() {
                status('Collecting from '+mwlink(friends[0].name)+'...');
                request(gift_url(item)+friends[0].id);
            }
            if(friends.length>0 && gifts_received < max) {
                if(first || wait == 0) {
                    first=false;
                    f();
                } else {
                    status('Waiting for '+wait+' seconds...');
                    setTimeout(f,wait*1000);
                }
            } else {
                status('All done');
                logger('');
            }
        }
/*
>You are not eligible to receive a gift from this player
>Lori Miller gave you Untraceable Cell Phone.  <[^>]*>Accept them to your mafia!</a>
>TNT is not a valid gift item.
*/
        function state_change() {
            if(xmlHTTP.readyState==4) {
                if(xmlHTTP.status==200) {
                    s=xmlHTTP.responseText;
                    delete xmlHTTP['onreadystatechange'];
                    if(m=/>([^<]*) gave you ([^<]*)\. *<[^>]*>Accept them/.exec(s)) {
                        if (items_collected[m[2]]) {
                            items_collected[m[2]]++;
                        } else {
                            items_collected[m[2]]=1;
                        }
                        gifts_received++;
                        logger(outi()+' Received <span class="good">'+m[2]+'</span> from '+mwlink(m[1]));
                    } else if(m=/You just accepted this <span class="good">([^<]*)</.exec(s)) {
                        if (items_collected[m[1]]) {
                            items_collected[m[1]]++;
                        } else {
                            items_collected[m[1]]=1;
                        }
                        gifts_received++;
                        logger(outi()+' Received <span class="good">'+m[1]+'</span> from '+mwlink(friends[0].name));
                    } else if(m=/>([^<]+) is not a valid gift item/.exec(s)) {
                        logger(outi()+' Cannot collect '+m[1]+' with this script.');
                    } else if(/You are not eligible to receive a gift from this player/.test(s)) {
                        logger(outi()+' You are not eligible to receive a gift from '+mwlink(friends[0].name));
                    } else if(/You waited too long to accept this gift/.test(s)) {
                        logger(outi()+' Gift not currently available from '+mwlink(friends[0].name));
                    } else if(/You did not have any pending gift requests/.test(s)) {
                        logger(outi()+' <a href="'+last_url+'">Gift</a> not currently available from '+mwlink(friends[0].name));
                    } else if(/You were not friends with the person/.test(s)) {
                        logger(outi()+' '+mwlink(friends[0].name)+' is not your friend.');
                    } else if (/Error while loading page/.test(s)) {
                        function f(){
                            request(last_url);
                        }
                        logger('Mafia Wars is having problems, pausing...');
                        setTimeout(f,20000);
                        return;
                    } else {
                        retry('Unknown response (<a href="'+gift_url(item)+friends[0].id+'">gift url</a>)');
                        return;
                    }
                    retries=0;
                    friends=friends.slice(1);
                    friends_checked++;
                    i++;
                    request_next();
                } else {
                    retry('Problem retrieving data '+last_url);
                    return;
                }
            }
        }
        xmlHTTP=get_xmlHTTP();
        if(!xmlHTTP) {
            alert("Your browser does not support XMLHTTP.");
            return;
        }
        if (i==0) {
            mwtools_div.innerHTML=running_html;
            $("cl").onclick=function(e) { /* close */
                $("app10979261223_content_row").removeChild($("mwtools"));
            }
            $("pl").style.display = 'none';
            $("pa").style.display = 'none';
            status('Run this bookmarklet from <a href="'+gifting_url+'">the gifting page</a>.');
            logger('(Because the gifting page has a full list of your mafia on one page.)');
            return;
        }
    }()
);
