function ajaxPoll(s_objname_fp, s_ajaxobjname_fp, s_eleid_fp, i_locid_fp, s_processurl_fp) {
    /* USAGE NOTES
    * "n=" is reserved as a query string variable when sending GET requests!
    * many of the methods assumed that we're receiving JSON data (e.g. eval(o_xmlhttp.resposeText))
    * cookie_class.js must be called by the parent html for localization features to work (cookieUtilObj())
    */
    /**** BEGIN PRIVATE VARIABLES ****/
    //"CONSTANTS"
    //html strings for rewriting by the poll methods
    var HTML_POLLOPTION = '<a href="#" onclick="_ajaxobj_.doServerRequest(\'_processor_\',\'id=_pollid_&pick=_picknum_\',_objname_.doResult)">_response_</a><br/>';
    var HTML_POLLQUESTION = '<span>_question_</span><br/><br/>';
    var HTML_POLLRESULT = '_result_%<br/>';
    //array indices
    var KEY_LOCID = 'id';
    var KEY_QUESTION = 'question';
    var KEY_RESPONSE = 'response';
    //html replacement keys for rewiriting (must match those in the c_html... values paired in method)
    var RGX_AJAXOBJ = /_ajaxobj_/;
    var RGX_OBJNAME = /_objname_/;
    var RGX_POLLID = /_pollid_/g;
    var RGX_POLLPICK = /_picknum_/;
    var RGX_POLLPROCESSOR = /_processor_/;
    var RGX_POLLQUESTION = /_question_/;
    var RGX_POLLRESPONSE = /_response_/;
    var RGX_POLLRESULT = /_result_/;

    //variables
    var a_polljson; //poll data object held as global to speed result rendering
    var i_locid; //location id of the requested poll
    var i_reqindex;  //json index of requested poll
    var s_ajaxobjname; //name reference to the ajax object to use in calls
    var s_eleid = false; //id of element in HTML DOM getting the update
    var s_objname; //name of instantiated object for callback
    var s_processurl; //processor page url
    /**** END PRIVATE VARIABLES ****/

    /**** BEGIN PUBLIC METHOD POINTERS ****/
    this.doVote = doVote;
    this.doResult = doResult;
    /**** END PUBLIC METHOD POINTERS ****/

    /**** BEGIN "CONSTRUCTOR" ACTIONS ****/
    setCallback(s_objname_fp);
    setAjaxRef(s_ajaxobjname_fp);
    setContentTarget(s_eleid_fp);
    setLocId(i_locid_fp);
    setProcessUrl(s_processurl_fp);
    /**** END "CONSTRUCTOR" ACTIONS ****/

    /**** BEGIN PUBLIC METHODS ****/
    function doResult(a_resultjson_fp) { //display the poll question/responses with results
        /*USAGE NOTE
        * classes must be applied to <p> and <span> using a selector class
        * at the enclosing element's level
        * this method can only be called AFTER doVote has been called, otherwise there's no lang data
        */
        var i_index;
        var i_allvotes = 0;
        var i_voteshare = 0;
        var s_question = HTML_POLLQUESTION;
        var s_htmlresult;
        var s_result = '';
        s_question = s_question.replace(RGX_POLLQUESTION,a_polljson[KEY_QUESTION]); //write out the question
        for (i_index in a_polljson[KEY_RESPONSE]) { //work out the total votes
            i_allvotes += Number(a_resultjson_fp[i_index]);
        }
        for (i_index in a_polljson[KEY_RESPONSE]) { //now attach the vote percentage to the text of each response option
            i_voteshare = Math.round( ((a_resultjson_fp[i_index]/i_allvotes) * 100) );
            s_htmlresult = String(Number(i_index) + 1) + '. ' + HTML_POLLRESULT;
            s_result += s_htmlresult.replace(RGX_POLLRESULT,(a_polljson[KEY_RESPONSE][i_index] + ' - ' + i_voteshare));
        }
        outContent(s_question + s_result);
    }

    function doVote(a_polljson_fp) { //display the poll question/responses
        /*USAGE NOTE
        * classes must be applied to <a> and <span> using a selector class
        * at the enclosing element's level
        */
        var i_a;
        var i_b;
        var i_pick = 1;
        var s_question = HTML_POLLQUESTION;
        var s_link;
        var s_votelinks = '';
        a_polljson = a_polljson_fp[setRequestIndex(a_polljson_fp)]; //save just the poll defs for later use
        s_question = s_question.replace(RGX_POLLQUESTION,a_polljson[KEY_QUESTION]);  //write out the question
        for (i_b in a_polljson[KEY_RESPONSE]) { //write out response/vote link
            s_link = String(Number(i_b) + 1) + '. ' + HTML_POLLOPTION;
            s_link = s_link.replace(RGX_AJAXOBJ,s_ajaxobjname);
            s_link = s_link.replace(RGX_POLLPROCESSOR,s_processurl);
            s_link = s_link.replace(RGX_POLLID,i_locid);
            s_link = s_link.replace(RGX_POLLPICK,i_pick);
            s_link = s_link.replace(RGX_OBJNAME,s_objname);
            s_link = s_link.replace(RGX_POLLRESPONSE,a_polljson[KEY_RESPONSE][i_b]);
            s_votelinks += s_link;
            i_pick++;
        }
        outContent(s_question + s_votelinks);
    }
    /* END PUBLIC METHODS */

    /* BEGIN PRIVATE METHODS */
    function setCallback(s_objname_fp) {
        s_objname = s_objname_fp;
    }

    function outContent(s_html_fp) { //display the output
        //document.getElementById(s_eleid).innerHTML = s_html_fp;
    }

    function setAjaxRef(s_ajaxobjname_fp) {
        s_ajaxobjname = s_ajaxobjname_fp;
    }

    function setContentTarget(s_eleid_fp) {
        s_eleid = s_eleid_fp;
    }

    function setLocId(i_locid_fp) {
        i_locid = i_locid_fp;
    }

    function setProcessUrl(s_processurl_fp) {
        s_processurl = s_processurl_fp;
    }

    function setRequestIndex(a_polljson_fp) {
        var i_index;
        for (i_index in a_polljson_fp) { //find the matching index and print out info
            if (a_polljson_fp[i_index][KEY_LOCID] == i_locid) {
                return i_index;
            }
        }
    }
    /**** END PRIVATE FUNCTIONS ****/
}
