<?xml version="1.0" encoding="UTF-8" ?>
<Module>
 <ModulePrefs title="My Global Content 1.0">
   <Require feature="opensocial-0.7"/>
   <Require feature="dynamic-height"/>
 </ModulePrefs>
 <Content type="html">

 <![CDATA[

<div id="error_div"></div>
<form id='lt_form'>
	<div id="form_div"></div>
</form>
<div id="content_div"></div>

 <script type="text/javascript">

 var uid;
 var errorMessage = "";
 var email = "";
 var password = "";
 var wids=new Array(); 
  var selected2wid=new Array(); 
  var wid2code=new Array(); 
  
  var is_owner;
  var persist_wid=0;
  var persist_code=0;
  
  var selected_wid; // wid selected by the user to show
 
 start();
 
 function isOwnerResponse(data) {
	var viewer = data.get("isOwner").getData();
	is_owner = viewer && viewer.isOwner() || false;
	
	if (is_owner) {
		var req = opensocial.newDataRequest();
		req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), 'viewer');
		req.send(getUid);
	}
	else {
		viewerGetWidget();
	}	

};

 function isOwner() {
	var req = opensocial.newDataRequest();
	req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), "isOwner");
	req.send(isOwnerResponse);
};

 
 // Cache setting should be optimized.
function makeCachedRequest(url, callback, params, refreshInterval) {
	var ts = new Date().getTime();
	var sep = "?";
	if (refreshInterval && refreshInterval > 0) {
		ts = Math.floor(ts / (refreshInterval * 1000));
	}
	if (url.indexOf("?") > -1) {
		sep = "&";
	}
	url = [ url, sep, "nocache=", ts ].join("");
	gadgets.io.makeRequest(url, callback, params);
}

 
 // Accessing LT data
 function makeDOMRequest(secure, stage ,uid) {    
	var params = {};  
	if (secure)
		params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
	params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;  
	
	document.getElementById('error_div').innerHTML = "<img src='http://lingotip.com/for-pay/ed_files/progressing.gif' />";
	if (stage=="chekUid") {
		var url = "http://lingotip.com/for-pay/embed/OSgetWids.php?osuid="+uid+"&osname=orkut";
		makeCachedRequest(url, ltGetWids, params, 0);
	}
	else if (stage=="ltReg") {
		var url = "http://lingotip.com/for-pay/embed/OSgetWids.php?osuid="+uid+"&osname=orkut&email="+email+"&password="+password;
		makeCachedRequest(url, ltGetWids, params, 0);
	}
	else {
		wid = uid; // access is through wid and not uid for the widget itself.

		if (selected==0) { // Init
			//var url = "http://lingotip.com/for-pay/embed/widgetInit.php?widget_id=189";  
			//var url = "http://lingotip.org/for-pay/embed/OSget.php?widget_id="+wid+"&code="+wid2code[wid];  
			var url = "http://lingotip.com/for-pay/embed/widgetInit.php?widget_id="+wid+"&code="+wid2code[wid];  
			makeCachedRequest(url, xmlGet, params, 0);  // gadgets.io.makeRequest(url, xmlGet, params);

		}
		else {

			//var url = "http://lingotip.com/for-pay/embed/widgetInit.php?widget_id=189&selected="+selected;  
			//var url = "http://lingotip.org/for-pay/embed/OSget.php?widget_id="+wid+"&code="+wid2code[wid]+"&selected="+selected;  
			var url = "http://lingotip.com/for-pay/embed/widgetInit.php?widget_id="+wid+"&code="+wid2code[wid]+"&selected="+selected;  
			makeCachedRequest(url, xmlGet, params, 0);  //gadgets.io.makeRequest(url, xmlGet, params);	
		}
	}
};

 
 // OWNER creating the content list from LT data
 function ltGetWids(obj) {
	// Get XML
	var domdata = obj.data;
	var str = "";
	var html = "";
	
	nodeList = domdata.getElementsByTagName("general").item(0).childNodes;
	for (var j = 0; j < nodeList.length ; j++) {
		var node = nodeList.item(j);
		if (node.nodeName == "validated") {
			error = node.firstChild.nodeValue;
		}
		if (node.nodeName == "uid_exist") {
			var uid_exist = node.firstChild.nodeValue;
		}
	}
	
	var wid_index = 0;
	var itemList = domdata.getElementsByTagName("item");
	for (var i = 0; i < itemList.length ; i++) { 
		var nodeList = itemList.item(i).childNodes;

		for (var j = 0; j < nodeList.length ; j++) {
			var node = nodeList.item(j);
			if (node.nodeName == "id") {
				var id = node.firstChild.nodeValue;
				selected2wid[i] = id; // global array to keep widget_id
				wids[wid_index] = node.firstChild.nodeValue;
				wid_index++;
				str += node.firstChild.nodeValue + ", ";
			}
			if (node.nodeName == "text") {
				var text = node.firstChild.nodeValue;
			}
			if (node.nodeName == "code") {
				wid2code[id] = node.firstChild.nodeValue;
			}
		}
		html += '<input type="radio" name="wid" onclick="getWidget('+ id +');"  />&nbsp;' +id+ ', '  +wid2code[id] + '<br/>';
	}

	if (wid_index) {
		document.getElementById('error_div').innerHTML = "";
		document.getElementById('form_div').innerHTML = html;
	}
	else if (uid_exist=="NO") {
		document.getElementById('error_div').innerHTML = "UID not not exist";
	}
	else {
		document.getElementById('error_div').innerHTML = "WID not found";
	}
	gadgets.window.adjustHeight();
	
	// IF UID not registered on LT then call ltReg()
	
	// IF XML is full and WIDs are fetched then create a form from the WIDs
	// USE PERSIST data to save specific WID.
	
 }
 
 // Create a form and gegister the new user on LT using OAuth
 function ltReg() {
	var html = "";
	html += "<br/>Enter email: " + "<input id='email' name='email' value='" + email + "' /><br/>";
	html += "Enter password: " + "<input id='password' type='password' name='password' value='" + password + "' /><br/>";
	html += "<input id='submit' type='submit' name='submit' onclick='OAuth_process()' /><br/>";
	
	document.getElementById('form_div').innerHTML = html;
}

// Check if user's exists in LT then do all the work
function chekUid(uid) {
	makeDOMRequest(true, "chekUid", uid);
}


// LT registration process called back from ltReg form
function OAuth_process() {
	
	if (document.getElementById("email")!=null)
		email = document.getElementById("email").value;
	if (document.getElementById("password")!=null)
		password = document.getElementById("password").value;

	if (errorMessage != "") 
		document.getElementById('error_div').innerHTML += errorMessage;
	
	makeDOMRequest	(true, "ltReg", uid);
 	
}

// OWNER main activity
function getUid(dataResponse) {
	 var viewer = dataResponse.get('viewer').getData();

	if (is_owner) {
		uid = viewer.getId() ;
		chekUid(uid);
	}

	// document.getElementById('error_div').innerHTML += uid + "<br/>";
	
};


 function start() {
 	isOwner();
	if (errorMessage != "0" && errorMessage != "")
		document.getElementById("error_div").innerHTML = errorMessage;
  };

  
/*******************************************
 ACTUAL CONTACT WITH LT SERVER
 *******************************************/
 var mode="";
var selected;

var myLangID=new Array(); 
var myText=new Array(); 
var myLangName=new Array(); 

// VIEWER initial part
function viewerGetWidget() {
	mode = "init";
	selected = 0;
	
	getRequest();
}

// OWNER initial part
function getWidget(wid) {

	mode = "init";
	selected = 0;
	selected_wid = wid;
	
	makeDOMRequest(false, "main", wid);
	
	setRequest(wid, wid2code[wid]);
}

// Swithing languages activity
function getLang() {    
	var lang_obj = document.getElementById("langs");

	var opt_id = lang_obj.options[lang_obj.selectedIndex].value;
	
	selected = opt_id;
	mode = "translation";
	
	var wid = selected_wid;
	makeDOMRequest(false, "main", wid);
};

// Getting the widgetInit.php XML from LT
function xmlGet(obj) {    
	
	var html = "";
	var error = "0";

	// Get a list of the <req_lang> element nodes in the file
	
	var domdata = obj.data;
	
	nodeList = domdata.getElementsByTagName("error").item(0).childNodes;
	for (var j = 0; j < nodeList.length ; j++) {
		var node = nodeList.item(j);
		if (node.nodeName == "error") {
			error = node.firstChild.nodeValue;
		}
	}
	nodeList = domdata.getElementsByTagName("gui").item(0).childNodes;
	for (var j = 0; j < nodeList.length ; j++) {
		var node = nodeList.item(j);
		if (node.nodeName == "align") {
			var align = node.firstChild.nodeValue;
		}
	}
	if (error == "0" ) {
		if (mode=="init") {
			html = "<h2>LT2</h2>";
			html += "<select  id='langs'  onchange='getLang();' >";
			
			// Building menue for source language
			nodeList = domdata.getElementsByTagName("src_lang").item(0).childNodes;
			for (var j = 0; j < nodeList.length ; j++) {
				var node = nodeList.item(j);
				if (node.nodeName == "src_text") {
					var src_text = node.firstChild.nodeValue;
					if (align=="right")
						src_text = "<div style='align:right;direction:rtl' >" + src_text + "</div>"
					myText[0] = src_text;
				}
				if (node.nodeName == "lang_name") {
					var src_lang_name = node.firstChild.nodeValue;
					myLangName[0] = src_lang_name;
				}
				if (node.nodeName == "lang_id") {
					var src_lang_id = node.firstChild.nodeValue;
					myLangID[0] = src_lang_id;
				}
			}
			html += "<option value='" + src_lang_id +"' >" + src_lang_name + "</option>";
		}

		// Retrieving data from LT XML on language selection
		var itemList = domdata.getElementsByTagName("req_lang");
		for (var i = 0; i < itemList.length ; i++) { 
			// For each <req_lang> node, get child nodes.
			var nodeList = itemList.item(i).childNodes;

			// Loop through child nodes. Extract data from the text nodes that are
			// the children of the associated name, price, and calories element nodes.
			for (var j = 0; j < nodeList.length ; j++) {
				var node = nodeList.item(j);
				if (node.nodeName == "lang_name") {
					var lang = node.firstChild.nodeValue;
					myLangName[i+1] = lang;
				}
				if (node.nodeName == "lang_id") {
					var lang_id = node.firstChild.nodeValue;
					myLangID[i+1] = lang_id;
				}
				if (node.nodeName == "cur_text") {
					var cur_text = node.firstChild.nodeValue;
					if (align=="right")
						cur_text = "<div style='align:right;direction:rtl' >" + cur_text + "</div>"
					myText[i+1] = cur_text;
				}
				if (node.nodeName == "lang_exist") {
					var lang_exist = node.firstChild.nodeValue;
				}
			}
			if (mode=="init") {
				//html += "<option id='lang_id"+i+"' onclick='getLang();'  value=''" + lang_id +"' >" + lang + "</option>";
				disabled =  (lang_exist==0) ? "disabled" : ""; 
				html += "<option onclick='getLang();' " + disabled + " value='" + lang_id +"' >" + lang + "</option>";
			}
			else if (mode=="translation") {
			}
			else {
			}
		}

		if (mode=="init") {
			html += "</select>";
			document.getElementById('form_div').innerHTML = html;
			
			document.getElementById('content_div').innerHTML = src_text;
		}
		else {
			var lang_obj = document.getElementById("langs");
			//var opt_id = lang_obj.options[lang_obj.selectedIndex].value;
			document.getElementById('content_div').innerHTML = myText[lang_obj.selectedIndex]; 
		}
		
		document.getElementById('error_div').innerHTML = (error=='0') ? "" : error;
		gadgets.window.adjustHeight();
	}
	else
		document.getElementById('error_div').innerHTML = error;
}


/*****************************************************************
 PERSIST DATA HANDLING WID&CODE SAVE&REQUEST
 *****************************************************************/
function setRequest(wid, code) {
	var data = {wid : wid, code: code}
	var req = opensocial.newDataRequest();
	
	//req.add(req.newUpdatePersonAppDataRequest("VIEWER", "ugc", gadgets.json.stringify(data)), "setData");
	//req.send(validateRequest);
	
	req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, "ugc", gadgets.json.stringify(data)), "setData");
	req.send(validateRequest);
}

function validateRequest(response) {
	var req = opensocial.newDataRequest();
	
	if (response.get("setData").hadError()) {
		/* The update failed ... insert code to handle the error */
		if (response.get("setData").getErrorCode() == opensocial.ResponseItem.Error.UNAUTHORIZED) {
 
			/** Looks like the set request was not authorized, put code to handle this case here **/
			errorMessage = "Access control lists (ACLs) error";
		}
		else if (data.get("setData").getErrorCode() == opensocial.ResponseItem.Error.FORBIDDEN) {
 
			/** Looks like the request went over quota, put code to handle this case here **/
			errorMessage = "Quota exceeded";
		}
		else
			errorMessage = "Failed to Store OWNER information";
	} 
}

function getRequest() {
	var req = opensocial.newDataRequest();

	if(is_owner) {
		req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER),"getViewer");
		req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER,"ugc"),"getData");
	}
	else {
		req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER),"getViewer");
		req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.OWNER,"ugc"),"getData");	
	}
	req.send(getResponse);
}

function getResponse(data) {

	var viewer = data.get("getViewer").getData();
	var testData = data.get("getData").getData()[viewer.getId()]["ugc"];

	 var unescapedTestData = gadgets.util.unescapeString(testData);
	var testObject = gadgets.json.parse(unescapedTestData);

	if (errorMessage != "")
		document.getElementById("error_div").innerHTML = errorMessage;
	else {
		//document.getElementById("error_div").innerHTML = testObject.wid + ", " + testObject.code ;
		persist_code = testObject.code;
		persist_wid = testObject.wid;
		
		selected_wid = persist_wid;
		wid2code[selected_wid] = persist_code;
		if (persist_wid)
			makeDOMRequest(false, "main", selected_wid);	
		else {
			errorMessage = "Application was not configured yet";
			document.getElementById("error_div").innerHTML = errorMessage;
		}
	}
}


  </script>
  
  ]]>
  </Content>
</Module>
