
(function($) {

var TestsConf = {"srcd":"infotesty.pl","basedir":"\/wp-content\/plugins\/tests-info","intf":"int","icon":"images\/icons","css":"css","js":"js"};
var options = {
    beforeStart:null,
    afterFinish:null,
    renderArea:'#render-area',
    returnText:'Zakończ'
};

var script;

function sameDomain() {
    return location.host == TestsConf.srcd;
}

function geturl(t) {
    return (!sameDomain()?'http://'+TestsConf.srcd+'/':'')+
        TestsConf.basedir+'/'+TestsConf[t];
}

function htmlEsc(s) {
    return $('<div/>').text(s).html();
}

function capitalize(s) {
    return !s.length?'':(s=s.split(''),s[0]=s[0].toUpperCase(),s=s.join(''));
}


function serialize(sdata,encode) {
    var sString = '';
    var tData = typeof(sdata);
    switch(tData) {
        case 'undefined':
        case 'unknown':
            sString = 'N;';
            break;
        case 'string':
            if(encode) {
                sdata = encodeURI(sdata);
            }
            sString = 's:'+sdata.length+':"'+sdata+'";';
            break;
        case 'object':
            if(sdata === null) {
                sString = 'N;';
                break;
            }
            var tabCnt = 0;
            var inArr = '';
            for(var i in sdata) {
                var inArrData = serialize(sdata[i],encode);
                if(inArrData) {
                    tabCnt++;
                    if(i==parseInt(i,10)) {
                        inArr += 'i:'+i+';';
                    }
                    else {
                        inArr += 's:'+i.length+':"'+i+'";';
                    }
                    inArr  += inArrData;
                }
                if(tabCnt) {
                    sString = 'a:'+String(tabCnt)+':{'+inArr+'}';
                }
            }
            break;
        case 'number':
            if(isNaN(sdata)) {
                sString = 'N;';
                break;
            }

            if(sdata != Math.floor(sdata)) {
                sString = 'd:'+String(sdata) + ';';
            }
            else {
                sString = 'i:'+String(sdata) + ';';
            }
            break;
        case 'boolean':
            sString = 'b:'+(sdata?'1':'0')+';';
            break;
    }

    return sString;
}


var RenderFn,Actions;

function render(data) {
        if(data.error.code) {
            alert('Wystąpił błąd');
            return;
        }

        data=data.data;
        if(data.script) {
            script = data.script;
        }

        if(false === RenderFn[data.type](data)) {
            return;
        }
        
        Actions.data = data.data;
        $(options.renderArea).fadeIn('fast');
        $('#qs_cnc').click(function(){Actions.endTest();});
 }

RenderFn = {
    list:function(data) {
        var li=data.data,
            html = ['<h2>Wybierz test</h2><ul class="test_choice">'],
            ts = this;
        for(var i=0,l=li.length;i<l;++i) {
            html.push(
                '<li class="test_choice_'+(i%2?'odd':'even')+'" style="cursor:pointer" id="ts_'+li[i].ID+'">',
                    '<a id="tsl_'+li[i].ID+'" class="test_choice_link" href="">'+htmlEsc(li[i].txt)+'</a>',
                '</li>');
        }
        html.push('</ul>');
        $(options.renderArea).html(html.join(''));
        $('.test_choice_link').click(function(e){
            e.preventDefault();
            var self = this;
            ts.hide(function(){
                Actions.startTest(self.id.replace('tsl_',''));});
        });
        if(!$(options.renderArea).is(':visible')) {
            $(options.renderArea).fadeIn('fast');
        }

        return false;
    },
    reset:function() {
        $(options.renderArea).fadeOut(fast, function() {
            $(options.renderArea).empty();
        });

        return false;
    },
    intro:function(data) {
        data = data.data;
        var html = [data.text];

        if(data.regs) {
            html.push('<div style="border:1px solid black;padding:5px;margin: 10px 0;overflow:auto;height:200px;">',data.regs,'</div>');
        }
        html.push(
        '<div class="qs_foot">',
            (data.regs?'<button id="qs_next"><img style="vertical-align:middle" src="'+geturl('icon')+'/tick_16.png"> Zaakceptuj regulamin</button>':
            '<button id="qs_next"><img style="vertical-align:middle" src="'+geturl('icon')+'/right_16.png"> Przejdź do testu</button>'),
            '<button id="qs_cnc"><img style="vertical-align:middle" src="'+geturl('icon')+'/block_16.png"> Zrezygnuj z testu</button>',
        '</div>');

        $(options.renderArea).html(html.join(''));
        $('#qs_next').click(function(){Actions.accept();});
    },
    question:function(data) {
        var qd = data.data;
        var html = ['<h2>Pytanie ',qd.current,' z ',qd.total,'</h2>',
            '<span class="qs_txt">',qd.txt,'</span>',
            '<form id="qs_rs">','<table border="0">'];
        var r;
        for(var i=0,l=qd.responses.length;i<l;++i){
            r = qd.responses[i];
            html.push('<tr><td class="rs_inp">',
                this._inpByType(qd.rtype,r.id),
                '</td><td class="rs_txt">',
                r.txt,
                '</td></tr>' );
        }

        var next_btn = qd.current == qd.total?'Zakończ test':'Następne pytanie';

        html.push('</table>','</form>',
            '<div id="message_area"> </div>',
            '<div class="qs_foot">',
                '<button id="qs_next">',next_btn,' <img style="vertical-align:middle" src="'+geturl('icon')+'/right_16.png"></button>',
                '<button id="qs_cnc"><img style="vertical-align:middle" src="'+geturl('icon')+'/block_16.png"> Zrezygnuj z testu</button>',
            '</div>');

        $(options.renderArea).html(html.join(''));
        $('#qs_next').click(function(){Actions.next();});
    },
    outro:function(data) {
        data = data.data;
        var text = data.text.replace('[CODE]','<input id="ts_code" type="text" />').
            replace('[TRIES]',data.trials);
        var html = [text];
        html.push(
        '<div class="qs_foot">',
            '<button id="qs_next"><img style="vertical-align:middle" src="'+geturl('icon')+'/tick_16.png"> Zaakceptuj kod</button>',
            '<button id="qs_cnc"><img style="vertical-align:middle" src="'+geturl('icon')+'/home_16.png"> ',options.returnText,'</button>',
        '</div>');

        $(options.renderArea).html(html.join(''));
        $('#qs_next').click(function(){
            Actions.sendCode($('#ts_code').val());
        });
    },
    results:function(data) {
        var html = [];
        data = data.data;
        if(!data.comments.length) {
            html.push('<h2>Zakończyłeś test</h2>','<p>Uzyskałeś ',data.points,' punktów.</p>');
        }
        for(var i=0,l=data.comments.length;i<l;i++) {
            html.push('<p>',data.comments[i].txt,'<p>')
        }

        html.push('<button id="qs_cnc">',options.returnText,' <img style="vertical-align:middle" src="'+geturl('icon')+'/right_16.png"/></button>');
        $(options.renderArea).html(html.join(''));
    },
    hide:function(callback) {
        $(options.renderArea).fadeOut('fast', callback||function(){});
    },
    _inpByType:function(t,id) {
            if(t == 0) {
                return '<input class="resp" type="radio" name="r1" value="'+id+'" />';
            }

            if(t==1) {
                return '<input class="resp" type="checkbox" value="'+id+'" />';
            }
            return '';
    }
}

Actions = {
	comm : function(p,cb) {
            if(sameDomain()) {
                $.post(geturl('intf'),p,cb,'json');
            } else {
                $.getJSON(geturl('intf')+'?_ff_=?',p,cb);
            }
        },
        startTest:function(id) {
		(options.beforeStart||function(){})();
                Actions.comm({_f_:'next',action:'start',id:id},
                    function(d){render(d)});
	},
        endTest:function() {
            RenderFn.hide(function(){(options.afterFinish||function(){})();});
	},
	next:function() {
		var ts = this;
                this.checkCond(1);
		var ids=[];
		jQuery('#qs_rs :input').filter(function(){
			if(this.checked) ids.push($(this).val());
		});
		if(!ids.length) {
			alert("Nie wybrałeś żadnej odpowiedzi!");
			return;
		}

                RenderFn.hide(function(){ts.next_(ids);});
		
	},
	next_:function(ids) {
		var d = {_f_:'next',action:'response',resp:ids.join()}; 
		if(script) {
			d.vars = Actions.processScript(script);
			script = null;
		}
		Actions.comm(d,function(d){render(d)});
	},
	accept:function() {
            Actions.comm({_f_:'next',action:'accept'},function(d,s){render(d)});
	},
	sendCode:function(code_) {
            Actions.comm({_f_:'next',action:'code',code:code_},function(d){render(d)});
	},
	processScript:function(script) {
		var data = [];
		function setVar(var_name) {
			data.push({op:'set_var',vn:var_name});
		}
		function setVarIfEachSelected(var_name,selection) {
			data.push({op:'set_var_each',vn:var_name,pms:selection});
		}
		function setVarIfAnySelected(var_name,selection){
			data.push({op:'set_var_any',vn:var_name,pms:selection});
		}
		function setVarAsSum(var_name,selection) {
			data.push({op:'set_var_sum',vn:var_name,pms:selection});
		}
		function sortVarsDesc(vars) {
			data.push({op:'sort_vars_desc',pms:vars});
		}
		function setVarIfEachVarsDefined(var_name,vars) {
			data.push({op:'set_var_each_defined',vn:var_name,pms:vars});
		}

		try {
			eval(script);
		} catch(e) {
			if(window.preview) {alert('Błąd w warunku!');alert(e)};
		}
		
		return serialize(data);
	},
	checkCond:function(mode,clickobj) {
		clickobj = clickobj || {};
		var selected = [];
		var clicked = [];

		var idx = 0;
		$('.resp').filter(function(){
			selected[idx] = this.checked; 
			clicked[idx] = this.value === clickobj.value;
			++idx;
		});
		function info(txt) {
			$('#message_area').html(txt);
		}
		function msgbox(txt) {
			alert(txt);
		}
		try {
                    eval(this.data.cond);
		} catch(e) {
                    if(window.preview) {alert('Błąd w warunku!');alert(e)};
		}
	},
	list:function(){
            var ts = this;
            this.comm({_f_:'init_page'},function(d,s){render(d)});
            $('.resp').live('click',function(){ts.checkCond(0,this)});
	},
        options:function(opts) {
            if(undefined !== opts) {
                $.extend(options, opts);
            }
            return $.extend({},options);
        }
}
    window.TestInterface = Actions;
})(jQuery);