// ================================================================
//  ajaxpoll.js ---- Ajax poll component
//  Copyright 2006 Sibelian <sibelian [at] gmail.com>
//  http://sibelian.jp.land.to/
// ================================================================

AjaxPoll = function ( area, theme, option, maxpoll ,initialize) {
    this.area = area;
    this.theme = theme;
    this.option = option;
    this.maxpoll = maxpoll;
    if(typeof(this.maxpoll) == "undefined") {this.maxpoll = 0;}
    this.initialize = initialize;
    if(typeof(this.initialize) == "undefined") {this.initialize = 0;}
    this.init_poll_area();
    return this;
};

AjaxPoll.prototype.form_title = function (theme, total) {    // 投票のタイトルのフォーマット
    return theme + "（投票総数： " + this.total + " ）";
}
AjaxPoll.prototype.form_submit = '投票';    // 投票ボタンの文字
AjaxPoll.prototype.form_barlength = '75';    //  バーの長さ（様子を見て調節してください）
AjaxPoll.prototype.form_barspeed = '150';    // バーがのびるアニメーションにかける時間（ミリ秒単位）
AjaxPoll.prototype.form_barstep = '5';    // バーがのびるアニメーションのコマ数
AjaxPoll.prototype.form_rowheight = '2';
AjaxPoll.prototype.error_notfound = '[ERROR] 404 CGI not found.';
AjaxPoll.prototype.error_data = '[ERROR] Cannot get data.';
AjaxPoll.prototype.class_root = 'ajaxpoll';
AjaxPoll.prototype.class_title = 'ajaxpoll_title';
AjaxPoll.prototype.class_table = 'ajaxpoll_table';
AjaxPoll.prototype.class_row = 'ajaxpoll_row';
AjaxPoll.prototype.class_item = 'ajaxpoll_item';
AjaxPoll.prototype.class_poll = 'ajaxpoll_poll';
AjaxPoll.prototype.class_form = 'ajaxpoll_form';
AjaxPoll.prototype.class_submit_prefix = 'ajaxpoll_submit_';
AjaxPoll.prototype.class_count = 'ajaxpoll_count';
AjaxPoll.prototype.class_graph = 'ajaxpoll_graph';
AjaxPoll.prototype.class_bar_prefix = 'ajaxpoll_bar_';
AjaxPoll.prototype.id_bar_prefix = 'ajaxpoll_bar_';
AjaxPoll.prototype.class_nowloading = 'ajaxpoll_nowloading';
AjaxPoll.prototype.class_error = 'ajaxpoll_error';

////
AjaxPoll.prototype.url_data = '/service/poll/ajaxpoll-data';
AjaxPoll.prototype.url_post = '/service/poll/ajaxpoll.cgi';
AjaxPoll.prototype.url_nowloading = '/service/poll/ajax-loader.gif';
////

AjaxPoll.prototype.load = function () {
    var copythis = this;
    var func = function (tree,res) {
        if(res.status == 404) {
            if (!this.initialize) {
                copythis.disp_error(copythis.error_notfound);
            } else {
                copythis.initialize = 1;
                copythis.load();
            }
        } else {
            copythis.tree = tree;
            copythis.get_error(copythis.tree);
            if (copythis.error) {
                copythis.disp_error(copythis.error_data);
            } else {
                if(copythis.tree.items.item.length != copythis.option.length) {
                    copythis.initialize = 1;
                    copythis.load();
                } else {
                    copythis.total = parseInt(0);
                    for (var i=0;i<copythis.tree.items.item.length;i++) {
                        copythis.total += parseInt(copythis.tree.items.item[i]["-count"]);
                    }
                    copythis.update_poll();
                }
            }
        }
    };
    var xotree = new XML.ObjTree();
    xotree.force_array = ["item"];
    if(this.initialize) {
        var opts = {
            postBody:   "method=readfile&area="+this.area+"&option="+this.option
        };
        xotree.parseHTTP(this.url_post, opts, func);
    } else {
    	var url = this.url_data+"/"+this.area + ".xml";
    	xotree.parseHTTP(url,{},func);
    }
    this.now_loading();
}

AjaxPoll.prototype.get_error = function (tree) {
    this.error = 0;
    if(typeof(tree) == "undefined"||typeof(tree.items) == "undefined") {
        this.error = 1;
    } else {
        this.error = 0;
    }
}

AjaxPoll.prototype.disp_error = function (content) {
    var ediv = document.getElementById( this.area );
    var etable = ediv.getElementsByTagName( "table" );
    var ftable = etable[0];
    while ( ftable.childNodes.length ) {
        ftable.removeChild( ftable.firstChild );
    }
    var ftbody = document.createElement( "tbody" );
    var ftr = document.createElement( "tr" );
    var ftd = document.createElement( "td" );
    ftd.innerHTML = content;
    ftd.className = this.class_error;
    ftr.appendChild(ftd);
    ftbody.appendChild(ftr);
    ftable.appendChild(ftbody);
}

AjaxPoll.prototype.now_loading = function () {
    var ediv = document.getElementById( this.area );
    var etable = ediv.getElementsByTagName( "table" );
    var ftable = etable[0];
    
    while ( ftable.childNodes.length ) {
        ftable.removeChild( ftable.firstChild );
    }
    var ftbody = document.createElement( "tbody" );
    var ftr = document.createElement( "tr" );
    var ftd = document.createElement( "td" );
    ftd.className = this.class_nowloading;
    var img = document.createElement( "img" );
// Created at Ajaxload
// http://www.ajaxload.info/
    img.src = this.url_nowloading;
    ftd.appendChild(img);
    ftr.appendChild(ftd);
    ftbody.appendChild(ftr);
    ftable.appendChild(ftbody);
}

AjaxPoll.prototype.init_poll_area = function () {
    var ediv = document.getElementById( this.area );
    ediv.className = this.class_root;
    while ( ediv.childNodes.length ) {
        ediv.removeChild( ediv.firstChild );
    }
    var ep = document.createElement( "p" );
    ep.innerHTML = this.theme;
    ep.className = this.class_title;
    var ftable = document.createElement( "table" );
    ftable.className = this.class_table;
    ediv.appendChild( ep );
    ediv.appendChild( ftable );
}

AjaxPoll.prototype.update_poll = function () {
    var ediv = document.getElementById( this.area );
    var ep = ediv.getElementsByTagName( "p" );
    var fp = ep[0];
    while ( fp.childNodes.length ) {
        fp.removeChild( fp.firstChild );
    }
    fp.innerHTML = this.form_title(this.theme, this.total);
    var etable = ediv.getElementsByTagName( "table" );
    var ftable = etable[0];
    ftable.style.height = (this.tree.items.item.length*this.form_rowheight) + "em";
    
    while ( ftable.childNodes.length ) {
        ftable.removeChild( ftable.firstChild );
    }
    
    var ftbody = document.createElement( "tbody" );
    for(var i=0;i<this.tree.items.item.length; i++) {
        var ftr = document.createElement( "tr" );
        ftr.className = this.class_row;
        ftr.style.height = this.form_rowheight+"em";
        var ftd1 = document.createElement( "td" );
        ftd1.className = this.class_item;
        var ftd2 = document.createElement( "td" );
        ftd2.className = this.class_poll;
        var ftd3 = document.createElement( "td" );
        ftd3.className = this.class_count;
        var ftd4 = document.createElement( "td" );
        ftd4.className = this.class_graph;
        
        var fform2 = document.createElement( "form" );        
        var finput2a = document.createElement( "input" );
        finput2a.type = "hidden";
        finput2a.value = i;
        var finput2b = document.createElement( "input" );
        finput2b.type = "submit";
        finput2b.value = this.form_submit;
        finput2b.className = this.class_submit_prefix+this.area;
        fform2.appendChild(finput2a);
        fform2.appendChild(finput2b);
        fform2.className = this.class_form;
        
        var fdiv4 = document.createElement( "div" );
        fdiv4.className = this.class_bar_prefix + this.area;
        fdiv4.id = this.id_bar_prefix + this.area +"_"+ i;
//        for (var j=0; j<(this.tree.items.item[i]["-count"]*this.form_barlength*this.tree.items.item.length/5*this.total);j++) {
//            ftd4.innerHTML += "*";
//        }
        
        ftd1.innerHTML = this.tree.items.item[i]["-name"];
        ftd2.appendChild(fform2);
        ftd3.innerHTML = this.tree.items.item[i]["-count"];
        ftd4.appendChild(fdiv4);
        
        ftr.appendChild( ftd1 );
        ftr.appendChild( ftd2 );
        ftr.appendChild( ftd3 );
        ftr.appendChild( ftd4 );
        ftbody.appendChild(ftr);

        var copythis = this;
        var func = function (e,target) {
            copythis.poll(e,target);
        };
        this.appendEvent( fform2, "submit", func );
    }
    ftable.appendChild(ftbody);
    if(!this.total) {this.total = 1;}
    for (var i=0; i<this.tree.items.item.length;i++) {
        new Rico.Effect.Size(this.id_bar_prefix + this.area +"_"+ i, (this.tree.items.item[i]["-count"]*this.form_barlength*this.tree.items.item.length/this.total), null, this.form_barspeed, this.form_barstep);
    }
}

AjaxPoll.prototype.poll = function (e, fform) {
    var copythis = this;
    var func = function (tree, res) {
        if(res.status == 404) {
            copythis.disp_error(copythis.error_notfound);
        } else {
            copythis.tree = tree;
            copythis.get_error(copythis.tree);
            if (copythis.error) {
                copythis.disp_error(copythis.error_data);
            } else {
                copythis.total = 0;
                for(var i=0;i<copythis.tree.items.item.length; i++) {
                    copythis.total += parseInt(copythis.tree.items.item[i]["-count"]);
                }
            copythis.update_poll();
            }
        }
    }
    var xotree = new XML.ObjTree();
    xotree.force_array = ["item"];
    var opts = {
        postBody:   "method=increment&area="+this.area+"&option="+fform.elements[0].value+"&maxpoll="+ this.maxpoll
    };
    this.tree = xotree.parseHTTP(this.url_post,opts, func);
    this.now_loading();
}


AjaxPoll.prototype.appendEvent = function ( target, type, func ) {
    var copyfunc = func;
    if ( target.attachEvent ) {
        var iefunc = function () {
            event.returnValue = false;
            copyfunc( event, event.srcElement );
        };
        target.attachEvent( "on"+type, iefunc );
    } else {
        var domfunc = function (e) {
            e.preventDefault();
            copyfunc( e, e.target );
        };
        target.addEventListener( type, domfunc, false );
    }
}

