var queue = new Array();
var updateTimer = null;
var dataTransferInterval = 30000;
var JSON = JSON || {};
var requiredQuestions=null;
var completedQuestions=new Array();

jQuery(document).ready(function() {
	updateTimer = setInterval("sendResponses()", dataTransferInterval);
});

function sendResponses() {

	if (queue.length > 0) {
		Seam.Remoting.startBatch();
		while (queue.length > 0) {
		var responses = queue.shift();
		Seam.Component.getInstance("surveyInstanceAction").readResponse(
				responses.qid, JSON.stringify(responses.values), responses.timestamp);
		}
		Seam.Remoting.executeBatch();
	}
}
var fillInQueue = new Array();
function fillInAnswersSI() {
	requiredQuestions=new Array();
	jQuery("[id^='questionWrapper_']").each(function() {
		var id=jQuery(this).attr('id').substring(16);
		fillInQueue.push(id);
		if (jQuery(this).find(".qRequiredSI").length>0)
		{
			requiredQuestions.push(id);
		}
	});
	fillInDraw();
}

function fillInDraw() {
	var currentQID = null;
	if (fillInQueue.length > 0) {
		Seam.Remoting.startBatch();
		while (fillInQueue.length > 0){
		currentQID = fillInQueue.shift();
		Seam.Component.getInstance("surveyInstanceAction").readQuestion(
				currentQID, callbackFillInDraw);
		}
		Seam.Remoting.executeBatch();
	}
}
function callbackFillInDraw(data) {
	if (data != null) {
		//var response = eval("({\"values\":" + data + "})");	
		var response = eval("("+data+")");
		var qid=response.qid;
		jQuery.each(response.values, function(i, item) {
			// find answer element
				if (item.c == "0") {
					var answer = jQuery("#questionWrapper_" + qid).find(
							"#answer_" + item.r);
				} else {
					var answer = jQuery("#questionWrapper_" + qid).find(
							"#answer_" + item.r + "-" + item.c);
				}
				// set answer element value
				if (answer.attr('tagName').toLowerCase() == "a") { // checkbox
																	// or radio
																	// button
					if (answer.hasClass("siAnswerRadioOff")) {
						answer.removeClass("siAnswerRadioOff").addClass(
								"siAnswerRadioOn");
						var otherInput=answer.find('input');
						if (otherInput.length>0)
						{
							otherInput.val(item.v);
						}
					}
					if (answer.hasClass("siAnswerCheckOff")) {
						answer.removeClass("siAnswerCheckOff").addClass(
								"siAnswerCheckOn");
						var otherInput=answer.find('input');
						if (otherInput.length>0)
						{
							otherInput.val(item.v);
						}
					}
					if (answer.hasClass("siAnswerLikertOff")) {
						answer.removeClass("siAnswerLikertOff").addClass(
								"siAnswerLikertOn");
					}
				} else {// text value
					answer.val(item.v);
				}
			});
	}
	fillInDraw();
}

function siRecordAnswer(questionId, styleClass, answerType) {
	var answers = jQuery("#questionWrapper_" + questionId).find(
			"[id^='answer_']");

	var record = false;
	var obj = new Array();
	obj.qid = questionId;
	obj.values = [];
	
	//check which answers are checked
	jQuery.each(answers, function(i, item) {
		// read r(row),c(column) values
			var jThis=jQuery(this);
			var id = jThis.attr("id");
			var r = id.substring(id.indexOf("_") + 1);
			var c = "";
			if (r.indexOf("-") != -1) {
				c = r.substring(r.indexOf("-") + 1);
				r = r.substring(0, r.indexOf("-"));
			}
			var v = "";
			var tempValues = {};
			record = false;
		switch (answerType) {
			case "text":
				// fill in values with typed string
				var current = jQuery.trim(jThis.val());
				if (current != "") {
					// storedValues = storedValues + "{r:\"" + r +
					// "\",c:\"0\",v:\""+ current + "\"},";
					tempValues.r = r;
					tempValues.c = 0;
					tempValues.v = current;
					record = true;
				}
				break;
			case "simple":
				if (jThis.hasClass(styleClass + "On")) {
					// storedValues = storedValues + "{r:\"" + r +
					// "\",c:\"0\",v:\"\"},";
					tempValues.r = r;
					tempValues.c = 0;
					tempValues.v = "";
					record = true;
					var otherInput=jThis.find('input');
					if (otherInput.length>0)
					{
						tempValues.v = otherInput.val();
					}
					
				}
				break;			
			case "matrix_simple":
				if (jThis.hasClass(styleClass + "On")) {
					// storedValues = storedValues + "{r:\"" + r + "\",c:\"" + c +
					// "\",v:\"\"},";
					tempValues.r = r;
					tempValues.c = c;
					tempValues.v = "";
					record = true;
				}
				break;
			case "matrix_text":
				var current = jQuery.trim(jThis.val());
				if ((current != "") && (current != "Off")) {
					// storedValues = storedValues + "{r:\"" + r + "\",c:\"" + c +
					// "\",v:\"" + current + "\"},";
					tempValues.r = r;
					tempValues.c = c;
					tempValues.v = current;
					record = true;
				}
				break;
		}
		//if (record) {
			obj.values = obj.values.concat(tempValues);
			obj.timestamp=(new Date).getTime();
			//handle required questions
			completedQuestions.push(obj.qid); 
		//}
	});

	//if question already in queue, update it's answers
	var found = false;
	jQuery.each(queue, function(i, item) {
		if (item.qid == obj.qid) {
			item.values = obj.values;
			item.timestamp=(new Date).getTime();
			found = true;
		}
	});
	
	//else, add it to queue
	if (!found) {
		queue.push(obj);
	}
}

function traverse(data, i) {
	if (typeof data == "object") {

		jQuery.each(data, function(k, v) {
			traverse(v, i);
		});
		jQuery("body").append("<br/>");
	} else {
		jQuery("body").append("'" + data + "'; ");
	}
}
// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function(obj) {

	var t = typeof (obj);
	if (t != "object" || obj === null) {

		// simple data type
		if (t == "string")
			obj = '"' + obj + '"';
		return String(obj);

	} else {

		// recurse array or object
		var n, v, json = [], arr = (obj && obj.constructor == Array);

		for (n in obj) {
			v = obj[n];
			t = typeof (v);

			if (t == "string")
				v = '"' + v + '"';
			else if (t == "object" && v !== null)
				v = JSON.stringify(v);
 
			json.push((arr ? "" : '"' + n + '":') + String(v));
		}

		return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
	}
};

function checkAnswers(questionId) {
	
	var isMatrix=false;
	var answersTotal=0;
	
	var question=jQuery("#questionWrapper_" + questionId);
	if (question.find(".answersMatrix").length>0)
	{
		isMatrix=true;
	}
	
	if (isMatrix)
	{
		var rows=question.find("tr:gt(0)");
		jQuery.each(rows, function(i,item){
			var answers = jQuery(this).find("[id^='answer_']");
			answersTotal=countAnswers(answers);
			if (answersTotal==0)
			{
				return false;
			}
			
		});
	}
	else
	{
		var answers = question.find("[id^='answer_']");
		//check which answers are checked
		answersTotal=countAnswers(answers);
		
	}
	return answersTotal;
}
function countAnswers(answers)
{
	var answersCount=0;
	jQuery.each(answers, function(i, item) {
		if (jQuery(this).attr("tagName").toLowerCase()=="a")
		{
			if (jQuery(this).attr("class").indexOf("On")>0)
			{
				answersCount++;
			}
		}
		else
		{
			if (jQuery.trim(jQuery(this).val())!="")
			{
				answersCount++;
			}
		}
	});
	return answersCount;
}
function verifyRequired()
{
	jQuery(".qRequiredSI").addClass("hidden");
	var proceed=true;
	var firstProblem=null;
	for (var i=0;i<requiredQuestions.length;i++)
	{
		var completedAnswers=checkAnswers(requiredQuestions[i]);
		if (completedAnswers==0)
		{
			var question=jQuery("#questionWrapper_"+requiredQuestions[i]);
			question.find(".qRequiredSI").removeClass("hidden");
			if (firstProblem==null)
			{
				firstProblem=question;
			}
			proceed=false;
		}
	}
	if (firstProblem!=null)
	{
		jQuery(window).scrollTop(firstProblem.offset().top-40);
		messagesShow(requiredError);
	}
	return proceed;
}

function getVisitorInformation()
{
	var os=navigator.platform;
	var resolution=screen.width+"px x "+screen.height+"px";
	Seam.Component.getInstance("surveyInstanceAction").logRespondentInfo(os,resolution,logRespondentInfoCallback);
}
function logRespondentInfoCallback()
{
	
}

/*
 * set survey width according to browser resolution
 */
	
function contentAutoresize(surveyType)
{	
	if (surveyType=="1")
	{
		if (screen.width>600)
		{
			jQuery(".sInstance").css( {"maxWidth" : "600px"});
		}
	}
	else
	{
		if (screen.width>925)
		{
			jQuery(".sInstance").css( {"maxWidth" : "945px"});
		}
	}
	/*iPhoneOrientation();
	window.onorientationchange = function() {iPhoneOrientation();};
	setTimeout(scrollTo, 0, 0, 1);*/
}
function iPhoneOrientation()  
{  
    switch(window.orientation){  
    	case 0: jQuery(".sInstance").css( {"width" : "320px","height" : "480px"}); 
        break;  
  
        case -90: 
        case 90: jQuery(".sInstance").css( {"width" : "480px","height" : "320px"});  
        break;  
    }
  
}
function moveStarInline(wrapper)
{
	var starWrapper=jQuery("#"+wrapper+" .starWrapper");
	var star=starWrapper.html();
	var lastTextBlock=starWrapper.prev();
	lastTextBlock.append(star);
	starWrapper.remove();
}
function switchToEditable(el)
{
	closeCurtain(); 
	el.addClass('buttonNormalInlineDisabled').removeClass('buttonNormalInline'); 
	jQuery("#messageReadOnly").addClass("hidden");
	jQuery("#messageReadOnlyOff").removeClass("hidden");
}
