// localization.js
//
// Localization for common strings


// A quick little hack to unescape html
function unescapeHTML(html) {
   var htmlNode = document.createElement("DIV");
   htmlNode.innerHTML = html;
   if(htmlNode.innerText)
      return htmlNode.innerText; // IE
   return htmlNode.textContent; // FF
}

$(document).ready(function(){
	
	if ( typeof(common_strings) != 'undefined' )
		localization_controller.translated_strings = common_strings;
	else
		localization_controller.translated_strings = {};
		
	if ( typeof(language_strings) != 'undefined' )
		localization_controller.translated_langs = language_strings;
});

var localization_controller = {
	translated_strings: {},
	translated_langs: {},
	
	
	// Retranslate to new language via ajax
	retranslate_strings: function(to_language, callback) {
		
		// If we are translating the about page.
		page_type = $("meta[name='localization-template']").attr('content');	
		
		$.ajax({
			url: localization_url,
			data: {'language': to_language, 'page_type': page_type},
			dataType: 'json',
			type: 'get',
			success: function(data) {
				localization_controller.translated_strings = data.strings;
				localization_controller.translated_langs = data.languages;
				localization_controller.update_ui();
				update_language();
				
				// Set the selected language
				$('#lang_options > ul > li').removeClass('current_language');
				$('#lang_'+to_language).addClass('current_language');

				if (typeof(callback) !== 'undefined') {
					callback();
				}
			},
			error: function(data) {
				
			}
			
		});		
		
	},
	
	// Updates UI elements that are common among all site pages.
	update_common_ui: function() {
		var strings = localization_controller.translated_strings;
		
		// Language chooser
		$('#btn_lang_chooser').html(camel_case(strings['txt_language2'])+ '<img src="/static/img/lang-arrow-down.gif" alt="Select" />');
		
		// Footer
		$('#privacy_link').html(strings['txt_privacy']);
		$('#terms_link').html(strings['txt_terms']);
		$('#startown_link').html(strings['txt_startown']);
		$('#about_link').html(strings['txt_about']);
		
		// Nav bar
		// Camel case thse because we lower-cased them to translate better.
		$('#dashboard_link').html(camel_case(strings['txt_dashboard']));
		$('#sign_out_link').html(camel_case(strings['txt_logout']));
		$('#sign_in_link').html(camel_case(strings['txt_login']));
		
		// Light box
		$('#login_cancel').html(strings['txt_cancel']);  
		$('#login_head').html(strings['txt_google_login']);
		$('#login_description').html(strings['txt_login_description']);
		
		
	},
	
	update_about_page_ui: function() {
		var strings = localization_controller.translated_strings;
				
		$('#about_head').html(strings['txt_about_head']);
		$('#about_intro').html(strings['txt_about_intro']);
		$('#about_recognize_head').html(strings['txt_about_recognize_head']);
		$('#about_recognize').html(strings['txt_about_recognize']);
		$('#about_share_head').html(strings['txt_about_share_head']);
		$('#about_share').html(strings['txt_about_share']);
		$('#about_future_head').html(strings['txt_about_future_head']);
		$('#about_future').html(strings['txt_about_future']);		
	},
	
	update_home_page_ui: function() {
		var strings = localization_controller.translated_strings;
		$('#main_description').html(strings['txt_main_description']);
		$('#learnmore').html(strings['txt_getstarted']);
		$('#btn_creatchatroom').html(strings['txt_home_button']);
	},
	
	update_dashboard_ui: function() {
		var strings = localization_controller.translated_strings;
		
		$('#dashboard_head').html(strings['txt_dashboard_head']);
		$('#dashboard-startown-link').html(strings['txt_startown']);
	
	},
	
	update_chat_ui: function() {
		var link_to_chat = base_url + '/' + chat_hash;
		var strings = localization_controller.translated_strings;
		
		// Head
		$('#chataddresslabel p').html(strings['txt_chat_address']);
		$('#yourlanguage').html(strings['txt_language2']);
		$('#edit_chat_address').html(strings['txt_edit']);
		$('#submit_roomaddress').html(strings['txt_save']);
		
		// Sidebar
		$('#share-header').html(strings['txt_share']);
		$('#whoshere').html(strings['txt_users']);
		$('#label_nickname > label').html(strings['txt_nickname']);
		$('#sendchat_submit > button').html(strings['txt_send']);
		
		// Common
		$('#btn_close_share').html(strings['txt_close']);
		$('.cancellink > a').html(strings['txt_cancel']);		
		$('.cancel_button').html(strings['txt_cancel']);
		                            
		// Admin
		$('#print_transcript a').html(strings['txt_print_transcript']);
		$('#clear_chat_log a').html(strings['txt_clear_messages']);
		
		// Twitter		
		var twitter_username = unescapeHTML(strings['txt_twitter_username']);
		var twitter_password = unescapeHTML(strings['txt_twitter_password'])
		$('#header_twitter').html(strings['txt_twitter_head']);
		$('#twitter_username').val(twitter_username);
		$('#twitter_password').val(twitter_password);
		
		$('#tweet').val(strings['txt_twitter_message1'] + ' ' + link_to_chat + '. ' + strings['txt_twitter_message2']);
		
		$('#email_submit > button').html(strings['txt_send']);
		$('#twitter_submit > button').html(strings['txt_send']);         
		
		// Inactive chat
		$('#chat_timeout').html(strings['txt_chat_timeout']);
		$('#btn_continue').html(strings['txt_continue']);
		
		text_counter(140);
		
		// Email
		var email_name = unescapeHTML(strings['txt_email_name']);
		var email_friend = unescapeHTML(strings['txt_email_friend']);
		$('#header_email').html(strings['txt_email_head']);
		$('#email_yourname').val(email_name);
		$('#email_friendsemail').val(email_friend);
		
		// Errors
		$('#sendchat_error').html(strings['err_sending']);
		
		
		
		// Make sure the edit button gets translated
		if ( user_controller )
			user_controller.update_users();
		
	},
	
	// Update the localiation strings with the ones currently in
	// translated_strings
	update_ui: function() {
		// Update UI that appears on all pages
		localization_controller.update_common_ui();
		
		// Find out which page we are on and update that page's interface
		page_type = $("meta[name='localization-template']").attr('content');

		switch(page_type) {
			case 'chat':
				localization_controller.update_chat_ui();
				break;
			
			case 'home':
				localization_controller.update_home_page_ui();
				break;
				
			case 'dashboard':
				localization_controller.update_dashboard_ui();
				
			case 'about':
				localization_controller.update_about_page_ui();
				break;
				
			default:
				return
		}
		
	}
}
/*-------------------------------------------
index.js

Javascript pertaining to the main page 
-------------------------------------------*/
$(document).ready(function(){
	
	if($.browser.msie && parseFloat(jQuery.browser.version) < 7.0 ){
		window.location = 'unsupported';
	}
	
	// Hide trash cans.
  $('.trash').hide();
	$('#chatroom-title-qHHHH ~ div.trash').show();
    
	// Show trash can when highlighted.
	$('.chatroom').mouseenter(function() {
		$(this).children('.trash').show();
		
	}); 
	     
	$('.chatroom').mouseleave(function() {
		$('.trash').hide();
	                 
	});
	
	// Clear all chat messages
	$('.remove_chat').click(function(e) {
		e.preventDefault();            
		
		var strings = localization_controller.translated_strings;
		
		var r = confirm(strings['txt_dashboard_trash']);
		if ( r == true ) {            
			window.location = $(this).attr('href');
		} 
		             
		      
		return false;
	});
	 
	
	// Set the selected language
	$('#lang_options > ul > li').removeClass('current_language');
	$('#lang_'+users_language).addClass('current_language');

	$('#sign_in_link').click(function() {
		$('#lightlogin').show();
		$('#fade').show();
		
		return false;
	});      

	
	$('#btn_creatchatroom, #learnmore').click(function(e){
		e.preventDefault();
		
		$('#introducing').hide();
		$('#creating').show();
		
		// Tell App to Create a chat room

		$.ajax({
				url: create_chat_url,
				dataType: 'json',
				type: 'get',
				success: function(data) {
					// Redirect to the chatroom hash
					window.location = data[0].chat_hash;
				},
				error: function(data, textStatus, errorThrown) {
					// If there was an error message display it
					
					
					// Todo: better error message
					$('#creating').hide();
					$('#creating-error').show();
				}
		});

		return false;
	}); 
	
});     

//var translate_queue = new Array();

// Load Version 1 of google language api
google.load("language", "1");
google.setOnLoadCallback(initialize_language);

$(document).ready(function(){
	
	var language_shown = false;
	$('#btn_lang_chooser').click(function() {
		if ( language_shown ) {
			$('#lang_options').fadeOut('fast', function() {
				//$('#lang_chooser').width('65px');
				language_shown = false;
			});
		} else {
			$('#lang_options').fadeIn('fast');
			$('#lang_chooser').width('350px');
			language_shown = true;
		}
	});


	$('#lang_options > ul > li').click(function() {
		users_language = $(this).attr('id').substr(5,10);
		
		// Send it to the server updating the session.
		data = new Object();
		data.language = users_language;

		$.ajax({
			url: change_language_url, // Set in page request
			data: data,
			dataType: 'json',
			type: 'post',
			success: function(data) {
			},
			error: function(data) {
			}
		});

		// reset translations to original
		$('.chatname').css('height', '');
		$('.chatcontent p').each(function (i) {
			$(this).find('span.original_lang').remove();
			if ($(this).find('span').length > 0) {
				$(this).html($(this).find('span').find('span').remove().end().text());
			}
		});

		// Update my language
		if ( typeof(user_controller) != 'undefined' )
			update_clients_languages($('#select_language').val());

		// Translate interface elements to new language.
		localization_controller.retranslate_strings(users_language, function() {
			if ( typeof(message_controller) != 'undefined')
				translate_messages();
		});
		
		$('#lang_options').fadeOut('fast', function() {
			//$('#lang_chooser').width('65px');
			language_shown = false;
		});
	});


	$('#select_language').change(function(e) {
		e.preventDefault();
		users_language = $('#select_language').val();

		// Send it to the server updating the session.
		data = new Object();
		data.language = users_language;

		$.ajax({
			url: change_language_url, // Set in page request
			data: data,
			dataType: 'json',
			type: 'post',
			success: function(data) {

			},
			error: function(data) {
			}
		});

		// reset translations to original
		$('.chatname').css('height', '');
		$('.chatcontent p').each(function (i) {
			$(this).find('span.original_lang').remove();
			if ($(this).find('span').length > 0) {
				$(this).html($(this).find('span').find('span').remove().end().text());
			}
		});
		
		// Update my language
		if ( typeof(users_controller) != 'undefined')
			update_clients_languages($('#select_language').val());

		// Translate interface elements to new language.
		localization_controller.retranslate_strings(users_language, function() {
			translate_messages();
		});

		//translate_messages(translate_queue);
		//translate_messages();
	});
});

////////////////////
// Language
////////////////////
function initialize_language() {

	update_language();
	// Now that languages are set up we can fetch.
	if ( typeof(message_controller) != 'undefined')
		message_controller.init();
}

var langs = [];
function update_language() {


	langs = [];
	for ( key in localization_controller.translated_langs) { 
		langs.push({
			key:key,
			value: localization_controller.translated_langs[key]
		}); 
	}

	langs = langs.sort(function(a,b) { 
		if (a.key < b.key) { return -1; }
		if (a.key > b.key) { return 1; }
		return 0;
	});

	//ui_controller.clear_language_dropdown();
	for ( i in langs) {
		obj = langs[i];
		if ( google.language.isTranslatable(obj.key) ) {
			//ui_controller.add_language_to_dropdown(obj.key, obj.value);
		}
	}

	// Set default language to english, if not already set
	if ( users_language == "" ) {
		users_language = "en";
	}

	// Now update the drop down
	$('#select_language').val(users_language);
}

function translate_messages(queue) {

	
	$('#select_language').attr('disabled', 'disabled');

	if (typeof(queue) === 'undefined') {
		queue = message_controller.all_messages.slice();
	}

	var trans_query = '';
	var url_length;
	var max_url_length = 1000;
	var request_pos = [];
	var queue_length = queue.length;
	var queue_pos = 0;
	var request_number = 0;
	var request_pos_hold = new Array();
	
	while(queue_pos < queue_length)
	{

		url_full = false;
		url_length = 130; //length of base url plus JQuery added parameters
		request_pos = [];
		trans_query = '';
		
		while(!url_full && queue_pos < queue_length){	
			if (queue[queue_pos].language != users_language) {
				
				var q = '&q='+encodeURI(queue[queue_pos].content)+'&langpair='+queue[queue_pos].language+'|'+users_language;
				if((url_length+q.length) < max_url_length)
				{
					trans_query += q;
					url_length += q.length;
					request_pos.push(queue_pos);
					queue_pos++;
				}
				else
				{
					url_full = true;
				}
			}
			else
			{
				queue_pos++;
			}
		}

		if (trans_query !== '') {
		
			var at_bottom = message_controller.at_bottom;
			var request_key = '&q='+request_number+'&langpair=en|en';
			request_pos_hold[request_number] = new Array(request_pos.length);
			request_pos_hold[request_number] = request_pos;
			request_number++;
			
			$.ajax({
				complete: function() {
					$('#select_language').removeAttr('disabled');
				},
				dataType: 'jsonp',
				success: function(data) {
					if (data.responseStatus === 200) {
						
						var req_key = data.responseData[0].responseData.translatedText;
						
						for(i=0;i<request_pos_hold[req_key].length;i++)
						{
							var queue_pos = request_pos_hold[req_key][i];
							var msg = queue[queue_pos];
							
							if (msg.type != 'timestamp') {
								// Find the right message based on the ID of the current_message
								var id = 'message-'+msg.timestamp;
								var name = '';
	
								if ( msg.type == 'nick_change' ) {
									// Keep the untranslated nickname
									split_string = msg.content.split('to ', 1);
									name = split_string[1];
									msg.content = split_string[0] + 'to ';
								}
								
								if ( data.responseData[i+1].responseStatus === 200 ) {
									if ( msg.origin == 'user' ) {
										var lang = localization_controller.translated_langs[msg.language];
										$('div[id='+id+'] .chatcontent').html('<p>'
																		 +data.responseData[i+1].responseData.translatedText
																		 +'<span class="translated">'
																		 +msg.content
																		 +'<span class="original_lang">('
																		 +lang
																		 +')</span></span></p>');
									} else {
										if ( msg.type == 'nick_change' ) {
											$('div[id='+id+'] .chatcontent').html('<p>'
																			+data.responseData[i+1].responseData.translatedText
																			+name
																			+'</p>');
										} else {
											$('div[id='+id+'] .chatcontent').html('<p>'
																			+data.responseData[i+1].responseData.translatedText
																			+'</p>');
										}
									}
								}
	
								// Set the height of the name to match the line
								var chatcontent = $('div[id='+id+'] > .chatcontent');
								var chatname = $('div[id='+id+'] > .chatname');
								$(chatname).height($(chatcontent).height());
	
							}
						}
						message_controller.scroll_to_bottom(at_bottom);
					}
				},
				type: "GET",
				url: 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0'+request_key+trans_query
			});
		} else {
			$('#select_language').removeAttr('disabled');
		}
	}
}
var timer = null;
var users_language = 'en';


window.onload = adjust_height;
window.onresize = adjust_height;
function adjust_height() {	
	var screenheight = $(window).height();
	var headerheight = 120;
	var footerheight = 180;
	var chatheight = screenheight - (headerheight + footerheight);
	$('.chat').height(chatheight);
	
	var screenwidth = $(window).width();
	if(screenwidth < 600){
		$('.chat').width(screenwidth); 
		$('.chatcontent').width(screenwidth - 120);
		$('#sendchat_entry').width(screenwidth - 130);
	} else {
		screenwidth = 590;
		$('.chat').width(screenwidth); 
		$('.chatcontent').width(screenwidth - 120);
		$('#sendchat_entry').width(screenwidth - 130);
	}
	
}


var all_messages = new Array();
var current_message;

// this value of last_timestamp will fetch the last 30 mins of activity
var last_timestamp = (Number(new Date()) - (1000 * 60 * 30)) / 1000; //1245474124.888594;//0;
var first_timestamp = last_timestamp;

function parse_timestamp(data) {

	for (i = 0; i < data.length; i++)
	{
		if (data[i].timestamp > last_timestamp)
		{
			last_timestamp = data[i].timestamp;
		}
	}
}


/* 
	if the last timestamp is greater than the global variable last_timestamp
	set the new last_timestamp
	
	the last_timestamp can be from 2 sources messages or server_messages	
*/
function set_last_timestamp(data)
{
	last_index = data.length - 1;
	if(last_index >= 0 && data[last_index].timestamp > last_timestamp)
	{
		last_timestamp = data[last_index].timestamp;
	}
}



function stop() {
	clearTimeout(timer);
	timer = null;
}



$(document).ready(function(){
	google.language.getBranding('branding');

	if (typeof(user_controller) != 'undefined')
		user_controller.update_users();
	
		
	$('#print_transcript a').click(function (e) {
		e.preventDefault();
		window.open($(this).attr('href'));
		return false;
	});
	
	$('#privacy_link, #terms_link, #about_link, #startown_link, #lifechurch_link').click(function(e) {
		e.preventDefault();      
		window.open($(this).attr('href'));
		return false;
	});       
	

	$('#btn_continue button').click(function(e) {
			message_controller.restart()
	});
});
 

//---------------------------------------
//  Convert string to camel case
//---------------------------------------
function camel_case(string) {    
	if ( string ) {
		string = string.toLowerCase();
		var end = string.substr(1)
		var camelCase = string.substr(0,1);
		camelCase = camelCase.toUpperCase();
		return camelCase.concat(end);   
	}
}

//--------------------------------------------------------
// Take a message and update the user's language
// 
//--------------------------------------------------------
function update_message_senders_language(message) {
	// Loop through all users, update the user who sent
	// this message by setting their language to the language
	// of the sent message.
	for (var i = 0; i < users.length; i++) {
		var user = users[i];
		if ( user.nickname == message.nickname ) {
			// Update user's language
			user.language = message.language;
			user_controller.update_users();
			return;
		}
	}	
}

function update_clients_languages(language) {
	for (var i = 0; i < users.length; i++) {
		var user = users[i];
		if ( user.nickname == client.nickname ) {
			user.language = language;
			user_controller.update_users();
		}
	}
}


function language_name(short_name) {
	
	for (var key in google.language.Languages) {
		if ( google.language.Languages[key] == short_name ) {
			return camel_case(String(key));
		}
	}
	return "Unknown";
	
}
