var polling = {};

polling.activated;
polling.randomNum;
polling.clicks = 0;

// Initialize
polling.init = function() {
    polling.activated = true;
    // Get random number between 3-12.
    polling.randomNum = 3 + Math.floor(Math.random() * 10);
    // Add a polling function to the onclick event of the document(root) object.
    dojo.event.connect(document, 'onclick', 'polling_onclick');
	
	polling.track('login');
	
	dojo.byId('pollingdlg').className = '';
}

// Get Polling HTML.
polling.getQuestion = function() {
    var question = null;
	dojo.io.bind({
        url: '/polling/getPollingInfo.php',
        handler: function(type, data, event) {
            if (type == 'error') {
                alert('Error submitting the polling result!');
            } else {
                question = data;
            }
        },
        mimetype: 'text/html',
        method: 'get',
        sync: true,
        error: function(type, error){ dojo.debug(error.message); },
        timeoutSeconds: 60
    });
    return question;
}

// Pop-up the polling.
polling.launch = function() {
	//alert(result);
    var question = polling.getQuestion();
    if(!question) {
        return;
    }
    
    var questionDialog = dojo.byId("pollingdlg");
    var questionWidget = dojo.widget.byId('pollingdlg');
    questionDialog.innerHTML = question;
	
	// Add an event handler for canceling the poll.
    dojo.event.connect(questionWidget, 'onBackgroundClick', 'polling_canceled');
	dojo.event.connect(dojo.byId('close_btn_img'), 'onclick', 'polling_canceled');
	polling.track('fire');
    
    var onBackgroundClick = questionWidget.onBackgroundClick;
    questionWidget.onBackgroundClick = function() {};
    
    questionWidget.show();
    dojo.html.hide(questionDialog);
    // Do background fade-in effect.
    polling.bgColorFadeIn(questionWidget, [0, 0, 0], 700);
    
    setTimeout(function() {
        var num = Math.floor(Math.random() * 4) % 4;
		if (dojo.render.html.ie60) {
			num = 0;
		}
        switch(num) {
            case 0:
                polling.animation1(onBackgroundClick);
                break;
            case 1:
                polling.animation2(onBackgroundClick);
                break;
            case 2:
                polling.animation3(onBackgroundClick);
                break;
            case 3:
                polling.animation4(onBackgroundClick);
                break;
            default:
                polling.animation1(onBackgroundClick);
                break;
        }
    }, 1000);
}

polling.submit = function() {
	
    var err_msg_div = dojo.byId('polling_err_msg');
    if(polling.check()) {
        dojo.html.hide(err_msg_div);
    } else {
        dojo.html.show(err_msg_div);
        return "";
	}

    // Lock to avoid double submission.
    polling.lock();
    
	// Remove an event handler for canceling the poll.
    dojo.event.disconnect(dojo.widget.byId('pollingdlg'), 'onBackgroundClick', 'polling_canceled');
	dojo.event.disconnect(dojo.byId('close_btn_img'), 'onclick', 'polling_canceled');

    var answers = [];
    var qid = dojo.byId("polling_qid").value; // question id
    var inputs = document.getElementsByName("polling_options");

    for(var i=0; i<inputs.length; i++) {
        if(!inputs[i].checked) {
            continue;
        }
        var oid = inputs[i].value; // option id
        var option = '';
        if(dojo.byId('polling_option_etc_' + oid)) {
			option = dojo.byId('polling_option_etc_' + oid).value;
		}
        answers.push({'qid': qid, 'oid': oid, 'option': option});
    }

    var result = null;
	dojo.io.bind({
        url: '/polling/submitPollingInfo.php',
        handler: function(type, data, event) {
            if (type == 'error') {
                alert('Error submitting the polling result!');
            } else {
                result = data;
            }
        },
        mimetype: 'text/plain',
        method: 'post',
        sync: true,
        error: function(type, error){ dojo.debug(error.message); },
        timeoutSeconds: 60,
        content: {'answers' : dojo.json.serialize(answers)}
    });
	//alert(result);
	
	// show a chart image(loading image).
	dojo.html.hide(dojo.byId('polling_option_list'));
	dojo.html.show(dojo.byId('polling_chart_loading'));
	
	// remove "vote" message.
	dojo.html.hide(dojo.byId('polling_vote_msg'));
	
	// thank you message.
	if(dojo.render.html.ie60) {
		dojo.html.show(dojo.byId('polling_thanks_msg1'));
	} else {
		dojo.lfx.fadeShow(dojo.byId('polling_thanks_msg1'), 1000, dojo.lfx.easeIn).play();
	}
	
	// load a chart image.
	dojo.byId('polling_chart').innerHTML = "<img src='/polling/getPollingChart.php?q=" + qid + "' "
			+ "onload='polling.chartOnload();' />";
	if(dojo.render.html.opera) {
		// Opera doen't file onload event.
		polling.chartOnload();
	}

	return result;
}
// Lock to avoid double submission.
polling.lock = function() {
    // Disable all options.
    var div = dojo.byId('polling_option_list');
    var nodes = div.childNodes;
    for(var i=0; i<nodes.length; i++) {
        var subNodes = nodes[i].childNodes;
        for(var j=0; j<subNodes.length; j++) {
            if(!subNodes[j].tagName) { continue; }
            if(subNodes[j].tagName.toLowerCase() != 'input') { continue; }
            // Disable a radio/checkbox.
            subNodes[j].disabled = true;
        }
    }
    // Disable submit button.
	dojo.byId('polling_vote_msg').onclick = '';
}
// Check if an options is selected.
polling.check = function() {
    var inputs = document.getElementsByName("polling_options");
    for(var i=0; i<inputs.length; i++) {
        if(inputs[i].checked) {
            return true;
        }
    }
    return false;
}

// Fade show
polling.animation1 = function(onBackgroundClick) {
    var dialog = dojo.byId('pollingdlg');
    var widget = dojo.widget.byId('pollingdlg');
    
    dojo.lfx.fadeShow(dialog, 1000, dojo.lfx.easeIn, function(){
        widget.onBackgroundClick = onBackgroundClick;
    }).play();
}
// Slide In
polling.animation2 = function(onBackgroundClick) {
    var dialog = dojo.byId('pollingdlg');
    var widget = dojo.widget.byId('pollingdlg');

    var clientWidth = dojo.body().clientWidth;
    var clientHeight = dojo.body().clientHeight;
    var dialogWidth = 400; //dojo.html.getInnerWidth(dialog);
    var dialogHeight = 300; //dojo.html.getInnerHeight(dialog);
    
    var startX = clientWidth;
    var startY = parseInt((clientHeight - dialogHeight) / 2);
    
    var endX = parseInt((clientWidth - dialogWidth) / 2);

    //alert(clientWidth + " " + clientHeight + ' ' + dialogWidth + " " + dialogHeight);
    
    dojo.lfx.chain(
        dojo.lfx.fadeShow(dialog, 1),
        dojo.lfx.html.propertyAnimation(dialog, { 
                top: { start : startY, end : startY },
                left: { start : startX, end : endX - 100 }
            } , 500, dojo.lfx.easeOut),
        dojo.lfx.html.propertyAnimation(dialog, { 
                top: { start : startY, end : startY },
                left: { start : endX - 100, end : endX }
            } , 200, dojo.lfx.easeOut)
        .connect("onEnd", function(){
                widget.onBackgroundClick = onBackgroundClick;
        })
    ).play();
}
// Wipe In
polling.animation3 = function(onBackgroundClick) {
	var dialog = dojo.byId('pollingdlg');
    var widget = dojo.widget.byId('pollingdlg');
	dojo.require("dojo.lfx.extras");
	dojo.lfx.html.fadeWipeIn(dialog, 500, dojo.lfx.easeOut, function() {
		widget.onBackgroundClick = onBackgroundClick;
	}).play();
}
// Explode
polling.animation4 = function(onBackgroundClick) {
	var dialog = dojo.byId('pollingdlg');
    var widget = dojo.widget.byId('pollingdlg');
	
	var startId = 'image';
    var num = Math.floor(Math.random() * 3) % 3;
	switch(num){
		case 0:
			startId = 'image';  // top left
			break;
		case 1:
			startId = 'userProfile'; // top right
			break;
		case 2:
			startId = 'footer'; // bottom
			break;
	}
	dojo.lfx.html.explode(startId, dialog, 500, dojo.lfx.easeOut, function() {
		widget.onBackgroundClick = onBackgroundClick;
	}).play();
}
polling.close = function() {
    var questionWidget = dojo.widget.byId("pollingdlg");
    var questionDialog = dojo.byId("pollingdlg");
	

    setTimeout(function(){
        dojo.lfx.fadeOut(questionDialog, 500, dojo.lfx.easeIn, function() {
            questionWidget.hide();
        }).play();
    }, 100);
}
polling.bgColorFadeIn = function(widget, bgColor, timeDuration) {
    var interval = 100;
    var diffRed = (255 - bgColor[0]) / interval;
    var diffGreen = (255 - bgColor[1]) / interval;
    var diffBlue = (255 - bgColor[2]) / interval;
    
    for(var i=0; i<interval; i++) {
		// need to dig another scope to make this work.
        (function() {
            var red = parseInt(255 - diffRed * i);
            var green = parseInt(255 - diffGreen * i);
            var blue = parseInt(255 - diffBlue * i);
            var time = parseInt(timeDuration/interval * i);

            setTimeout(function() {
                widget.setBackgroundColor(red, green, blue);
            }, time);
        })();
    }
}
polling_onclick = function(event) {
    if(!polling.activated) { return; }
    
    var target = dojo.html.getEventTarget(event);
    if(!target) { return; }
    var tagName = target.tagName.toLowerCase();
    //alert(tagName);

    // only for links, buttons, images, and spans.
    // (Top menes(tags) are in span tags.)
    if(tagName != 'a' && tagName != 'input' && tagName != 'button'
            && tagName != 'img' && tagName != 'span') {
        return;
    }
    // if the input tag is not a button, ignore it.
    if(tagName == 'input' && target.type.toLowerCase() != 'button') {
        return;
    }
    // ingore polling related tags.
    if(target.id.match(/polling/i)) {
        return;
    }

    polling.clicks += 1;
    //alert(polling.randomNum);
    if(polling.clicks == polling.randomNum) {
        polling.launch();
        polling.activated = false;
    }
}
polling.selectOption = function(id) {
	var input = dojo.byId(id);
	if(input) {
		input.checked = true;
	}
}
// Records cancel action on DB.
_polling_canceled = function(event) {
    var qid = dojo.byId("polling_qid").value; // question id
    var answers = [{'qid':qid, 'oid':'-1', 'option':''}];
    
	var result = null;
	dojo.io.bind({
        url: '/polling/submitPollingInfo.php',
        handler: function(type, data, event) {
            if (type == 'error') {
                alert('Error submitting the polling result!');
            } else {
                result = data;
            }
        },
        mimetype: 'text/plain',
        method: 'post',
        sync: true,
        error: function(type, error){ dojo.debug(error.message); },
        timeoutSeconds: 60,
        content: {'answers' : dojo.json.serialize(answers)}
    });
	return result;
}
polling.chartOnload = function() {
	dojo.html.hide('polling_chart_loading');
	if (dojo.render.html.ie60) {
		dojo.html.show(dojo.byId('polling_chart'));
		dojo.html.show(dojo.byId('polling_thanks_msg2'));
	} else {
		dojo.lfx.combine(
			dojo.lfx.fadeShow(dojo.byId('polling_chart'), 500, dojo.lfx.easeOut),
			dojo.lfx.fadeShow(dojo.byId('polling_thanks_msg2'), 1000, dojo.lfx.easeIn)
		).play();
	}
}
polling.track = function(action) {
	var url = '/polling/track.php';
	var input = dojo.byId("polling_qid");
	var qid = -1; // Question ID
	if (input) {
		qid = input.value;
	}
	var clicks = polling.randomNum;
	dojo.io.bind({
        url: url,
		/*
        handler: function(type, data, event) {
            if (type == 'error') {
                //alert();
            } else {
				if (data) {
					alert();
				}
            }
        },
        */
        method: 'get',
        sync: false,
        error: function(type, error){ dojo.debug(error.message); },
        timeoutSeconds: 60,
		content: {q: qid, n: clicks, e: action}
    });
}
polling_canceled = function() {
	polling.track('cancel');
}

