// As Interface like to Prototype the Array object use this
// http://webreflection.blogspot.com/2007/03/for-in-loop-prototype-safe.html
function $for(obj, callback){
    var proto = obj.constructor.prototype,
    h = obj.hasOwnProperty, key;
    for(key in obj) {
    if((h && h.call(obj,key)) || proto[key] !== obj[key])
        if (callback(key, obj[key]) == 'break;') {
            break;
        }
    }
};

// Adds a working toFixed method to Number class
function Stretch(Q, L, c) { var S = Q
    if (c.length>0) while (S.length<L) { S = c+S }
    return S
}
function StrU(X, M, N) { // X>=0.0
    var T, S=new String(Math.round(X*Number("1e"+N)))
    if (S.search && S.search(/\D/)!=-1) { return ''+X }
    with (new String(Stretch(S, M+N, '0')))
    return substring(0, T=(length-N)) + '.' + substring(T)
}
function Sign(X) { return X<0 ? '-' : ''; }
function StrS(X, M, N) { return Sign(X)+StrU(Math.abs(X), M, N) }
Number.prototype.toFixed= new Function('n','return StrS(this,1,n)')


var current_view = '';
var last_view = '';
var global_changed = 0;

// Draws the passed element location (1 to squadsize)
function draw_element(i) {
    var t_id = document.getElementById("ism_selection_"+i).value;
    if (mode == 'watchlist') {
        if (t_id) {
            document.getElementById("ism_data_"+i).style.display = '';
        }
        else {
            document.getElementById("ism_data_"+i).style.display = 'none';
        }
    }        
    var shirt, action, actioni, info, infoi, dti, name, stat;
    var daction, dactioni, dinfo, dinfoi, ddti, dname;
    if (mode == 'transfer' || mode == 'selection') {
        shirt = document.getElementById("ism_selection_"+i+"_shirt"); 
        action = document.getElementById("ism_selection_"+i+"_action");
        actioni = document.getElementById("ism_selection_"+i+"_action_image");
        info = document.getElementById("ism_selection_"+i+"_info_link");
        infoi = document.getElementById("ism_selection_"+i+"_info_image");
        dti = document.getElementById("ism_selection_"+i+"_dreamteam_image");
        name = document.getElementById("ism_selection_"+i+"_name");
        stat = document.getElementById("ism_selection_"+i+"_stat");
    }
    if (mode == 'transfer' || mode == 'selection' || mode == 'watchlist') {
        daction = document.getElementById("ism_data_"+i+"_action");
        daction.style.visibility = 'visible';
        dactioni = document.getElementById("ism_data_"+i+"_action_image");
        dinfo = document.getElementById("ism_data_"+i+"_info_link");
        dinfo.style.visibility = 'visible';
        dinfoi = document.getElementById("ism_data_"+i+"_info_image");
        ddti = document.getElementById("ism_data_"+i+"_dreamteam_image");
        dname = document.getElementById("ism_data_"+i+"_name");
    }
    if (infoi) infoi.style.display = 'inline';
    if (dinfoi) dinfoi.style.display = 'inline';
    if (ed[t_id]) {
        if (mode == 'transfer' || mode == 'selection') {
            if (ed[t_id][_in_dreamteam]) {
                if (dti) dti.style.display = 'inline';
                if (ddti) ddti.style.display = 'inline';
            }
            else {
                if (dti) dti.style.display = 'none';
                if (ddti) ddti.style.display = 'none';
            }
            if (ed[t_id][_element_type_id] == 1) {
                shirt.src = gsi[ed[t_id][_team_id]].src;
            }
            else {
                shirt.src = si[ed[t_id][_team_id]].src;
            }
            shirt.title = gsi[ed[t_id][_team_id]].alt;
            shirt.onclick = '';
            if (ed[t_id][_doubtful]) {
                infoi.src = infoposs_image.src;
            }
            else if (ed[t_id][_news]) {
                infoi.src = infowarn_image.src;
            }
            else {
                infoi.src = info_image.src;
            }
            name.innerHTML = wrap_text(ed[t_id][_web_name]);
            info.href = "javascript:draw_element_view("+t_id+")";
            stat.innerHTML = ed[t_id][_now_cost];
        }
        if (mode == 'selection') {
            action.href = "javascript:remove_element("+i+")";
            action.style.visibility = 'visible';
            info.style.visibility = 'visible';
            dname.innerHTML = ed[t_id][_web_name];
            daction.href = action.href;
            dinfo.href = "javascript:draw_element_view("+t_id+")";
        }
        else if (mode == 'transfer') {
            action.href = "javascript:cancel_element("+i+");";
            actioni.src = image_in_canc.src;
            dname.innerHTML = ed[t_id][_web_name];
            daction.href = action.href;
            dactioni.src = actioni.src;
            name.className = '';
            dname.className = '';
            stat.className = '';
            dinfo.href = info.href;
            dinfoi.src = infoi.src;
        }
        else if (mode == 'watchlist') {
            if (ed[t_id][_in_dreamteam]) {
                if (ddti) ddti.style.display = 'inline';
            }
            else {
                if (ddti) ddti.style.display = 'none';
            }
            daction.href = "javascript:remove_element_watchlist("+i+");";
            dactioni.src = image_in_canc.src;
            dname.innerHTML = ed[t_id][_web_name];
            if (ed[t_id][_doubtful]) {
                dinfoi.src = infoposs_image.src;
            }
            else if (ed[t_id][_news]) {
                dinfoi.src = infowarn_image.src;
            }
            else {
                dinfoi.src = info_image.src;
            }
            dinfo.href = "javascript:draw_element_view("+t_id+")";
        }
        if (mode == 'transfer' || mode == 'selection' || mode == 'watchlist') {
            $for(es,function(key,value) {
                var sval = 0;
                if (value == 'selling_price' || value == 'purchase_price') {
                    sval = ed[t_id][_now_cost];
                } else {
                    sval = eval("ed[t_id][_"+value+"]");
                }
                document.getElementById("ism_data_"+i+"-"+key+"-stat").innerHTML = sval;
                document.getElementById("ism_data_"+i+"-"+key+"-stat").className = '';
            });
        }
    } 
    else if (t_id == -1) {
        if (ed[pd[i][_id]][_in_dreamteam]) {
            if (dti) dti.style.display = 'inline';
            if (ddti) ddti.style.display = 'inline';
        }
        else {
            if (dti) dti.style.display = 'none';
            if (ddti) ddti.style.display = 'none';
        }
        shirt.src = si[0].src;
        shirt.title = si[0].alt;
        shirt.onclick = function() {document.getElementById("ism_pricerange_filter").value = '';document.getElementById("ism_element_filter").value = 'et_'+ed[pd[i][_id]][_element_type_id];get_element_data(1);};
        action.href = "javascript:remove_element("+i+")";
        daction.href = action.href;
        actioni.src = image_out_canc.src;
        dactioni.src = actioni.src;
        name.innerHTML = wrap_text(ed[pd[i][_id]][_web_name]);
        dname.innerHTML = ed[pd[i][_id]][_web_name];
        name.className = 'ism_dropped';
        dname.className = name.className;
        stat.innerHTML = pd[i][_selling_price];
        stat.className = 'ism_dropped';
        info.href = "javascript:draw_element_view("+pd[i][_id]+")";
        dinfo.href = info.href;
        if (ed[pd[i][_id]][_doubtful]) {
            infoi.src = infoposs_image.src;
        }
        else if (ed[pd[i][_id]][_news]) {
            infoi.src = infowarn_image.src;
        }
        else {
            infoi.src = info_image.src;
        }
        dinfoi.src = infoi.src
        $for (es, function(key,value)  {
            var sval = 0;
            if (value == 'selling_price' || value == 'purchase_price') {
                sval = eval("pd[i][_"+value+"]");
            } else {
                sval = eval("ed[pd[i][_id]][_"+value+"]");
            }
            document.getElementById("ism_data_"+i+"-"+key+"-stat").innerHTML = sval;
         document.getElementById("ism_data_"+i+"-"+key+"-stat").className = 'ism_dropped';
        });
    }
    else {
        if (mode == 'selection') {
            if (ed[pd[i]] && ed[pd[i][_id]][_in_dreamteam]) {
                if (dti) dti.style.display = 'inline';
                if (ddti) ddti.style.display = 'inline';
            }
            else {
                if (dti) dti.style.display = 'none';
                if (ddti) ddti.style.display = 'none';
            }
            shirt.src = si[0].src;
            shirt.title = si[0].alt;
            var type = 0;
            for (t = 1; t <= i; t+=mxs[type]) {
                type++;
            } 
            shirt.onclick = function() {document.getElementById("ism_element_filter").value = 'et_'+type;get_element_data(1);};
            action.style.visibility = 'hidden';
            info.style.visibility = 'hidden';
            daction.style.visibility = 'hidden';
            dinfo.style.visibility = 'hidden';
            name.innerHTML = '';
            dname.innerHTML = '';
            stat.innerHTML = '';
            $for(es, function(key, value) {
                document.getElementById("ism_data_"+i+"-"+key+"-stat").innerHTML = '';
                document.getElementById("ism_data_"+i+"-"+key+"-stat").className = '';
            });
        } 
        else if (mode == 'transfer') {
            if (ed[pd[i][_id]][_in_dreamteam]) {
                if (dti) dti.style.display = 'inline';
                if (ddti) ddti.style.display = 'inline';
            }
            else {
                if (dti) dti.style.display = 'none';
                if (ddti) ddti.style.display = 'none';
            }
            if (ed[pd[i][_id]][_element_type_id] == 1) {
                shirt.src = gsi[ed[pd[i][_id]][_team_id]].src;
            }
            else {
                shirt.src = si[ed[pd[i][_id]][_team_id]].src;
            }
            shirt.title = si[ed[pd[i][_id]][_team_id]].alt;
            action.href = "javascript:cancel_element("+i+");";
            actioni.src = image_out.src;
            daction.href = action.href;
            dactioni.src = actioni.src;
            name.innerHTML = wrap_text(ed[pd[i][_id]][_web_name]);
            name.className = '';
            dname.innerHTML = ed[pd[i][_id]][_web_name];
            dname.className = '';
            stat.innerHTML = pd[i][_selling_price].toFixed(1);
            stat.className = '';
            info.href = "javascript:draw_element_view("+pd[i][_id]+")";
            dinfo.href = info.href;
            if (ed[pd[i][_id]][_doubtful]) {
                infoi.src = infoposs_image.src;
            }
            else if (ed[pd[i][_id]][_news]) {
                infoi.src = infowarn_image.src;
            }
            else {
                infoi.src = info_image.src;
            }
            dinfoi.src = infoi.src
            $for (es, function(key,value) {
                var sval = 0;
                if (value == 'selling_price' || value == 'purchase_price') {
                    sval = eval("pd[i][_"+value+"]");
                } else {
                    sval = eval("ed[pd[i][_id]][_"+value+"]");
                }
                document.getElementById("ism_data_"+i+"-"+key+"-stat").innerHTML = sval;
             document.getElementById("ism_data_"+i+"-"+key+"-stat").className = '';
            });
        }
    }
}

// Gets and sorts element data based on filter selections
function get_element_data(page)  {
    // read filters from form
    var element_filter = document.getElementById("ism_element_filter").value;
    var stat_filter = document.getElementById("ism_stat_filter").value;
    var price_filter = document.getElementById("ism_pricerange_filter").value;
    // examine filters to determine validity and stat sort
    var element_type_limit;
    var team_limit;
    if (element_filter != 'watchlist' && element_filter != 'dreamteam') {
        var re = /^(et|te)_(\d+)$/;
        var matches = re.exec(element_filter);
        if (matches) {
            if (matches[1] == 'et') {
                element_type_limit = (tn[matches[2]] ? matches[2] : '');
            }
            else if (matches[1] == 'te') {
                team_limit = (td[matches[2]] ? matches[2] : '');
            }
        }
    }
    var sortc = (sm[stat_filter] ? sm[stat_filter] : '11');
    if (element_type_limit) {
        //var lo = 0;
        var hi = 999999;
        re = /^(\d+(\.\d+)?)$/;
        matches = re.exec(price_filter);
        if (matches) {
            hi = matches[1];
        }

        document.getElementById("ism_pricerange_filter").options.length = 1;

        for (var i = 0; i < pr[element_type_limit].length; i++) {
            var o = new Option;
            o.value = pr[element_type_limit][i];
            o.text = pr[element_type_limit][i];
            if (price_filter == o.value) {o.selected = true;}
            document.getElementById("ism_pricerange_filter").options[i+1] = o;
        }    
        document.getElementById('ism_price_filter').style.display='block';
    }    
    else {
        document.getElementById('ism_price_filter').style.display='none';
    }    
    // Filter based on filter and then sort based on stats
    var show_unavailable = mode == 'stats' ? 1 : 0;
    var found = 0;
    var temped = new Array;
    if (element_filter == 'watchlist') {
        $for (wl, function(key,value) {
            temped[temped.length] = ed[value];
        });
    }
    else if (element_filter == 'dreamteam') {
        $for (dt, function(key,value) {
            temped[temped.length] = ed[value];
        });
    }
    else {
        $for (ed, function(key,value) { 
            if (value[_now_cost] > hi) {return;}
            if ( (!show_unavailable) && value[_unavailable]) {return;}
            if (element_type_limit && value[_element_type_id] != element_type_limit)        {return;}
            if (team_limit && value[_team_id] != team_limit) {return;}
            temped[temped.length] = value;
        });
    }
    var edsort = new Array;
    var max_to_show = selectionplayerlimit;
    var skip = (page - 1) * max_to_show;
    var skip_count = 0;
    $for (temped.sort(function(a,b) {return b[sortc] - a[sortc];}), function(key,value) {  
        if ( !team_limit && element_filter != 'watchlist' && element_filter != 'dreamteam' && found == max_to_show) {return;}
        skip_count++;
        if (skip_count < skip) { return; }
        edsort[edsort.length] = value;
        found++;
    });
    // Previous and next links
    var previous_link = document.getElementById('ism_element_navigation_previous');
    var next_link = document.getElementById('ism_element_navigation_next');
    if (!team_limit && element_filter != 'watchlist' && element_filter != 'dreamteam' && page > 1) {   
        previous_link.href='javascript:get_element_data('+(page-1)+')';
        previous_link.style.display = 'inline';
    }
    else {
        previous_link.style.display = 'none';
    }
    if ( !team_limit && element_filter != 'watchlist' && element_filter != 'dreamteam' && found == max_to_show) {
        next_link.href='javascript:get_element_data('+(page+1)+')';
        next_link.style.display = 'inline';
    }
    else {
        next_link.style.display = 'none';
    } 

    display_element_data(edsort,sm[stat_filter]);
    
}

// Displays element data list to allow selection
function display_element_data(newed,stat) {
    var elements;
    var tables = new Array;
    var table;
    var num_cols = 5;
    var stat_filter = document.getElementById("ism_stat_filter").value;
    for (var i = 1; i <= numtypes; i++) { tables[i] = new Array;}
    if (mode == 'stats') {
        table = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="ism_table"><tr><th></th><th>T</th><th>V</th>';
        num_cols = 3;
        var have_stat = 0;
        $for (gs, function(key,value) {
            if (sm[value[0]] == stat) {
                have_stat = 1;
                return 'break;';
            }        
        });
        if (stat == _now_cost) have_stat = 1;
        $for (gs, function(key,value) {    

            if (!have_stat && stat != _total && sm[value[0]] == _minutes) return;
            table += '<th><a href="javascript:sort_stat_table(';
            table += value[0];
            table += ');">';
            table += value[1];
            table += '</a></th>';
            num_cols++;
        });
        if (sm[stat_filter] != _total) {
            table += '<th><a href="javascript:sort_stat_table(';
            table += 10;
            table += ');">';
            table += 'P';
            table += '</a></th>';
            num_cols++;
        }
        num_cols++;
        if (!have_stat) {
            table += '<th>*</th>';
        }
        table += '</tr>';
        $for(newed, function(key,value) {
            var s = '';
            s += '<td class="ism_element_name"><a href="javascript:draw_element_view('; 
            s += value[_id];
            s += ')">';
            s += value[_web_name];
            s += '</a></td><td>';
            s += td[value[_team_id]][1];
            s += '</td><td>';
            s += value[_now_cost].toFixed(1);
            s += '</td><td>';
            
            $for (gs, function (key2,value2) {
                if (!have_stat && stat != _total && sm[value2[0]] == _minutes) return;
                s += value[sm[value2[0]]];
                s += '</td><td>';            
            });
            if (sm[stat_filter] != _total) {
                s += value[_total];
                s += '</td><td>';            
            }
            if (!have_stat) {
                s += value[stat];
                s += '</td>';
            }
            tables[value[_element_type_id]][tables[value[_element_type_id]].length] = s;
        });
    } else {
        table = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="ism_element_selection">';
        $for(newed, function(key,value) {
            var s = '';
            s += '<td class="ism_element_info"><a href="javascript:draw_element_view(';
            s += value[_id];
            s += ');">';
            s += '<img src="/images/';
            s += code;
            s += '/info';
            s += (value[_doubtful] ? 'poss' : value[_news] ? 'warn' : '');
            if (mode == 'selection') {
                s += '.gif" /></a></td><td class="ism_element_name"><a href="javascript:add_element(';
            }
            else if (mode == 'transfer') {
                var extra_class = '';
                $for (pd, function(key2,value2)  {
                    if (value2[0] == value[_id]) {
                        extra_class = 'ism_inTeam';
                        return;
                    }
                });
                for (var j = 1; j < squadsize; j++) {
                    var el = document.getElementById("ism_selection_"+j).value;
                    if (el == value[_id]) {
                        extra_class = 'ism_inTeam';
                        break;
                    }
                }

                s += '.gif" /></a></td><td class="ism_element_name '+ extra_class+'"><a href="javascript:add_element(';
            }
            else if (mode == 'watchlist') {
                s += '.gif" /></a></td><td class="ism_element_name"><a href="javascript:add_element_watchlist('; 
            }
            s += value[_id];
            s += ')">';
            s += wrap_text(value[_web_name]);
            s += '</a></td><td class="ism_element_team">';
            s += long_team_names ? td[value[_team_id]][0] : td[value[_team_id]][1];
            s += '</td><td class="ism_element_cost">';
            s += value[_now_cost].toFixed(1);
            s += '</td><td class="ism_element_stat" id="elid_';
            s += value[_id];
            s += '"><a href="javascript:show_form(';
            s += value[_id];
            s += ');">'
            s += value[stat]
            s += '</a></td>';
            tables[value[_element_type_id]][tables[value[_element_type_id]].length] = s;
        });
    }
    for (var i = 1; i <= numtypes; i++) {
        if (!tables[i].length) {continue;}
        table += '<tr><td colspan="';
        table += num_cols;
        table += '"><h3 class="ism_element_type_header">';
        table += '<a href="javascript:;" onclick="';
        table += "document.getElementById('ism_pricerange_filter').value = '';";
        table += "document.getElementById('ism_element_filter').value = 'et_"+i+"';";
        table += 'get_element_data(1);">';
        table += tn[i][1];
        table += ' &#187</a>';
        table += '</h3></tr>';
        var j  = 0;
        $for (tables[i], function(key,value) {
            table += ('<tr class="ism_row_' + j % 2 + '">' + value + '</tr>');
            j++;
      });
    }
    table += '</table>';
    document.getElementById('ism_stat_filter_title').innerHTML = sn[stat];
    document.getElementById('ism_element_list').innerHTML = table;
}

// Sorts the stat_table by selecting a new stat_filter
function sort_stat_table(stat) {
    document.getElementById('ism_stat_filter').value = stat;
    get_element_data(1);

}

// Processes a request to add an element to a squad
function add_element(id) {
    if (ed[id] && !ed[id][_unavailable]) {
        var firstspot;
        var alreadychosen;

        // For transfer can't add a player we already have
        if (mode == 'transfer') {
            for (var i = 1; i <= squadsize; i++) {
                if (pd[i][_id] == id) {
                    alert(ed[id][_web_name] + " " + err_already_chosen);
                    return;
                }
            }
        }
        // Where Can we Put Element ?
        var type = ed[_element_type_id]
        var start = 1;
        var stop = 0;
        for (var i = 1; i <=ed[id][_element_type_id]; i++) { 
            var lasttype = i - 1;
            if (lasttype > 0) {start += mxs[lasttype];}
            stop += mxs[i];
        }
        // Make sure not already selected, have space
        for (var i = start; i <= stop; i++) {
            if (mode == 'selection') {
                if (document.getElementById("ism_selection_"+i).value < 1 && !firstspot) {
                    firstspot = i;
                }
            } 
            else if (mode == 'transfer') {
                if (document.getElementById("ism_selection_"+i).value == -1 && !firstspot) {
                    firstspot = i;
                }
            }
            if (document.getElementById("ism_selection_"+i).value == id) {
                alreadychosen = 1 
            }    
        }
        if (!firstspot) {
            alert(err_all_selected.replace(/%%position%%/,tn[ed[id][_element_type_id]][1]));
            return;
        }    
        if (alreadychosen) {
            alert(ed[id][_web_name] + " " + err_already_chosen);
            return;
        }
        document.getElementById("ism_selection_"+firstspot).value = id;
        if (document.getElementById("ism_purchase_price_"+firstspot)) {
            document.getElementById("ism_purchase_price_"+firstspot).value = ed[id][_now_cost];
        }
        draw_element(firstspot);
        validate_selection();
        if (current_view == 'element') switch_view(last_view);
    }
}

// Adds an element to the watch list
function add_element_watchlist(i) {
    
    if (document.getElementById("ism_selection_"+watch_list_max).value) {
        alert(err_watch_limit);
        return;
    }
    
    var newel = ed[i];
    if (!newel) { return; }
    
    var insert_at;
        
    for (var j=1; j<= watch_list_max; j++) {
        var thisel = document.getElementById("ism_selection_"+j).value;
        
        if (ed[thisel] && ed[thisel][_id] == i) {
            alert(err_watch_already);
            return;
        }            
        
        // Add if next element is empty, same type and later team or later type
        if ( 
        !ed[thisel] ||
        (  newel[_element_type_id] == ed[thisel][_element_type_id] &&
           newel[_team_id] < ed[thisel][_team_id] ) ||                  
        newel[_element_type_id] < ed[thisel][_element_type_id]) {
                    
            insert_at = j;
            break;
        
        }            
    }        
        
    for (var j = watch_list_max-1; j>=insert_at; j--) {
        var ne = j+1;
        var thisel = document.getElementById("ism_selection_"+j).value;
        if (thisel) {
            document.getElementById("ism_selection_"+ne).value = thisel;
            draw_element(ne);
        }                            
    }
        
    document.getElementById("ism_selection_"+insert_at).value = i;
    draw_element(insert_at);
    
    document.getElementById("ism_callback_image").style.visibility = 'visible';

}

// Processes request to remove an element from a squad
function remove_element(i) {
    if (i >= 1 && i <= squadsize) { 
        document.getElementById("ism_selection_"+i).value = '';
        if (document.getElementById("ism_purchase_price_"+i)) {
            document.getElementById("ism_purchase_price_"+i).value = 0;
        }
        draw_element(i);
        validate_selection();
    }    
}

// Processes request to remove an element from a watch list
function remove_element_watchlist(i) {

    if (i > watch_list_max || i < 1) { return; }
    
    if (i == watch_list_max) {
        document.getElementById("ism_selection_"+i).value = '';
        draw_element(i);    
        return;
    }

    for (var j = i; j < watch_list_max; j++) {
        var ne = j+1;
        var nextelval = document.getElementById("ism_selection_"+ne).value;
        if (nextelval) {
            document.getElementById("ism_selection_"+j).value = nextelval;
            draw_element(j);
        }
        else {
            document.getElementById("ism_selection_"+j).value = '';
            draw_element(j);
            break;
        }
    }
        
    document.getElementById("ism_selection_"+watch_list_max).value = '';
    draw_element(watch_list_max);       
    
    document.getElementById("ism_callback_image").style.visibility = 'visible'; 
            
}

// Processes request to cancel an element in transfer
function cancel_element(i) {
    if (i >= 1 && i <= squadsize) { 
        document.getElementById("ism_selection_"+i).value = -1;
        if (document.getElementById("ism_purchase_price_"+i)) {
            document.getElementById("ism_purchase_price_"+i).value = 0;
        }
        draw_element(i);
        validate_selection();
    }    
}

// Resets selection
function reset_selection() {
    for (var i = 1; i <= squadsize; i++) {
        document.getElementById("ism_selection_"+i).value = '';
        draw_element(i);
    }
    validate_selection();
}

// Validates selection
function validate_selection() {

    var valid = 1;
    var spent = 0;
    var errors = new Array;
    var teams = new Array;
    for (var i = 1; i <= numteams; i++) {teams[i] = 0;}
    var types = new Array;
    for (var i = 1; i <= numtypes; i++) {types[i] = 0;}
    var selected = new Array;

    var elcopy = new Array;
    var transfer_cash = 0;
    for (var i = 1; i <= squadsize; i++) {
        var id = document.getElementById("ism_selection_"+i).value;
        if (mode == 'transfer') {
            if (!id) {
                elcopy[i] = pd[i][_id];
            }
            else {
                transfer_cash += pd[i][_selling_price];
                if (ed[id]) {
                    elcopy[i] = id;
                }
            }    
        }
        else {
            elcopy[i] = id;
        }
    }
    if (!transfer_cash && mode == 'transfer') {
        errors[errors.length] = err_no_transfers;
        valid = 0;
    }
    
    var no_autocomplete =0;
    var has_incomplete_error = 0;
    for (var i = 1; i <= squadsize; i++) {        
        var id = elcopy[i];
        if (id < 1) {
            valid = 0;
            if (!has_incomplete_error) {
                errors[errors.length] = err_incomplete_squad;
                has_incomplete_error = 1;
            }
            continue;
        }
        if (!ed[id]) {
            valid = 0;
            continue;
        }
        if (mode == 'selection' || id != pd[i][_id]) {
            spent += ed[id][_now_cost];
        }    
        types[ed[id][_element_type_id]]++;
        teams[ed[id][_team_id]]++;
        if (selected[id] == 1) {
            errors[errors.length] = ed[id][_web_name] + " " + err_selected_twice;
            valid = 0;
        }
        selected[id] = 1;
    }
    for (var i = 1; i<= numtypes; i++) {
        if (types[i] != mxs[i]) {
            valid = 0;
        }
    }    
    for (var i = 1; i<= numteams; i++) {
        if (teams[i] > teamlimit) {
            errors[errors.length] = err_team_limit.replace('%%team%%',td[i][0]);
            valid = 0;
            no_autocomplete = 1;
        }
    }    
    var thistospend = mode == 'transfer' ?  bank + transfer_cash  - spent: tospend - spent;
    thistospend += 0.0001;
    thistospend = thistospend.toFixed(1);
    document.getElementById('ism_tospend').innerHTML = thistospend;
    if (thistospend < 0) {
        document.getElementById('ism_tospend').className = 'ism_spend_error';
        valid = 0;
        no_autocomplete = 1;
    }
    else {
        document.getElementById('ism_tospend').className = '';
    }
    if (errors.length) {
        document.getElementById('ism_errors').style.display = 'block';
        var txt = '';
        $for (errors,function(key,value) {
            txt += "<li>" + value + "</li>";
        });
        document.getElementById('ism_errors').innerHTML = txt;
    }
    else {
        document.getElementById('ism_errors').style.display = 'none';
        document.getElementById('ism_errors').innerHTML = '';
    }
   if (mode == 'selection') {
        if (valid) {
            document.getElementById('ism_callback').name = cb_add;
            document.getElementById('ism_callback_image').onclick = function () { this.style.visibility='hidden'; }
            document.getElementById('ism_callback_image').value = enter_text;
            document.getElementById('ism_callback_image').style.visibility = 'visible';
        }
        else {
            document.getElementById('ism_callback').name = cb_auto;
            document.getElementById('ism_callback_image').onclick = function () { autocomplete(); return false; }
            document.getElementById('ism_callback_image').value = auto_text;
            document.getElementById('ism_callback_image').style.visibility = no_autocomplete ? 'hidden' : 'visible';
        }
    }
    else if (mode == 'transfer') {
        document.getElementById('ism_make_transfers_button').style.visibility = valid ? 'visible' : 'hidden';
    }
}

// Wraps text to avoid corruption of display
function wrap_text(string){
    var char_old = '-';
    var char_new = '-<br />';
    var tmp_str = string.split(' ');
    var ret_testo;

    if (string.length < wrap_char) {return string;}

    for (var y=0;y<tmp_str.length;y++){                                // for each word without space
      var testo = '';
      if (tmp_str[y].length > wrap_char){
        if (tmp_str[y].indexOf(char_old) > -1){                        // if we have a letter like char_old, ie like the sign -
          tmp_str[y] = replace_string(tmp_str[y], char_old, char_new); // replace it with char_new
        } else {
          if(tmp_str[y].length > wrap_char+1){                         // if the word is greater than wrap_char+1
            for(var i=0; i<tmp_str[y].length; i++){                    // go letter by letter
              if ((i % wrap_char) == 0 && i > 0){ 
              // when reach the amount of letters as in "wrap_char" add char_new
                testo += char_new;  
              }
              testo += tmp_str[y].charAt(i);                           // add the letter to testo
            }
            tmp_str[y] = testo;
          }
        }
      } else {
        tmp_str[y] = tmp_str[y];
      }
      if (y == 0){
        ret_testo = tmp_str[y]+' ';
      } else {
        ret_testo += tmp_str[y]+' ';
      }
  }
  return (ret_testo);
}
function replace_string(in_txt, old_txt, new_txt) {
    return (in_txt.split(old_txt).join(new_txt));
}

// Drop a player from My Team
function drop(pos) {
    var has_subs = (play_size == squadsize ? 0 : 1);
    if (!has_subs) {return;}
    var e = ed[pos];
    if (document.getElementById("ism_selection_"+e[_id]).type == 'hidden') {
        return;
    }
    if (squadsize == 12) {
        var newe = ed[12];
        if (document.getElementById("ism_selection_"+newe[_id]).type == 'hidden') {
            return;
        }
        switch_players(pos,12);
    }
    else if (pos == 1) {
        var newe = ed[12];
        if (document.getElementById("ism_selection_"+newe[_id]).type == 'hidden') {
            alert(err_ms_goalkeeper);
            return;
        }
        switch_players(1,12);
    }
    else if (pos <= play_size) {
        if (num_dropped >= 3) return;
        if (manager_subs) {
            var valid = 0;
            for (var j = 13; j<= squadsize; j++) {
                if (document.getElementById("ism_selection_"+ed[j][_id]).type == 'checkbox') {
                    valid = 1;
                    break;
                }
            }
            if (!valid) {
                alert(err_ms_outfield);
                return;
            }
        }
        dropped[pos] = 1;
        num_dropped++;
    }    
    //global_changed = 1;
    draw_myteam();
}

// Reinstate a dropped player
function reinstate(pos) {
    if (dropped[pos]) {
        dropped[pos] = 0;
        num_dropped--;
    }    
    draw_myteam();
}

// Pick a sub to replace a dropped player
function pick(pos) {
    if (!num_dropped) return;
    if (pos < 13 || pos > squadsize) return;
    for (var i = 2; i <= play_size; i++) {
        if (dropped[i]) {
            dropped[i] = 0;
            switch_players(i,pos);
            num_dropped--;
            draw_myteam()
            break;
        }
    }
}

// Recalculate element array after switching players
function switch_players(out,sel) {
    if (document.getElementById("ism_selection_"+ed[out][_id]).type == 'hidden') {
        return;
    }
    if (document.getElementById("ism_selection_"+ed[sel][_id]).type == 'hidden') {
        return;
    }
    document.getElementById("ism_selection_"+ed[out][_id]).checked = false;
    document.getElementById("ism_selection_"+ed[sel][_id]).checked = true;
    var tempe = ed[sel];
    ed[sel] = ed[out]; // Out takes same sub position
    if (ed[sel][_element_type_id] == tempe[_element_type_id]) { // Direct Swap
        ed[out] = tempe;
        global_changed = 1;
        return;
    }    
    // Have to re-order
    var newed = new Array();
    var newdropped = new Array();
    var changed = 0;
    var j = 1;
    for (var i = 1; i <= squadsize; i++) {
        if (i == out) continue;
        // j check for case when changing from no strikers
        if (!changed && (ed[i][_element_type_id] == tempe[_element_type_id] || j == play_size)) {
            newed[j] = tempe;
            newdropped[j] = 0;
            changed = 1;
            j++;
        }
        newed[j] = ed[i];
        newdropped[j] = dropped[i];
        j++;
    }    
    ed = newed;
    dropped = newdropped;
    global_changed = 1;
}

// My team back to original state
function reset_myteam() {
    global_changed = 0;
    num_dropped = 0;
    document.getElementById("ism_captain").value = captain_original;
    $for (ed_original, function(key,value) { ed[key] = value;});
    for (var i = 1; i <= squadsize; i++) {
        var val = i <= play_size ? true : false;
        document.getElementById("ism_selection_"+ed[i][_id]).checked = val;
        if (dropped[i]){dropped[i] = 0;}
    }
    draw_myteam();
}

// If valid changes and not confirmed - check
function checkout() {
    if (!document.getElementById || !document.getElementById('ism_myteam_form')) return;
    if (global_changed && !num_dropped) {
      return confirm_txt;
    }
}

// Draw the graphical and data views
function draw_myteam() {
    var shared_ism = typeof(ISMFG) == 'undefined' ? 0 : 1;
    var has_subs = (play_size == squadsize ? 0 : 1);
    var type_count = new Array;
    for (var i = 2; i <= numtypes; i++) {
        type_count[i-2] = 0;
    }
    for (var i = 1; i <= squadsize; i++) {
        document.getElementById("ism_selection_"+ed[i][_id]).style.display='none';
        if (!manager_subs) {
        document.getElementById("ism_xselection_"+ed[i][_id]).style.display='none';
        }
        var playing;
        var form_el = document.getElementById("ism_selection_"+ed[i][_id]);
        if (form_el.type == 'hidden') {
            playing = form_el.value;
        }
        else {
            playing = form_el.checked ? 1 : 0;
        }
        if (playing > 0) {
            if (ed[i][_element_type_id] != 1) {
                type_count[ed[i][_element_type_id] - 2]++;
            }
        }
    }
    var formation = type_count.join('');
    var grid = new Array;
    if (typeof(jsgrid) != 'undefined') {
        grid = jsgrid;
    }
    else {
        grid[0] = [0,0,0,0,0,0];
        grid[1] = [0,0,0,1,0,0];
        if (formation == '253') {
            grid[grid.length] = [0,0,2,0,3,0];
            grid[grid.length] = [0,4,5,6,7,8];
            grid[grid.length] = [0,9,0,10,0,11];
        }
        else if (formation == '352') {
            grid[grid.length] = [0,0,2,3,4,0];
            grid[grid.length] = [0,5,6,7,8,9];
            grid[grid.length] = [0,0,10,0,11,0];
        }
        else if (formation == '343') {
            grid[grid.length] = [0,0,2,3,4,0];
            grid[grid.length] = [0,5,6,0,7,8];
            grid[grid.length] = [0,0,9,10,11,0];
        }
        else if (formation == '451') {
            grid[grid.length] = [0,2,3,0,4,5];
            grid[grid.length] = [0,6,7,8,9,10];
            grid[grid.length] = [0,0,0,11,0,0];
        }
        else if (formation == '442') {
            grid[grid.length] = [0,2,3,0,4,5];
            grid[grid.length] = [0,6,7,0,8,9];
            grid[grid.length] = [0,0,10,0,11,0];
        }
        else if (formation == '433') {
            grid[grid.length] = [0,2,3,0,4,5];
            grid[grid.length] = [0,0,6,7,8,0];
            grid[grid.length] = [0,9,0,10,0,11];
        }
        else if (formation == '532') {
            grid[grid.length] = [0,2,3,4,5,6];
            grid[grid.length] = [0,7,0,8,0,9];
            grid[grid.length] = [0,0,10,0,11,0];
        }
        else if (formation == '523') {
            grid[grid.length] = [0,2,3,4,5,6];
            grid[grid.length] = [0,0,7,0,8,0];
            grid[grid.length] = [0,9,0,10,0,11];
        }
        else if (formation == '541') {
            grid[grid.length] = [0,2,3,4,5,6];
            grid[grid.length] = [0,7,8,0,9,10];
            grid[grid.length] = [0,0,0,11,0,0];
        }
        else if (formation == '550') {
            grid[grid.length] = [0,2,3,4,5,6];
            grid[grid.length] = [0,7,8,9,10,11];
            grid[grid.length] = [0,0,0,0,0,0];
        }
        if (squadsize == 15) {
            grid[5] =  [0,0,12,13,14,15];
        }
        else if (squadsize == 12) {
            grid[5] =  [0,0,0,0,0,12];
        }
    }
    var captain  = document.getElementById("ism_captain").value; // id of player who is captain
    if (captain != captain_original) global_changed = 1;
    var captain_strategy  = document.getElementById("ism_captain_strategy").value; // id of player who is captain
    if (typeof(captain_strategy_original) != 'undefined') {
        if (captain_strategy != captain_strategy_original) global_changed = 1;
    }
    for (var i = 1; i <= numtypes + has_subs; i++ ) {
        for (var j = 1; j <= 5; j++) {
            if (!document.getElementById("ism_selection_"+i+"-"+j)) {continue;}
            if (grid[i][j]) { // We need to write a player here
                var p = grid[i][j];
                var e = ed[p];
                var form_el_type = document.getElementById("ism_selection_"+e[_id]).type;
                document.getElementById("ism_selection_"+i+"-"+j).style.visibility = 'visible';
                if (dropped[p]) { // Player has been dropped
                    document.getElementById("ism_selection_"+i+"-"+j+"_shirt").src = si[0].src;
                    document.getElementById("ism_selection_"+i+"-"+j+"_shirt").title = si[0].alt;
                    document.getElementById("ism_selection_"+i+"-"+j+"_action").href = 'javascript:reinstate('+p+');';
                    if (!manager_subs) {
                    document.getElementById("ism_data"+"_"+p+"_action").href = 'javascript:reinstate('+p+');';
                    }
                    document.getElementById("ism_selection_"+i+"-"+j+"_action_image").src=image_out_canc.src;
                    if (!manager_subs) {
                    document.getElementById("ism_data_"+p+"_action_image").src=image_out_canc.src;
                    }
                    document.getElementById("ism_selection_"+i+"-"+j+"_name").className = 'ism_dropped';
                    if (!manager_subs) {
                    document.getElementById("ism_data_"+p+"_name").className = 'ism_dropped';
                    }
                } 
                else { // Write shirt
                    if (e[_element_type_id] == 1) {
                        document.getElementById("ism_selection_"+i+"-"+j+"_shirt").src = gsi[e[_team_id]].src;
                    } else {
                        document.getElementById("ism_selection_"+i+"-"+j+"_shirt").src = si[e[_team_id]].src;
                    }
                    document.getElementById("ism_selection_"+i+"-"+j+"_shirt").title = si[e[_team_id]].alt;
                    document.getElementById("ism_selection_"+i+"-"+j+"_name").className = '';
                    document.getElementById("ism_data_"+p+"_name").className = '';
                    if (p <= play_size) { // Is currently a starter
                        if ( has_subs && (num_dropped < 3 || e[_element_type_id] == 1) && e[_id] != captain && (squadsize != 12 || e[_element_type_id] != 1) && form_el_type == 'checkbox') { // Can be dropped
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").href = 'javascript:drop('+p+');';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").href = 'javascript:drop('+p+');';
                            }
                            document.getElementById("ism_selection_"+i+"-"+j+"_action_image").src=image_out.src;
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action_image").src=image_out.src;
                            }
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").style.display = 'inline';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").style.display = 'inline';
                            }
                        } 
                        else { // Can't be dropped
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").style.display = 'none';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").style.display = 'none';
                            }
                        }
                    }
                    else { // Is currently a sub
                        //document.getElementById("ism_selection_"+i+"-"+j+"_stat").innerHTML = wrap_text(tn[e[_element_type_id]][0]);
                        if (!manager_subs) {
                        $("#ism_selection_"+i+"-"+j+"_stat").html( wrap_text(tn[e[_element_type_id]][0]));
                        }
                        if (num_dropped && e[_element_type_id] > 1 && form_el_type == 'checkbox') { // Can be added
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").href = 'javascript:pick('+p+');';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").href = 'javascript:pick('+p+');';
                            }
                            document.getElementById("ism_selection_"+i+"-"+j+"_action_image").src=image_in.src;
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action_image").src=image_in.src;
                            }
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").style.display = 'inline';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").style.display = 'inline';
                            }
                        }
                        else { // Can't be added
                            document.getElementById("ism_selection_"+i+"-"+j+"_action").style.display = 'none';
                            if (!manager_subs) {
                            document.getElementById("ism_data_"+p+"_action").style.display = 'none';
                            }
                        }
                    }    
                }
                var el_link = shared_ism ? e[_id] : p;
                document.getElementById("ism_selection_"+i+"-"+j+"_info_link").href = 'javascript:draw_element_view('+el_link+')';
                document.getElementById("ism_data_"+p+"_info_link").href = 'javascript:draw_element_view('+el_link+')';
                if (e[_doubtful]) {
                    document.getElementById("ism_selection_"+i+"-"+j+"_info_image").src = infoposs_image.src;
                    document.getElementById("ism_data_"+p+"_info_image").src = infoposs_image.src;
                }
                else if (e[_news]) {                
                    document.getElementById("ism_selection_"+i+"-"+j+"_info_image").src = infowarn_image.src;
                    document.getElementById("ism_data_"+p+"_info_image").src = infowarn_image.src;
                }    
                else {
                    document.getElementById("ism_selection_"+i+"-"+j+"_info_image").src = info_image.src;
                    document.getElementById("ism_data_"+p+"_info_image").src = info_image.src;
                }
                var dti = document.getElementById("ism_selection_"+i+"-"+j+"_dreamteam_image");
                var dtid = document.getElementById("ism_data_"+p+"_dreamteam_image")
                if (e[_in_dreamteam]) {
                    if (dti && dtid) {
                        dti.style.display='inline';
                        dtid.style.display='inline';
                    }
                }
                else {
                    if (dti && dtid) {
                        dti.style.display='none';
                        dtid.style.display='none';
                    }
                }
                document.getElementById("ism_selection_"+i+"-"+j+"_info_image").style.display='inline';
                document.getElementById("ism_data_"+p+"_info_image").style.display = 'inline';
                //document.getElementById("ism_selection_"+i+"-"+j+"_name").innerHTML = wrap_text(e[_web_name]);
                var pitch_name = wrap_text(e[_web_name]);
                if (manager_subs && e[_id] == captain) {
                    pitch_name = pitch_name + ' (C)';
                }
                $("#ism_selection_"+i+"-"+j+"_name").html(pitch_name);                
                var data_name = e[_web_name];
                if (manager_subs) {
                    var ev_total = e[_event_total] ? e[_event_total] : 0;
                    $("a#ism_points_scored_"+i+"-"+j).attr('title',$("#ism_title_"+e[_id]).val());
                    $("a#ism_points_scored_"+i+"-"+j).html(ev_total+'');
                }
                else if (e[_id] == captain) {
                    data_name += " (C)";
                    //document.getElementById("ism_selection_"+i+"-"+j+"_stat").innerHTML = '(C)';
                    $("#ism_selection_"+i+"-"+j+"_stat").html('(C)');
                }
                else if (p <= play_size)  {
                    //document.getElementById("ism_selection_"+i+"-"+j+"_stat").innerHTML = '';
                    $("#ism_selection_"+i+"-"+j+"_stat").html('');
                }
                //document.getElementById("ism_data_"+p+"_name").innerHTML = data_name;
                $("#ism_data_"+p+"_name").html(data_name);
                $for (es, function(key,value) {
                    //document.getElementById("ism_data_"+p+"-"+key+"-stat").innerHTML = eval("e[_"+value+"]");
                    var stat_val = eval("e[_"+value+"]");
                    if (!stat_val) {
                        stat_val = '-';
                    }
                    $("#ism_data_"+p+"-"+key+"-stat").html(stat_val);
                    //document.getElementById("ism_data_"+p+"-"+key+"-stat").className = dropped[p] ? 'dropped' : ''
                });
            }
            else { // No player to display
                document.getElementById("ism_selection_"+i+"-"+j).style.visibility = 'hidden';
            }
        }
    }
    // Write captain option list
    var cap = document.getElementById("ism_captain");
    if (cap.options) {
    cap.options.length = 0;
    var j = 0;
    for (var i = 1; i <= play_size; i++) {
        if (document.getElementById("ism_team_played_"+ed[i][_team_id]) && ed[i][_id] != captain_original) continue;
        var o = new Option;
        o.value = ed[i][_id];
        o.text = ed[i][_web_name];
        if (dropped[i]) {
            o.className = 'ism_dropped';
            o.disabled = true;
        }    
        cap.options[j] = o;
        if (ed[i][_id] == captain) cap.options[j].selected = true;
        j++;
    }
    }
    document.getElementById("ism_team_changes_button").style.visibility = !num_dropped && global_changed ? 'visible' : 'hidden';
    if (!manager_subs) {
    document.getElementById("ism_subsorder").style.display = global_changed ? 'none' : 'block';
    }
}

// Draws the element view
function draw_element_view(id) {

    document.getElementById('ism_element_view_name').innerHTML = ed[id][_web_name];
    if (document.getElementById('ism_element_image')) {
        // Up to the game to declare this function
        document.getElementById('ism_element_image').src =
        element_image(ed[id]);
    }
    if (live) {
        document.getElementById('ism_element_iframe').src = '/'+defview+'/'+ed[id][_id]+'.html'
    }
    else {
        document.getElementById('ism_element_iframe').src = '/M/iframe.mc?elid='+ed[id][_id]+'&elview='+defview;
    }
    $for (eshow, function(key,value) {
        if (value == 'position') {
            document.getElementById('ism_element_stat_'+key).innerHTML = tn[ed[id][_element_type_id]][0];
        } 
        else if (value == 'team_name') {
            document.getElementById('ism_element_stat_'+key).innerHTML = td[ed[id][_team_id]][0];
        } 
        else {
            document.getElementById('ism_element_stat_'+key).innerHTML = eval("ed[id][_"+value+"]");
        }    
    });
    $for (eshowp, function(key,value) {
        if (value == 'event_total' || value == 'total') {
            document.getElementById('ism_element_stat_x_'+key).innerHTML = 
            eval("ed[id][_"+value+"]");
        } 
        else {
            document.getElementById('ism_element_stat_p_'+key).innerHTML = eval("ed[id][_"+value+"]");
            if (ex[id] && ex[id][value]) {
                document.getElementById('ism_element_stat_x_'+key).innerHTML = ex[id][value];
            }
            else {
                document.getElementById('ism_element_stat_x_'+key).innerHTML = '';
            }
        }    
    });    

    // Code to provide add / delete watch list functionality
    if (logged_in && document.getElementById('ism_button_add_wl')) {
        $('#ism_button_add_wl').hide();
        $('#ism_button_del_wl').hide();
        $('#ism_wl_too_many').hide();
        $('#ism_wl_text').hide();
        var found = 0;
        $for (wl, function(key,value) {
            if (value == ed[id][_id]) {
                var params = {};                
                params[$('#ism_button_del_wl').children("input[@type=hidden]").attr('name')] = ed[id][_id];
                $('#ism_button_del_wl').children("input[@type=button]").unbind();
                $('#ism_button_del_wl').children("input[@type=button]").click(
                    function() {
                        $.post("/M/ajax", params,
                        function(data) {
                            wl.splice(key,1);
                            $('#ism_button_del_wl').hide();
                            if ($('#ism_element_filter').val() == 'watchlist') {
                                get_element_data();
                            }
                        }
                        );
                    }
                );
                $('#ism_button_del_wl').show();
                found = 1;
                return 'break;';
            }
        });
        if (!found) {
            if ( wl.length >= watch_list_max) {
                $('#ism_wl_too_many').show();
            } 
            else {
                var params = {};                
                params[$('#ism_button_add_wl').children("input[@type=hidden]").attr('name')] = ed[id][_id];
                $('#ism_button_add_wl').children("input[@type=button]").unbind();
                $('#ism_button_add_wl').children("input[@type=button]").click(
                    function() {
                        $.post("/M/ajax", params,
                        function(data) {
                            wl.splice(0,0,ed[id][_id]);
                            $('#ism_button_add_wl').hide();
                            $('#ism_wl_text').show();    
                            if ($('#ism_element_filter').val() == 'watchlist') {
                                get_element_data();
                            }
                        }
                        );
                    }
                );
                $('#ism_button_add_wl').show();
            }
        }
    }

    open_ism_window('ism_element_view');
}

// Switch views
function switch_view(view) {

    // See what view has been used as default
    if (!current_view) {
        if (document.getElementById('ism_graphical_view')) {
            current_view = 'graphical';
        }
        else if (document.getElementById('ism_data_view')) {
            current_view = 'data';
        }
    }   
    
    if (view == 'data') {
        if (document.getElementById('ism_graphical_view')) {
            document.getElementById('ism_graphical_view').style.display =
            'none';
        }
        document.getElementById('ism_data_view').style.display = 'block';
        document.getElementById('ism_tab_data').className = 'ism_active_tab';
        document.getElementById('ism_tab_graphical').className = '';
        last_view = current_view;
        current_view = 'data';
    }

    else if (view == 'graphical') {
        if (document.getElementById('ism_data_view')) {
            document.getElementById('ism_data_view').style.display =
            'none';
        }
        document.getElementById('ism_tab_graphical').className = 'ism_active_tab';
        document.getElementById('ism_tab_data').className = '';
        document.getElementById('ism_graphical_view').style.display = 'block';
        last_view = current_view;
        current_view = 'graphical';
    }
    focus();

}

function player_view() {
    document.getElementById('ism_fixture_view').style.display = 'none';
    document.getElementById('ism_player_view').style.display = 'block';
}

function fixture_view() {
    document.getElementById('ism_player_view').style.display = 'none';
    document.getElementById('ism_fixture_view').style.display = 'block';
}

function confirm_submit(message,button) {
    button.style.visibility  = 'hidden';
    if (confirm(message)) {
        return true;
    }
    else {            
        button.style.visibility = 'visible';
        return false;
    }    
}

function open_ism_window(window_id) {
    document.getElementById(window_id).style.display='block'    
}

function close_ism_window(window_id) {
    document.getElementById(window_id).style.display='none'
}

function draw_kit(kit_part, colour_id) {

    if (!document.getElementById) return;

    var selection_form = document.forms['ism_selection_form'];
    var colour_form = eval("selection_form."+kit_part);
    for (var i=0;i < colour_form.length;i++){
        if ( colour_form[i].checked == true ) {
            colour_id = i;
            break;
        }
    }
    
    switch (kit_part) {

        case 'shirtbody':

            var stripe_colour;
            for (var i=0;i < selection_form.shirtstripes.length;i++){
                if ( selection_form.shirtstripes[i].checked==true ) {
                    stripe_colour = i;
                    break;
                }
            }
            var shirt_colour = colour_id + '' + stripe_colour;
            var shirt =  new Image();
            shirt.src = shirt_img_dir + "/shirt" + shirt_colour + ".gif";
            document.getElementById('ism_kit_shirt_img').src = shirt.src;

            break;

        case 'shirtstripes':

            var body_colour;
            for (var i=0;i < selection_form.shirtbody.length;i++){
                if ( selection_form.shirtbody[i].checked==true ) {
                    body_colour = i;
                    break;
                }
            }
            var shirt_colour = colour_id + '' + body_colour;
            var shirt =  new Image();
            shirt.src = shirt_img_dir + "/shirt" + shirt_colour + ".gif";
            document.getElementById('ism_kit_shirt_img').src = shirt.src;

            break;

        case 'shirtsleeves':

            var lsleeve =  new Image();
            lsleeve.src = shirt_img_dir + "/lsleeve" + colour_id + ".gif";
            document.getElementById('ism_kit_lsleeve_img').src = lsleeve.src;

            var rsleeve =  new Image();
            rsleeve.src = shirt_img_dir + "/rsleeve" + colour_id + ".gif";
            document.getElementById('ism_kit_rsleeve_img').src = rsleeve.src;

            break;

        case 'shorts':

            var shorts =  new Image();
            shorts.src = shirt_img_dir + "/short" + colour_id + ".gif";
            document.getElementById('ism_kit_shorts_img').src = shorts.src;

            break;

        case 'socks':

            var socks =  new Image();
            socks.src = shirt_img_dir + "/socks" + colour_id + ".gif";
            document.getElementById('ism_kit_socks_img').src = socks.src;

            break;

    }
}

function autocomplete(){
    //
    var filter = _now_cost;

    // Take local copies which can be manipulated to help with autocomplete
    var element_ids_by_type_local = new Array();
    var tospend_local = tospend;

    var errors = new Array();

    var number_of_teams_selected = new Array();
    for (var i = 1; i <= numteams; i++) number_of_teams_selected[i] = 0;

    var number_of_types_needed = new Array();
    for (var i = 1; i <= numtypes; i++) {
        number_of_types_needed[i] = min_element_selected_by_type[i];
    }

    var elements_needed = squadsize;

    var element_selected = new Array();
    var position_selected = new Array();

    var weighted_avg_element_cost_by_type = new Array;;

    // Consider what we already have
    for (var i = 1; i <= squadsize; i++) {
        var element_id = document.getElementById("ism_selection_"+i).value;
        if (ed[element_id]) {
            var element = ed[element_id];
            tospend_local -= element[_now_cost];
            number_of_types_needed[element[_element_type_id]]--;
            number_of_teams_selected[element[_team_id]]++;
            element_selected[element[_id]] = 1;
            position_selected[i] = 1;
            elements_needed--;
        }
    }
    if (elements_needed < 1) return;

    // Randomize and filter the element list
    for (var i = 1; i <= numtypes; i++) {
        element_ids_by_type_local[i] = element_ids_by_type[i];
        element_ids_by_type_local[i] = randarray(element_ids_by_type_local[i]);
        element_ids_by_type_local[i] = sortarray(element_ids_by_type_local[i],filter);
        weighted_avg_element_cost_by_type[i] = avg_element_cost_by_type[i];
    }

    var average_spend = 0; // If we bought average this is what it would cost
    for (var i = 1; i <= numtypes; i++) {
        if (number_of_types_needed[i] < 1) continue;
        average_spend += (weighted_avg_element_cost_by_type[i] * number_of_types_needed[i]);
    }

    for (var i = 1; i <= numtypes; i++) {
        if (number_of_types_needed[i] < 1) continue;
        weighted_avg_element_cost_by_type[i] = avg_element_cost_by_type[i] * (tospend_local / average_spend);
    }

    var type_needed = 0;
    var adjust = 0;
    for (var i = 1; i <= squadsize; i++) {
        if (position_selected[i]) continue;
        // Find what type we need
        for (var j = 1; j <= numtypes; j++){
            if (number_of_types_needed[j] > 0){
                type_needed = j;
                break;
            }
        }
        var maxcost = (weighted_avg_element_cost_by_type[type_needed] + adjust);

        $for (element_ids_by_type_local[type_needed],function(key,value) {

            var element = ed[value];

            // Reasons why we can't choose this Element
            if (element[_now_cost] > tospend_local) return;
            if (element[_now_cost] > maxcost) return;
            if (element[_unavailable] != 0) return;
            if (element[_news] != 0) return;
            if (number_of_teams_selected[element[_team_id]] >= teamlimit) return;
            if (element_selected[element[_id]]) return;

            // This is the one
            element_selected[element[_id]] = 1;
            number_of_teams_selected[element[_team_id]]++;
            number_of_types_needed[element[_element_type_id]]--;
            tospend_local -= element[_now_cost];
            add_element(element[_id]);

            //adjust if we spent less than our maxcost
            adjust = (maxcost - element[_now_cost]);
            return 'break;';
        });
    }
}

function randomiser(numb) {
  var random = Math.round(Math.random()*numb);
  return random;
}

function randarray(arr){
  var randNum;
  var tempNum;
  for (var i = arr.length-1; i>=0 ; i--){
    randNum = randomiser(i);
    tempNum = arr[i];
    arr[i] = arr[randNum];
    arr[randNum] = tempNum;
  }
  return arr;
}

function sortarray(arr,fi){
    var edsort = new Array();
    var filt = fi ? fi : _now_cost;
    $for (arr.sort(function(a,b) {return ed[b][filt] - ed[a][filt];}), function(key,value) {
       edsort[edsort.length] = arr[key];
      });
    return edsort;
}

function change_tour(clo,ope) {
    var tour_close = document.getElementById("ism_tour_"+clo);
    var tour_open =  document.getElementById("ism_tour_"+ope);
    if (tour_close) {
        tour_close.style.display = 'none';
    }
    if (tour_open) {
        tour_open.style.display = 'block';
    }
}

// Functions related to predictor games ##################################

function draw_predictions() {
    var has_prediction = new Array;
    $for (fids, function(key,value) {
        var fix = value;
        $for (prediction_types, function(key2,value2) {
            var ty = value2;
            var choice = eval("document.predictions.fixture_"+fix+'_'+ty);
            if (choice) {
                for (var i = 0; i < choice.length; i++) {
                    choice[i].style.display = 'none';
                    var val = choice[i].value;
                    var lnk =
                    document.getElementById("ism_p_flink_"+fix+'_'+ty+"_"+val);
                    var img =
                    document.getElementById("ism_p_fimage_"+fix+'_'+ty+"_"+val);
                    lnk.style.display = 'inline';
                    if (choice[i].checked) {
                        img.src = ball_on.src;
                        lnk.onclick = '';
                        lnk.onmouseover = '';
                        lnk.onmouseout = '';
                        has_prediction[fix+'_'+ty] = 1;
                    }                    
                    else {                
                        img.src = no_selection.src;
                        lnk.onclick=function() {choice_select(this.id);};
                        lnk.onmouseover=function() {choice_mouse_over(this.id);};
                        lnk.onmouseout=function() {choice_mouse_out(this.id);};
                    }
                }            
            }
            // Multiple jokers
            var key = fix+'_'+ty;
            var joker = eval("document.predictions.joker_"+key);
            if (joker) {
                joker.style.display = 'none';
                var lnk = document.getElementById("ism_p_jlink_"+key);
                var img = document.getElementById("ism_p_jimage_"+key);
                lnk.style.display = 'block';
                if (has_prediction[key]) {
                    img.style.visibility = 'visible';
                    if (joker.checked) {
                        img.src = joker_on.src;
                        lnk.onclick=function() {joker_select_multi(this.id);};
                        lnk.onmouseover = '';
                        lnk.onmouseout = '';
                    }
                    else {
                        img.src = no_selection_joker.src;
                        lnk.onclick=function() {joker_select_multi(this.id);};
                        lnk.onmouseover=function() {joker_mouse_over(this.id);};
                        lnk.onmouseout=function() {joker_mouse_out(this.id);};
                    }
                }
                else {
                    img.style.visibility = 'hidden';
                }
            }
        });    
    });
    var joker = document.predictions.joker;
    if (joker) {        
        for (var i = 0; i < joker.length; i++) {
            joker[i].style.display = 'none';
            var val = joker[i].value;
            var lnk = document.getElementById("ism_p_jlink_"+val);
            var img = document.getElementById("ism_p_jimage_"+val);
            lnk.style.display = 'block';
            if (has_prediction[val]) {
                img.style.visibility = 'visible';
                if (joker[i].checked) {
                    img.src = joker_on.src;
                    lnk.onclick = '';
                    lnk.onmouseover = '';
                    lnk.onmouseout = '';
                }
                else {
                    img.src = no_selection_joker.src;
                    lnk.onclick=function() {joker_select(this.id);};
                    lnk.onmouseover=function() {joker_mouse_over(this.id);};
                    lnk.onmouseout=function() {joker_mouse_out(this.id);};
                } 
            }
            else {
                img.style.visibility = 'hidden';
            }
        }
    }
    document.predictions.onsubmit = function() { return check_jokers();};   
}

function choice_select(selection) {
    var selections = parse_choice(selection);
    var choice =
    eval("document.predictions.fixture_"+selections[0]+"_"+selections[1]);
    for (var i = 0; i < choice.length; i++) {
        if (choice[i].value == selections[2]) {
            choice[i].checked = true;
            break;
        }
    }
    jQuery('#saved_txt').hide();
    draw_predictions();
}

function choice_mouse_over(selection) {
    var selections = parse_choice(selection);
    var img = document.getElementById("ism_p_fimage_"+selections[0]+"_"+selections[1]+"_"+selections[2]);
    img.src=ball_off.src;
}

function choice_mouse_out(selection) {
    var selections = parse_choice(selection);
    var img = document.getElementById("ism_p_fimage_"+selections[0]+"_"+selections[1]+"_"+selections[2]);
    img.src=no_selection.src;
}

function parse_choice(selection) {
    var re = /^ism_p_flink_(\d+)_(\d+)_(\d+)$/;
    var matches = re.exec(selection);
    var fix = matches[1];
    var typ = matches[2];
    var val = matches[3];
    return [fix,typ,val];
}

function joker_select(selection) {
    var selections = parse_joker(selection);
    var jokers = document.predictions.joker;
    for (var i = 0; i < jokers.length; i++) {
        if (jokers[i].value == selections[0]+'_'+selections[1]) {
            jokers[i].checked = true;
            break;
        }
    }
    jQuery('#saved_txt').hide();
    draw_predictions();
}

function joker_select_multi(selection) {
    var selections = parse_joker(selection);
    var code = selections[0]+'_'+selections[1];
    var joker = eval("document.predictions.joker_"+code);
    if (joker.checked) {
        joker.checked = false;
    }
    else {
        var num_jokers = 0;
        $for (fids, function(key,value) {
            var fix = value;
            $for (prediction_types, function(key2,value2) {
                var ty = value2;
                var this_code = fix+'_'+ty;
                var this_joker = eval("document.predictions.joker_"+this_code);
                if (this_joker) {
                    if (this_joker.checked) num_jokers++;
                }
            });
        });
        if (num_jokers < jokers) {
            joker.checked = true;
        }
        else {
            alert(joker_error);
        }
    }
    jQuery('#saved_txt').hide();
    draw_predictions();
}

function joker_mouse_over(selection) {
    var selections = parse_joker(selection);
    var img =
    document.getElementById("ism_p_jimage_"+selections[0]+'_'+selections[1]);
    img.src=joker_off.src;
}

function joker_mouse_out(selection) {
    var selections = parse_joker(selection);
    var img = 
    document.getElementById("ism_p_jimage_"+selections[0]+'_'+selections[1]);
    img.src=no_selection_joker.src;
}

function parse_joker(selection) {
    var re = /^ism_p_jlink_(\d+)_(\d+)$/;
    var matches = re.exec(selection);
    var fix = matches[1];
    var typ = matches[2];
    return [fix,typ];
}

function check_jokers() {
    var num_jokers = 0;
    $for (fids, function(key,value) {
        var fix = value;
        $for (prediction_types, function(key2,value2) {
            var ty = value2;
            var code = fix+'_'+ty;
            var joker = eval("document.predictions.joker_"+code);
            if (joker) {
                if (joker.checked) num_jokers++;
            }
        });
    });
    if (num_jokers < jokers) {
        alert(joker_submit);
        return false; 
    }
    else {
        return true;
    }
}

function view_prediction_graphs(fix,type) {

    if (!type) {type = 1;}
    if (document.getElementById) {
        //var pie =  new Image();
        //pie.src = "/M/graph.mc?"+pie_callback+"="+fix+'_'+type;
        //document.getElementById('ism_p_pie').src = pie.src;
        var line = new Image();
        line.src = "/M/graph.mc?"+line_callback+"="+fix+'_'+type;
        document.getElementById('ism_p_line').src= line.src;
        document.getElementById('ism_p_graph_title').innerHTML = teams[fixture_map[fix][0]] + " - " + teams[fixture_map[fix][1]] +
        extra_title;
        document.getElementById('ism_legend_guide').innerHTML = legends[type]['name'];
        document.getElementById('ism_legend_1').innerHTML = legends[type][1];
        document.getElementById('ism_legend_2').innerHTML = legends[type][2];
        document.getElementById('ism_legend_3').innerHTML = legends[type][3];
        //alert('Graph');
        document.getElementById('ism_p_graphs').style.display = 'block';
    }

}

function show_p_form(fix) {
    var myRow = $('#ism_p_form_'+fix);
    if (myRow.is(':visible')) {
        myRow.hide();
        return;        
    }
    $('.ism_p_form').hide();
    var myRow = $('#ism_p_form_'+fix);
    $.get('/M/predform.mc?fix='+fix,
        function(data) {
            myRow.children('td').html(data);
            myRow.show();
        }
    );
}


function show_form(id) {
    var myRow = $('#elid_'+id).parent();
    // Do we already have data?
    var already_have = 0;
    myRow.next('.ism_player_form').each(function(i) {
        if ($(this).is(':visible')) {
          $('.ism_player_form').hide(); // hide them all
        } 
        else if (!already_have){
          $('.ism_player_form').hide(); // hide them all
          $(this).show();
        }
        already_have = 1;
    });

    if (already_have) {
        return;
    }
    $('.ism_player_form').hide(); // hide them all
    if (live) {
        $.get("/profiles/form_"+id+".html",
            function(data){
                myRow.after(data);
            }
        );
    }
    else {
        $.post("/M/element_form.mc",
            { id: id },
            function(data){
                myRow.after(data);
            }
        );
    }

}
