Template:AjaxVoter

    Inhaltsverzeichnis
    keine Gliederung

    Version seit 17:17, 21 Nov 2024

    zu dieser Version.

    Zurück zu Versionshistorie.

    Zeige aktuelle Version

    <input type="hidden" id=('TheProperty_' ..@id) value=($0 ?? $name ?? 'voter') />
    <input type="hidden" id=('pageApi_' ..@id) value=($1 ?? $pageid ?? wiki.getpage(page.id).api) />
    <input type="hidden" id=('CurUserID_' ..@id) value=(user.id) />
    <input type="hidden" id=('UniqueId_' ..@id) value=($2 ?? $voterid ?? '') />
    
    var scoretype = ($3 ?? $scoring ?? 'sum');
    if(scoretype != 'sum' && scoretype != 'percent') {let scoretype = 'sum'}
    <input type="hidden" id=('Scoring_' ..@id) value=(scoretype) />
    
    if(($3 ?? $voterid ?? '') == '') {
        <p>    
            'Template:AjaxVoter (ERROR):  The $voterid Parameter MUST have a value and should be unique amongst all the AjaxVoters on this page.';
        </p>
    } else {
    
    <table>
    <tr>
    <td style="padding:0px; border:1px solid black; min-width:75px; width:75px">
    <div id=('voter-container_' ..@id) style="padding-bottom:5px">
        <div id=('vote-results-container_' ..@id)>
            <div id=('vote-results-percent_' ..@id) style="font-size:.8em;font-weight:bold;margin:auto;text-align:center"/>
            <div id=('vote-results_' ..@id) style="font-size:1.5em;font-weight:bold;margin:auto;text-align:center"/>
            <div id=('vote-loading_' ..@id) style="margin:auto;width:16px;height:16px;background-repeat: no-repeat; background-image:url('/skins/common/icons/anim-wait-circle.gif');" />
        </div>
        <div id=('results-footer_' ..@id) style="font-weight:bold;font-size:.8em;text-align:center;"></div>
        <div id=('icon-wrap_' ..@id) style="text-align:center;">
            if(!user.anonymous) {
                <a href="#" id=('down_val_' ..@id)><img src="http://developer.mindtouch.com/@api/deki/files/5005/=Thumbs_downSQ.png" style="height:24px;width:24px;" /></a>
                <a href="#" id=('up_val_' ..@id)><img src="http://developer.mindtouch.com/@api/deki/files/5004/=Thumbs_upSQ.png" style="height:24px;width:24px;" /></a>        
            }
            else 'Login to Vote';
        </div>
    </div>
    </td>
    </tr>
    </table>
    }
    <html><head>
    
    //    <link rel="stylesheet" type="text/css" href="" />
    //    <script type="text/javascript" src="" />
    
        <script type="text/javascript">"
    
            $(document).ready(function() {
    var scoring = $('#Scoring_"..@id.."').val();
    if (scoring == 'sum') $('#vote-results-container_"..@id.."').hover(ShowPercent"..@id..", ShowScore"..@id..");
    $('#vote-results-percent_"..@id.."').hide();
    
    $('#up_val_"..@id.."').click(function() {
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = $('#TheProperty_"..@id.."').val();
    
        ReadProperty( thePageApi, thePropertyName, IncreaseVote_"..@id..");
        return false;
    });
    $('#down_val_"..@id.."').click(function() {
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = $('#TheProperty_"..@id.."').val();
    
        ReadProperty( thePageApi, thePropertyName, DecreaseVote_"..@id..");
        return false;
    });
    
    GetVoteCount_"..@id.."();
    
            });
    
    function ShowPercent"..@id.."() {
        $('#vote-results_"..@id.."').hide();
        $('#vote-results-percent_"..@id.."').show();
    }
    function ShowScore"..@id.."() {
        $('#vote-results-percent_"..@id.."').hide();
        $('#vote-results_"..@id.."').show();
    }
    
    var SaveTotals_"..@id.." = function(curVal, status) {
    
        var voteCounts = '';
        var totalsPos = 0;
        var totalsNeg = 0;
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = 'Totals@' + $('#UniqueId_"..@id.."').val();
    
        if(typeOf(curVal) == 'array') {
            for(var i = 0; i < curVal.length; i++) {
                if(curVal[i].vote == 1) {
                    totalsPos = totalsPos + 1;
                } else {
                    totalsNeg = totalsNeg + -1;
                }
            }
            voteCounts = {positive: totalsPos, negative: Math.abs(totalsNeg), score: totalsPos + totalsNeg};
        } else {
            voteCounts = {positive: 0, negative: 0, score: 0};
        }    
    
        AddUpdateProperty(thePageApi, thePropertyName, voteCounts, '', '');
    }
    
    
    var IncreaseVote_"..@id.." = function(curVal, status) {
        $('#icon-wrap_"..@id.."').hide();
        $('#vote-loading_"..@id.."').show();
        $('#vote-results_"..@id.."').hide();
    
        var voteCounts = new Array;
        var newUser = true;
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = $('#TheProperty_"..@id.."').val();
        var CurUserID = $('#CurUserID_"..@id.."').val();
    
        if(typeOf(curVal) == 'array') {
            for(var i = 0; i < curVal.length; i++) {
                if(curVal[i].userid == CurUserID) {
                    curVal[i].vote = 1;
                    newUser = false;
                    break;
                }
            }
        } else {
            curVal = new Array;
        }
    
        if(newUser == true) {
            curVal[curVal.length] = {userid: CurUserID, vote: 1};
        }
    
        AddUpdateProperty(thePageApi, thePropertyName, curVal, GetVoteCount_"..@id..", SaveTotals_"..@id..");
    }
    
    var DecreaseVote_"..@id.." = function(curVal, status) {
        $('#icon-wrap_"..@id.."').hide();
        $('#vote-loading_"..@id.."').show();
        $('#vote-results_"..@id.."').hide();
    
        var voteCounts = new Array;
        var newUser = true;
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = $('#TheProperty_"..@id.."').val();
        var CurUserID = $('#CurUserID_"..@id.."').val();
    
        if(typeOf(curVal) == 'array') {
            for(var i = 0; i < curVal.length; i++) {
                if(curVal[i].userid == CurUserID) {
                    curVal[i].vote = -1;
                    newUser = false;
                    break;
                }
            }
        } else {
            curVal = new Array;
        }
    
        if(newUser == true) {
            curVal[curVal.length] = {userid: CurUserID, vote: -1};
        }
    
        AddUpdateProperty(thePageApi, thePropertyName, curVal, GetVoteCount_"..@id..", SaveTotals_"..@id..");
    }
    
    var GetVoteCount_"..@id.." = function(parm, status) {
        $('#vote-loading_"..@id.."').show();
        $('#vote-results_"..@id.."').hide();
    
        var thePageApi = $('#pageApi_"..@id.."').val();
        var thePropertyName = $('#TheProperty_"..@id.."').val();
        var CurUserID = $('#CurUserID_"..@id.."').val();
    
        ReadProperty( thePageApi, thePropertyName, ShowVoteCount_"..@id..");
    }
    
    var ShowVoteCount_"..@id.." = function(curVal, status) {
        $('#icon-wrap_"..@id.."').show();
        $('#vote-results_"..@id.."').show();
        $('#vote-loading_"..@id.."').hide();
    
    // calculate vote totals
        var totalsPos = 0;
        var runTotal = 0;
        var totalVotes = 0;
        var bgcolor;
        var green = new Array(80,225,80);
        var red = new Array(245,110,100);
        var white = new Array(255,255,255);
        var scoring = $('#Scoring_"..@id.."').val();
        if(typeOf(curVal) == 'array') {
            for(var i = 0; i < curVal.length; i++) {
                runTotal = runTotal + curVal[i].vote
                if(curVal[i].vote > 0) totalsPos ++;
            }
            totalVotes = curVal.length;
        }
    // calculate and output final score and color
        if (scoring == 'sum') {
            if (runTotal == 0)
                bgcolor = 'rgb(' + white.join(',') + ')';
            else if (runTotal > 0) {
                runTotal = '+' + runTotal;
                bgcolor = 'rgb(' + green.join(',') + ')';
            }
            else if (runTotal < 0)
                bgcolor = 'rgb(' + red.join(',') + ')';
            // update percentage overlay
            var percentPos = Math.round((totalsPos / Math.max(totalVotes,1)) * 100);
            $('#vote-results-percent_"..@id.."').html('Pos: ' + percentPos + '%<br/>Neg: ' + (100-percentPos) + '%').css('background-color', bgcolor);
        }
        else {
            var outColor = new Array(192,192,192);
    
            if (totalVotes == 0)
                runTotal = 'NA';
            else {
                var degree = 2*totalsPos/totalVotes - 1;
                var i;
                for (i = 0; i < 3; i++)
                    outColor[i] = Math.round(white[i] + degree*
                        (degree > 0 ? green[i] - white[i] : white[i] - red[i]));
                if (scoring == 'percent') runTotal = Math.round(100*totalsPos/totalVotes) + '%';
                else                      runTotal = (degree > 0 ? '+' : '') + Math.round(100*degree);
            }
    
            bgcolor = 'rgb(' + outColor.join(',') + ')';
        }
        $('#vote-results_"..@id.."').html(runTotal).css('background-color', bgcolor);
        $('#results-footer_"..@id.."').html(totalVotes + ' votes');
    }
    
    function typeOf(obj) {
      if ( typeof(obj) == 'object' ) {
        if (obj.length) {
          return 'array';
        } else {
          return 'object';
        }
      } else {
          return typeof(obj);
      }
    }
    
    // This function is simply used to aid in debugging.
    var AlertMe = function(text, status) {
    
        alert(status + ':' + text);
    
    }
    
    function AddUpdateProperty(pageApi, propName, propValue, callback, totalsCallBack) {
    
        // property name to update
        var propertyname = 'urn:custom.mindtouch.com#' + propName;
        propValueJson = YAHOO.lang.JSON.stringify(propValue);
    
        // send AJAX request to find the property
        $.ajax({
        
            // set the uri for the properties API of the current page
            // add parameter to only list properties that match the requested name
            // add parameters to convert response to JSON and
            url: pageApi + '/properties?dream.out.format=json&names=' + Deki.url.encode(propertyname), 
            
            // set the request HTTP verb
            type: 'GET',
            cache: false,
            
            // check outcome of the request
            complete: function(xhr) {
            
                // check response status code
                if(xhr.status == 200) {
                
                    // evaluate respone JSON data
                    var data = eval('(' + xhr.responseText + ')');
    
                    // read property href and ETag
                    var href = data.property && data.property.contents['@href'];
                    var etag = data.property && data.property['@etag'];
                    
                    // check we the value was found
                    if(href && etag) {
    
                        // send AJAX request to update the property
                        $.ajax({ 
            
                            // set the request HTTP verb
                            url: href + '?dream.in.verb=PUT',
                            type: 'POST', 
            
                            // set the value of the updated property        
                            data: propValueJson, 
                            contentType: 'text/plain',
                            processData: false,
    
                            // add the 'ETag' header which checks if the property was modified since we read it
                            beforeSend: function(xhr) {
    
                                // NOTE (see Update 1 below): remove content-encoding added by Apache mod_deflate
                                etag = etag.replace('-gzip', '').replace('-bzip2', '').replace('-zip', '');
    
                                xhr.setRequestHeader('ETag', etag); 
                                return true; 
                            },
            
                            // check response status code
                            complete: function(xhr) {
    
                                // check the response status code
                                if(xhr.status == 200) {
                                    // alert('Property was successfully updated.');
                                    if(typeof callback == 'function') callback(true, xhr.status); else return true;
                                    if(typeof totalsCallBack == 'function') totalsCallBack(propValue, xhr.status); else return false;
                                } else {
                                    // alert('Unable to update the property. It may no longer exist (try recreating it), it may have been changed, or you don\\'t have permission to update it.');
                                    if(typeof callback == 'function') callback(false, xhr.status); else return false;
                                }
                            }
                        });
                    } else {
    
                        // CREATE PAGE PROPERTY
                        // send AJAX request using jQuery 
                        $.ajax({
                        
                            // set the uri for the properties API of the current page
                            url: pageApi + '/properties',
                            
                            // set the request HTTP verb
                            type: 'POST', 
                            
                            // set the value of the new property
                            data: propValueJson, 
                            contentType: 'text/plain',
                            processData: false,
                            
                            // add the 'Slug' header which sets the property name
                            beforeSend: function(xhr) { 
                                xhr.setRequestHeader('Slug', 'urn:custom.mindtouch.com#' + propName); 
                                return true; 
                            },
                            
                            // check outcome of the request
                            complete: function(xhr) {
                    
                                // check the response status code
                                if(xhr.status == 200) {
                                    // alert('Property was successfully created.');
                                    if(typeof callback == 'function') callback(true, xhr.status); else return true;
                                    if(typeof totalsCallBack == 'function') totalsCallBack(propValue, xhr.status); else return false;
                                } else {
                                    // alert('Unable to create the property. It may already exist (try deleting it) or you don\\'t have permission to create it.');
                                    if(typeof callback == 'function') callback(true, xhr.status); else return true;
                                }
                            }
                        });  // End Ajax (Create Property)
    
                    }
                } else {
                    // alert('Unable to query the property. You don\\'t have permission to read it.');
                    if(typeof callback == 'function') callback(false, xhr.status); else return false;
                }
            }
        });  // End AJAX (Update Property)
    
    }  // End Function AddUpdateProperty
    
    
    function DeleteProperty(pageApi, propName, callback) {
    
        // property name to update
        var propertyname = 'urn:custom.mindtouch.com#' + propName;
    
        // send AJAX request to find the property
        $.ajax({
        
            // set the uri for the properties API of the current page
            // add parameter to only list properties that match the requested name
            // add parameters to convert response to JSON and
            url: pageApi + '/properties?dream.out.format=json&names=' + Deki.url.encode(propertyname), 
            
            // set the request HTTP verb
            type: 'GET',
            cache: false,
            
            // check outcome of the request
            complete: function(xhr) {
            
                // check response status code
                if(xhr.status == 200) {
                
                    // evaluate respone JSON data
                    var data = eval('(' + xhr.responseText + ')');
    
                    // read property href
                    var href = data.property && data.property.contents['@href'];
                    
                    // check we the value was found
                    if(href) {
    
                        // send AJAX request to delete the property
                        $.ajax({ 
            
                            // set the request HTTP verb
                            url: href + '?dream.in.verb=DELETE',
                            type: 'POST', 
    
                            // check response status code
                            complete: function(xhr) {
    
                                // check the response status code
                                if(xhr.status == 200) {
                                    // alert('Property was successfully deleted.');
                                    if(typeof callback == 'function') callback(true, xhr.status); else return true;
                                } else {
                                    // Who cares we were going to trash it anyhow
                                    // alert('Unable to delete the property. It may not exist (try creating it) or you don\\'t have permission to delete it.');
                                    if(typeof callback == 'function') callback(true, xhr.status); else return true;
                                }
                            }
                        });
                    } else {
                        // Who cares we were going to trash it anyhow
                        // alert('Unable to find the property. It may not exist (try creating it).');
                        if(typeof callback=='function') callback(true, xhr.status); else return true;
                    }
                } else {
                    alert('Unable to query the property. You don\\'t have permission to read it.');
                    if(typeof callback=='function') callback(false, xhr.status); else return false;
                }
            }
        });
    
    } // End Function DeleteProperty
    
    
    function ReadProperty(pageApi, propName, callback) {
    
        // property name to read
        var propertyname = 'urn:custom.mindtouch.com#' + propName;
    
        // send AJAX request using jQuery
        $.ajax({
        
            // set the uri for the properties API of the current page
            // add parameter to only list properties that match the requested name
            // add parameters to convert response to JSON and
            url: pageApi + '/properties?dream.out.format=json&names=' + Deki.url.encode(propertyname), 
            
            // set the request HTTP verb
            type: 'GET',
            cache: false,
            async: false,
            
            // check outcome of the request
            complete: function(xhr) {
            
                // check response status code
                if(xhr.status == 200) {
                
                    // evaluate response JSON data
                    var data = eval('(' + xhr.responseText + ')');
    
                    // read property value
                    var value = data.property && data.property.contents['#text'];
                    
                    // check we the value was found
                    if(value) {
    
                        value = YAHOO.lang.JSON.parse(value);
                         // alert('Property was successfully read.\\nIts value is \\'' + value + '\\'');
                        if(typeof callback == 'function') callback(value, xhr.status); else return value;
                    } else {
                        // alert('Unable to find the property. It may not exist (try creating it).');
                        if(typeof callback == 'function') callback(value, xhr.status); else return null;
                    }
                } else {
                    // alert('Unable to query the property. You don\\'t have permission to read it.');
                    if(typeof callback == 'function') callback(value, xhr.status); else return null;
                }
            }
        });
    
    }
            
        "</script>
    
        <style type="text/css">"
            
        "</style>
    
    
    </head></html> 
    
    
    
    Deki Appliance - Powered by TurnKey Linux