/**
 * @author alex
 */
 /*CLOUD_ONLY*/
var LT = {};
LT.isCloud = true;
LT.baseSecureUrl = "https://ssl.loudtalks.net/";
LT.pages = {
	home: {
		init: function(){
			var _this = this;
			LT.$("domain_name").innerHTML = LT.domain;
			LT.$("go_link").onclick = function(){
				if (LT.$('network_name_selector').value.length > 3) 
					_this.goTo(LT.$('network_name_selector').value);
				else 
					LT.$('network_name_selector').focus();
				return false;
			}
			LT.$('network_name_selector').onkeydown = function(e){
				if (window.event) 
					e = window.event;
				var code = (e.keyCode != undefined) ? e.keyCode : e.which;
				if (code == 13) {
					LT.$("go_link").onclick.call();
				}
			}
			LT.$("signup_form").onsubmit = function(){
				_this.signUp();
				return false;
			}
			LT.$("name").onblur = function(){
				_this.validateNetworkName(this.value);
			}
			LT.$("name").onfocus = function(){
				LT.$("network_hint").innerHTML = LT.L('network_name_hint');
				LT.$("network_hint").className = "hint";
			}
			LT.$("admin_name").onblur = function(){
				LT.$("admin_name_hint").innerHTML = '&nbsp;';
			}
			LT.$("admin_email").onblur = function(){
				LT.$("admin_email_hint").innerHTML = '&nbsp;';
			}
			LT.$("admin_name").onfocus = function(){
				LT.$("admin_name_hint").innerHTML = LT.L('real_name_hint');
			}
			LT.$("admin_email").onfocus = function(){
				LT.$("admin_email_hint").innerHTML = LT.L('admin_email_hint');
			}
		},
		goTo: function(network){
			LT.redirect("http://" + network + "." + LT.domain);
		},
		validateNetworkName: function(network){
			if (network.length < 5) {
				LT.$("network_hint").innerHTML = LT.L('name_is_too_short');
				LT.$("network_hint").className = "hint error";
				return false;
			}
			if (!/^[a-zA-Z0-9]{5,40}$/.test(network)) {
				LT.$("network_hint").innerHTML = LT.L('bad_network_name');
				LT.$("network_hint").className = "hint error";
				return false;
			}
			LT.API.checkNetworkName(function(data){
				if (data.status == "OK") {
					LT.$("network_hint").innerHTML = LT.L('ok_name');
					LT.$("network_hint").className = "hint accept";
				}
			}, network);
			return true;
		},
		signUp: function(){
			var name = LT.$("name").value;
			var admin_name = LT.$("admin_name").value;
			var admin_email = LT.$("admin_email").value;
			// validate
			switch (true) {
				case name == "" || name.length < 5:
					LT.message.show(LT.L('name_is_too_short'), 3000);
					LT.$("name").focus();
					return;
				case !/^[a-zA-Z0-9]{5,40}$/.test(name):
					LT.message.show(LT.L('bad_network_name'), 3000);
					LT.$("name").focus();
					return;
				case admin_name == "" || admin_name.length < 2:
					LT.message.show(LT.L('real_name_hint'), 3000);
					LT.$("admin_name").focus();
					return;
				case admin_email == "" || !/^[-_a-zA-Z0-9!$%^&*|\/:.~#]+@(?:[-_a-zA-Z0-9\.]+\.)+?[a-zA-Z]{2,4}$/.test(admin_email):
					LT.message.show(LT.L('invalid_admin_email'), 3000);
					LT.$("admin_email").focus();
					return;			
			}
			LT.network_name = name;
			LT.API.signup(function(data){
				LT.$("signup_form").style.display = "none";
				LT.$("signup_success").style.display = "block";
				LT.$("page_title").innerHTML = LT.L('great_it_worked');
				LT.$("network_link_1").href = "http://" + LT.network_name + "." + LT.domain + "/";
				LT.$("network_link_2").href = "http://" + LT.network_name + "." + LT.domain + "/";
				LT.$("download_windows").href = "http://" + LT.network_name + "." + LT.domain + "/download/" + LT.L('desktopSetupName');
				LT.$("download_windows_mobile").href = "http://" + LT.network_name + "." + LT.domain + "/download/"  + LT.L('mobileSetupName');
			}, name, admin_name, admin_email);
			
		}
	},
	setup: {
		_status: null,
		init: function() {
			var _this = this;
			LT.API.getAccountStatus(function(data){
				if (data.status.service_id > 0) {
					LT.redirect("dashboard.htm?completed");
				}
				_this._status = data.status;
				_this._services = {};
				for (var si = 0; si < data.services.length; si++) {
					_this._services[data.services[si].id] = data.services[si];
				}
				if (data.orders.length) {
					LT.$('step_title').innerHTML = LT.L('confirm_your_order');
					LT.$show("orders_container");
					LT.$hide("service_plans_container");
					_this.renderOrder(data.orders[0]);
					LT.API.getPaymentOptions(function(data) {
						_this._options = data;
						_this.displayPaymentOptions(data);
					}, data.orders[0].order_number);
				} else {
					LT.$('step_title').innerHTML = LT.L('select_service_plan');
					LT.$show("service_plans_container");
					LT.$hide("orders_container");
					_this.renderServicePlans(data.services);
				}
				//_this.displayStatus(data.status);
				//LT.billingType != "none"

			});
		},
		displayPaymentOptions: function(options) {
			LT.pages.payment._options = options;
			LT.pages.payment._order = options.orders[0];
			LT.pages.payment.renderBillTo(options.orders[0]);
			LT.pages.payment.renderPaymentOptions(options.billingMethods);
			//LT.pages.payment.displayPaymentOptions(data);
		},
		renderServicePlans: function(services) {
			var out = "", s;
			for (var si = 0; si < services.length; si++) {
				s = services[si];
				if (LT.billingType != "none") {
					s.displayPrice = LT.render.core.price(s.price);
				}
				
				s.limitsDescription = LT.subs(LT.L('account_limits_template'),{
					users: LT.s(LT.L('user'), s.limits.maxUsers).toLowerCase(),
					gateways: LT.s(LT.L('gateway'), s.limits.maxGateways).toLowerCase()
				});
				
				s.trialDescription = LT.subs(LT.L('free_x_trial'), s);
				
				out += LT.subs('<a href="#" onclick="LT.currentPage.changeServicePlanTo(\'%id%\'); return false;"><div class="plan-name">%name%%is_beta? <span>&beta;</span>:%%trial_days? <span>%trialDescription%</span>:%</div><div class="plan-description">%description%</div><div class="plan-limits-description">%limitsDescription%</div><div class="plan-price">%displayPrice%</div></a>', s);
				
				/*
				out += '<tr>';
				out += '<td class="plan_name">' + s.name;
				if (s.is_beta) {
					out+= ' <sup>&beta;</sup>';
				}
				out += '</td>';
				if (this._status.service_id == s.id) {
					out += '<td class="plan_pricing current_plan">';
				} else {
					out += '<td class="plan_pricing">';
				}
				out += LT.render.core.price(s.price);
				out += '<br/>';
				if (this._status.service_id == s.id) {
					out += '<span class="red">' + LT.L('your_plan') + '</span>';
				} else {
					out += '<a class="upgrade" href="#" onclick="LT.currentPage.changeServicePlanTo(\'' + s.id + '\'); return false;">';
					out += 'Select';
					out += '</a>';
				}
				out += '</td>';

				out += '<td>' + LT.render.core.num(s.limits.maxUsers) + '</td>';
				out += '<td class="table_right_end">' + LT.render.core.num(s.limits.maxGateways) + '</td>';
				out += '</tr>';
				*/
				
			}
			LT.$('service_plans').innerHTML = out;

		},
		changeServicePlanTo: function(id) {
			LT.handlers["703"] = function() {
				LT.progress.stop();
				_this.init();
				//LT.message.show(LT.L('pending_payment_alert'));
				//LT.redirect("index.htm");
				return true;
			}
			LT.handlers["609"] = function() {
				LT.progress.stop();
				LT.message.show(LT.L('order_pending_alert'));
				return true;
			}
			var _this = this;
			LT.API.switchServicePlan(function(data) {
				_this.init();
			}, id);
		},
		renderOrder: function(order) {
			var content = "";
			content += '<div class="order_list_item_top">';
			content += '<b>' + order.service_name + '</b>';
			
			if (LT.billingType != "none") {
				content += ' (';
				content += LT.render.core.price(order.service_price);
				if (order.is_beta) {
					content += ' ' + LT.L('beta');
				}
				content += ') ' + LT.L('service_plan');
			}
		
			content += '<div class="order_list_status ' + order.status + '">';
			//content += order.status;
			if (order.status == "pending") {
				var temp = ' <a href="#" class="cross left25px" onclick="LT.currentPage.cancelOrder(\'%order_number%\');return false;">' + LT.L('cancel') + '</a>';
				content += LT.subs(temp, {
					"order_number": order.order_number
				});
			}				
			content += '</div>';
			content += '</div>'
			content += '<div class="order_list_item_bottom">';
			content += order.service_description + '<br/><br/>';
			content += LT.d(order.date);
			content += ', ';
			content += LT.L('order') + ' #' + order.order_number;
			content += '</div>';
			LT.$("order_details").innerHTML = content;
		},
		cancelOrder: function(orderNumber) {
			var _this = this;
			LT.API.cancelOrder(function(data) {
				_this.init();
			}, orderNumber);
		}
	},
	account: {
		_status: null,
		init: function() {
			var _this = this;
			LT.API.getAccountStatus(function(data){
				_this._status = data.status;
				_this._services = {};
				_this._has_trial = (data.status.trial_days_left == -1);
				for (var si = 0; si < data.services.length; si++) {
					_this._services[data.services[si].id] = data.services[si];
				}
				_this.displayStatus(data.status);
				if (LT.billingType != "none") {
					_this.renderOrders(data.orders);
					_this.renderServicePlans(data.services);
				}
			});
		},
		renderOrders: function(orders) {
			if (!orders.length) {
				LT.$hide("orders_container");
				return;
			}
			LT.$show("orders_container");
			LT.$("orders_container").innerHTML = '<h2>' + LT.L('orders_queue') + '</h2>';
			for (var oi = 0; oi<orders.length; oi++) {
				var el = document.createElement("div");
				el.innerHTML = LT.render.element.order(orders[oi], true);
				LT.$("orders_container").appendChild(el);
			}
			var el = document.createElement("p");
			el.innerHTML = LT.subs('<input type="button" value="%pay_now%" onclick="LT.redirect(\'account_payment.htm\');"/> %or% <a href="account_orders.htm">%view_orders_history%</a>', {});
			LT.$("orders_container").appendChild(el);
		},
		displayStatus: function(status) {
			LT.$("account_name").innerHTML = status.name;
			LT.$("account_type").innerHTML = '<b>' + status.service_name + '</b>';
			if (LT.billingType != "none") {
				if (status.is_beta) {
					LT.$("account_type").innerHTML += " (" + LT.L('free_beta_notice') + " " + LT.render.core.price(status.price) + ")";
				}
				else {
					LT.$("account_type").innerHTML += " (" + LT.render.core.price(status.price) + ")";
				}
				LT.$("account_balance").innerHTML = LT.render.core.currency(status.balance);
			}
			LT.$("account_type").innerHTML += ' ' + status.service_description;
			LT.$("member_since").innerHTML = LT.d(status.created);


			if (!status.enabled) {
				LT.$("account_limits").innerHTML = '<span class="red">' + LT.L('account_disabled_short') + '</span>';
			} else {
				LT.$("account_limits").innerHTML = LT.subs(LT.L('account_limits_template'),{
					users: LT.s(LT.L('user'), status.limits.maxUsers).toLowerCase(),
					gateways: LT.s(LT.L('gateway'), status.limits.maxGateways).toLowerCase()
				});
				if (status.trial_days_left > 0) {
					LT.$("account_limits").innerHTML += LT.subs(LT.L('x_trial_days_left'), {
						"trial_days": status.trial_days_left
					});
				}
			}
			LT.$("account_stats").innerHTML = LT.subs(LT.L('account_status_template'), {
				users: LT.s(LT.L('user'), status.usersNumber).toLowerCase(),
				gateways: LT.s(LT.L('gateway'), status.gatewaysNumber).toLowerCase()
			});

		},
		renderServicePlans: function(services) {
			var out = "", s;
			for (var si = 0; si < services.length; si++) {
				s = services[si];
				out += '<tr>';
				out += '<td class="plan_name">' + s.name;
				if (s.is_beta) {
					out+= ' <sup>&beta;</sup>';
				}
				out += '</td>';
				if (this._status.service_id == s.id) {
					out += '<td class="plan_pricing current_plan">';
				} else {
					out += '<td class="plan_pricing">';
				}
				out += LT.render.core.price(s.price);
				if (this._status.service_id == s.id) {
					out += '<br/><span class="red">' + LT.L('your_plan') + '</span></td>';
				} else if (true) {
					out += '<br/><a class="upgrade" href="#" onclick="LT.pages.account.changeServicePlanTo(\'' + s.id + '\'); return false;">';
					if (this._status.price == s.price) {
						out += LT.L('switch_action');
					} else if (1.0*this._status.price > 1.0*s.price) {
						out += LT.L('downgrade_action');
					} else if (this._has_trial && s.trial_days > 0) {
						out += LT.subs(LT.L('x_days_trial'), s);
					} else {
						out += LT.L('upgrade_action');
					}
					out += '</a></td>';
				}
				out += '<td>' + LT.render.core.num(s.limits.maxUsers) + '</td>';
				out += '<td class="table_right_end">' + LT.render.core.num(s.limits.maxGateways) + '</td>';
				out += '</tr>';
			}
			LT.setTableBodyHTML(LT.$("account_service_plans"), out);

		},
		/*
		 * Detect if we can switch to that plan
		 */
		canSwitch: function(id) {
			return 	1*this._status.usersNumber <= 1*this._services[id].limits.maxUsers && 
					1*this._status.gatewaysNumber <= 1*this._services[id].limits.maxGateways;
		},
		cancelOrder: function(orderNumber) {
			var _this = this;
			LT.API.cancelOrder(function(data) {
				_this.init();
			}, orderNumber);
		}, 
		changeServicePlanTo: function(id) {
			if (!this.canSwitch(id)) {
				alert(LT.L('cant_switch_alert'))
				return;
			}
			LT.handlers["703"] = function() {
				LT.progress.stop();
				_this.init();
				LT.message.show(LT.L('pending_payment_alert'));
				//LT.redirect("index.htm");
				return true;
			}
			LT.handlers["609"] = function() {
				LT.progress.stop();
				LT.message.show(LT.L('order_pending_alert'));

				return true;
			}
			var _this = this;
			LT.API.switchServicePlan(function(data) {
				_this.init();
			}, id);
		},
		cancelAccount: function() {
			if (confirm(LT.L('confirm_account_delete'))) {
				LT.API.cancelAccount(function(data){
					alert(LT.L('alert_account_deleted'));
					LT.redirect("http://" + LT.domain);
				});
			}
		}
	},
	orders: {
		_orders: null,
		init: function() {
			var _this = this;
			LT.API.getOrders(function(data){
				if (data.orders && data.orders.length > 0) {
					_this._order = data.orders;
					_this.renderOrders(data.orders);
				} else {
					LT.$("orders_container").innerHTML = '<p>' + LT.L('no_orders_found')+ '</p>';
				}
			}, null);
		},

		renderOrders: function(orders) {
			LT.$show("orders_container");
			LT.$("orders_container").innerHTML = '';
			for (var oi in orders) {
				if (orders[oi].status != "archived") {
					var el = document.createElement("div");
					el.innerHTML = LT.render.element.order(orders[oi], true);
					LT.$("orders_container").appendChild(el);
				}
			}
			LT.$("orders_container").innerHTML += '<div><h3>' + LT.L('archived_orders') + ':</h3></div>';
			for (oi in orders) {
				if (orders[oi].status == "archived") {
					var el = document.createElement("div");
					el.innerHTML = LT.render.element.order(orders[oi], true);
					LT.$("orders_container").appendChild(el);
				}
			}
		},
		cancelOrder: function(orderNumber) {
			var _this = this;
			LT.API.cancelOrder(function(data) {
				_this.init();
			}, orderNumber);
		}
	}, 
	receipt: {
		_receipt: null,
		init: function() {
			LT.$("data").style.visibility = "hidden";
			if (!LT.params.t) {
				LT.message.show(LT.L('no_transaction_number'));
				return;
			}
			var _this = this;
			LT.API.getReceipt(function(data){
				if (data.order && data.transaction) {
					_this._data = data;
					_this.renderReceipt(data.order, data.transaction);
					LT.$("data").style.visibility = "visible";
				} else {
					LT.message.show(LT.L('invalid_transaction_number'));
				}
			}, LT.params.t);
		},
		renderReceipt: function(order, transaction) {
			LT.$("order_title").innerHTML = LT.L('receipt') + " #" + order.order_number + "-" + transaction.id;
			LT.$("order_bill_to").innerHTML = '<h4>' + LT.L('bill_to') + '</h4><p>' + LT.render.element.billTo(order) + '</p>';
			// Order details block
			LT.$("order_number").innerHTML = order.order_number;
			LT.$("order_date").innerHTML = LT.d(transaction.date);
			LT.$("order_account").innerHTML = order.network;
			
			var description = LT.subs(LT.L('order_description_first_line'), {
				service_name: order.service_name,
				is_beta: order.is_beta,
				service_price: LT.render.core.price(order.service_price),
				max_users: order.limits.maxUsers,
				max_gateways: order.limits.maxGateways
			});
			description += '<div>' + order.service_description + ' ';
			description += LT.subs(LT.L('order_description_second_line'), order) + '</div>';
			
			LT.$("order_item_description").innerHTML = description;
			
			LT.$("order_item_price").innerHTML = '$' + LT.render.core.num(transaction.amount, 2);
			LT.$("payment_total").innerHTML = (LT.L('form_total') + ' $' + LT.render.core.num(transaction.amount, 2)).toUpperCase();
		}
	},
	order: {
		_order: null,
		_comments: {
			"pending": ''//LT.L('your_order_is_pending')
		},
		init: function() {
			LT.$("data").style.visibility = "hidden";
			this._comments.pending = LT.L('your_order_is_pending');
			if (!LT.params.order) {
				LT.message.show(LT.L('missing_order_number'));
				return;
			}
			var _this = this;
			LT.API.getOrders(function(data){
				if (data.orders && data.orders.length == 1) {
					_this._order = data.orders[0];
					_this.renderOrder(data.orders[0]);
					_this.renderTransactions(data.transactions);
					LT.$("data").style.visibility = "visible";
				} else {
					LT.message.show(LT.L('order_not_found'));
				}
			}, LT.params.order);
		},
		renderOrder: function(order) {
			LT.$("order_title").innerHTML = LT.L('order') + " #" + order.order_number;
			LT.$("order_bill_to").innerHTML = '<h4>' + LT.L('bill_to') + '</h4><p>' + LT.render.element.billTo(order) + '</p>';
			// Order details block
			LT.$("order_number").innerHTML = order.order_number;
			LT.$("order_date").innerHTML = LT.d(order.date);
			LT.$("order_account").innerHTML = order.network;

			LT.$("order_item_description").innerHTML = LT.subs(LT.L('order_description_template'), {
				service_name: order.service_name,
				is_beta: order.is_beta,
				max_users: order.limits.maxUsers,
				max_gateways: order.limits.maxGateways
			});
			
			LT.$("order_item_description").innerHTML += '<div>' + order.service_description + '</div>';	
			
			LT.$("order_item_price").innerHTML = LT.render.core.price(order.service_price);
			// Status
			var order_status = '<span class="' + order.status + '">' + order.status.toUpperCase() + '</span> ';
			if (this._comments[order.status]) {
				order_status += ' (' + this._comments[order.status] + ')';
			}
			LT.$("order_status").innerHTML = order_status;
			if (LT.billingType != "none") {
				if (order.status == "pending") {
					LT.$hide("status_nonpending_block");
					LT.$show("status_pending_block");
				}
				else {
					LT.$hide("status_pending_block");
					LT.$show("status_nonpending_block");
				}
			} else {
				LT.$hide("status_pending_block");
				LT.$hide("status_nonpending_block");
			}
		},
		payNow: function() {
			LT.redirect("account_payment.htm?order=" + this._order.order_number);
		},
		
		transTemplate: '<tr><td class="transaction_date">%date%</td><td class="%status% nowrap">%amount%</td><td>%typeLocalized%</td>\
						<td class="transaction_comment">%method? (%method%) :%%comment%</td>',
		renderTransactions: function(trans) {
			this.transTemplatePendingAction = '<td><a href="/account_payment.htm?order=%order_number%">' + LT.L('pay_now') + '</a></td></tr>';
			this.transTemplateCompletedAction = '<td><a href="%ref_url%" target="_blank">' + LT.L('details') + '</a></td></tr>';
			var out = '', outp = '', t;
			if (!trans || !trans.length) {
				out = '<tr><td colspan="4">' + LT.L('no_transactions') + '</td></tr>';
				LT.setTableBodyHTML(LT.$("order_transactions"), out);
				LT.$hide("order_pending_transactions");
				return;
			}
			for (var ti = 0; ti < trans.length; ti++) {
				t = trans[ti];
				t.date = LT.d(t.date);
				
				t.typeLocalized = LT.L(t.type);
				t.ref_url = t.ref_url || ("/account_receipt.htm?t=" + t.id);
				tline = LT.subs(this.transTemplate, t);
				if (t.status == "pending") {
					outp += tline + LT.subs(this.transTemplatePendingAction, t);
				} else if (t.status == "cancelled"){
					out += tline + '<td>' + LT.L('cancelled') + '</td></tr>';
				} else if (t.type == 'payment'){
					out += tline + LT.subs(this.transTemplateCompletedAction, t);
				} else {
					out += tline + '<td>&nbsp;</td></tr>';
				}
			}
			LT.setTableBodyHTML(LT.$("order_transactions"), out);
			if (outp) {
				LT.$show("order_pending_transactions");
				LT.$show("order_pending_transactions_head");
				LT.setTableBodyHTML(LT.$("order_pending_transactions"), outp);
			} else {
				LT.$hide("order_pending_transactions");
				LT.$hide("order_pending_transactions_head");
			}
		},
		cancelOrder: function() {
			var _this = this;
			LT.API.cancelOrder(function(data) {
				_this.init();
			}, this._order.order_number);
		}
	},
	payment: {
		_data: null,
		init: function() {
			var _this = this;
			this._orderNumber = (LT.params.order) ? LT.params.order : 0;
			LT.tokens["order_number"] = this._orderNumber;
			LT.API.getPaymentOptions(function(data) {
				_this._options = data;
				if (data.orders.length) {
					_this._order = data.orders[0];
					_this.displayPaymentOptions(data);
				} else {
					_this.displayNoOrders();
				}
			}, this._orderNumber);
		},
		displayNoOrders: function() {
			LT.$("data").innerHTML = '<h2>' + LT.L('no_due_payments') + '</h2><p>' + LT.L('using_free_service') + '</p>';
		},
		displayPaymentOptions: function(options) {
			// Show 1) orders, 2) billing info, 3) payment options
			this.renderOrder(options.orders[0]);
			this.renderBillTo(options.orders[0]);
			LT.tokens["order_number"] = options.orders[0]["order_number"];
			LT.$("payment_total").innerHTML = LT.L('form_total') + " " + LT.render.core.currency(options.orders[0].service_price);
			/*
			if (options.orders.length > 1) {
				LT.$("payment_subject").innerHTML +='<a class="action_link" href="#" onclick="LT.pages.payment.changeOrder(); return false;">' + LT.L('change') + '</a>';
			}
			*/
			this.renderPaymentOptions(options.billingMethods);
		},
		changeOrder: function() {		
			//TODO: WTF
			for (var i=0; i<orders.length; i++) {

			}
		},
		renderPaymentOptions: function(options) {
			var activeCount = 0;
			var hasDefault = false;
			for (var oi in options) {
				if (options[oi].enabled) {
					activeCount++;
				}
				hasDefault = hasDefault || options[oi].def;
			}
			if (activeCount > 1) {
				var out = '';
				var template = '<div><input type="radio" name="payment_method" value="%name%" %def% onclick="LT.pages.payment.renderPaymentOptionDetails(this.value);"/> %caption%</div>';
				for (oi in options) {
					if (options[oi].enabled) {
						out += LT.subs(template, {
							"name": oi,
							"caption": options[oi].name,
							"def": options[oi].def ? 'checked="1"' : ''
						});
						if (options[oi].def) {
							this.renderPaymentOptionDetails(oi);
						}
					}
				}
				LT.$("payment_methods").innerHTML = out;
			} else {
				LT.$hide("payment_methods_title");
				LT.$("payment_methods").innerHTML = '';
				for (oi in options) {
					if (options[oi].enabled) {
						this.renderPaymentOptionDetails(oi);
						break;
					}
				}
			}
		},
		renderPaymentOptionDetails: function(name) {
			var action = this._options.billingMethods[name].action;
			var out = '';
			if (action.caption) {
				out += '<h4>' + action.caption + '</h4>';
			}
			switch (action.type) {
				case 'text':
					out += LT.subs(action.data, LT.tokens);
					break;
				case 'google':
					if (action.data.sandbox_mode) {
						LT.$("payment_form").action = 'https://sandbox.google.com/checkout/api/checkout/v2/checkoutForm/Merchant/' + action.data.merchant_id;
					} else {
						LT.$("payment_form").action = 'https://checkout.google.com/api/checkout/v2/checkoutForm/Merchant/' + action.data.merchant_id;
					}
					out += LT.render.core.input([
						{
							name: 'item_name_1',
							value: LT.L('serviceName') + ' ' + this._order.service_name + ' ' + LT.L('service_plan')
						},
						{
							name: 'item_description_1',
							value: this._order.service_description
						},
						{
							name: 'item_price_1',
							value: this._order.service_price
						},
						{
							name: 'item_currency_1',
							value: LT.L('currency_code')
						},
						{
							name: 'item_quantity_1',
							value: '1'
						},
						{
							name: 'item_merchant_id_1',
							value: this._order.order_number
						},
						{
							name: 'shopping-cart.items.item-1.digital-content.display-disposition',
							value: 'OPTIMISTIC'
						},
						{
							name: 'shopping-cart.items.item-1.digital-content.description',
							value: LT.L('order_processing_notice')
						},
						{
							type: 'image',
							name: 'Google Checkout',
							alt: 'Fast checkout through Google',
							src: 'http://sandbox.google.com/checkout/buttons/checkout.gif?merchant_id=' + action.data.merchant_id + '&w=180&h=46&style=white&variant=text',
							height: '46',
							width: '180'
						}
					]);
					break;
				case 'paypal':
					LT.$("payment_form").action = "https://www.paypal.com/cgi-bin/webscr";
					out += LT.render.core.input([
						{
							name: 'business',
							value: action.data.merchant_id
						},
						{
							name: 'cmd',
							value: '_xclick'
						},
						{
							name: 'item_name',
							value: LT.L('serviceName') + ' ' + this._order.service_name + ' ' + LT.L('service_plan')
						},
						{
							name: 'item_description',
							value: this._order.service_description
						},
						{
							name: 'amount',
							value: this._order.service_price
						},
						{
							name: 'currency_code',
							value: LT.L('currency_code')
						},
						{
							name: 'notify_url',
							value: LT.baseSecureUrl + 'a/' + LT.domain + '/event/ipn/paypal'
						},
						{
							name: 'item_number',
							value: this._order.order_number
						},
						{
							type: 'image',
							name: 'submit',
							border: '0',
							src: 'https://www.paypal.com/en_US/i/btn/btn_paynow_LG.gif',
							alt: 'PayPal button'
						}						
					]);
					break;
				case 'table':
					out += '<table>';
					var template = '<tr><td>%name%:</td><td>%value%</td></tr>';
					for (var item in action.data) {
						out += LT.subs(template, {
							'name': item,
							'value': LT.subs(action.data[item], LT.tokens)
						});
					}
					out += '</table>';
					break;
				case 'plimus':
					if (this._order.plimus_contract_id) {
						LT.$("payment_form").action = action.data.base_url + "contractId=" + this._order.plimus_contract_id;
						out += LT.render.core.input([
							{
								name: "enableCustom",
								value: "Y"
							},
							{
								name: "custom1",
								value: this._order.order_number
							},
							{
								name: "custom2",
								value: LT.network_name
							},
							{
								name: "firstName",
								value: LT.parseName(this._order.billing_name)["first"]
							},
							{
								name: "lastName",
								value: LT.parseName(this._order.billing_name)["last"]
							},
							{
								name: "email",
								value: this._order.billing_email
							},								
							{
								name: "address1",
								value: this._order.billing_address
							},	
							{
								name: "address2",
								value: this._order.billing_address2
							},			
							{
								name: "city",
								value: this._order.billing_city
							},	
							{
								name: "state",
								value: this._order.billing_state
							},		
							{
								name: "zipCode",
								value: this._order.billing_zip
							},	
							{
								name: "country",
								value: this._order.billing_country
							},			
							{
								name: "currency",
								value: LT.L('currency_code')
							},	
							{
								name: "language",
								value: "en"
							},																			
							{
								type: 'submit',
								name: 'submit',
								border: '0',
								value: 'Checkout'
							}	
						]);
						break;
					}
				default:
					out = LT.L('no_payment_method')
			}
			LT.$("payment_container").innerHTML = out;
		},
		renderOrder: function(order) {
			LT.$("payment_subject").innerHTML = '';
			var el = document.createElement("div");
			el.innerHTML = LT.render.element.order(order);
			LT.$("payment_subject").appendChild(el);
		},
		renderBillTo: function(order) {
			var billToText = LT.render.element.billTo(order);
			billToText += '<a href="#" class="action_link" onclick="LT.pages.payment.changeBillTo(); return false;">' + LT.L('change_address') + '</a>';
			LT.$("payment_bill_to").innerHTML = billToText;
		},
		changeBillTo: function() {
			//TODO: Implement me!
			var _this = this;
			var dialog = {
				title: LT.L('change_billing_address'),
				submitCaption: LT.L('apply'),
				form: {
					"billing_name": {
						caption: LT.L('form_full_name'),
						attributes: {type: "text", value: this._order.billing_name, size: 32 }
					},
					"billing_email": {
						caption: LT.L('form_email'),
						attributes: {type: "text", value: this._order.billing_email, size: 32}
					},
					"billing_phone": {
						caption: LT.L('form_phone'),
						attributes: {type: "text", value: this._order.billing_phone }
					},
					"billing_address": {
						caption: LT.L('form_address'),
						attributes: {type: "text", value: this._order.billing_address, size: 32}
					},
					"billing_address2": {
						caption: LT.L('form_address2'),
						attributes: {type: "text", value: this._order.billing_address2, size: 32}
					},
					"billing_city": {
						caption: LT.L('form_city'),
						attributes: {type: "text", value: this._order.billing_city, size: 32}
					},
					"billing_state": {
						caption: LT.L('form_state'),
						attributes: {type: "text", value: this._order.billing_state }
					},
					"billing_zip": {
						caption: LT.L('form_zip'),
						attributes: {type: "text", value: this._order.billing_zip, size: 10}
					},
					"billing_country": {
						caption: LT.L('form_country'),
						attributes: {type: "text", value: this._order.billing_country }
					}
				},
				action: function() {
					
					if (this.getField("billing_name").value == "") {
						this.showError(LT.L('empty_name_error'));
						this.getField("billing_name").focus();
						return false;
					}
					var fieldsList = ["name", "email", "phone", "address", 
										"address2", "city", "state", "zip", "country"];
					var out = {};
					
					for (var i in fieldsList) {
						var fi = "billing_" + fieldsList[i];
						_this._order[fi] = this.getField(fi).value;
						out[fi] = this.getField(fi).value;
					}
					_this.renderBillTo(_this._order);
					_this.displayPaymentOptions(_this._options);
					
					LT.API.updateBillingInfo(function(){
						LT.message.show(LT.L('billing_address_updated'), 3000);
					}, out, _this._order["order_number"]);
					
					this.showError("");
					this.close();
					return false;
				}
			};
			LT.popup.show(dialog);
		}
	}
}

LT.API ={
	checkNetworkName: function(callback, name) {
		LT.progress.start(LT.L('checking_name_availability'));
		LT.loader.sendRequest(LT.baseUrl + 'network/check/' + encodeURI(name), 
							  '', callback);
	},
	getNetworkDetails: function(callback, name) {
		LT.progress.start(LT.L('getting_network_details'));
		LT.loader.sendRequest(LT.baseUrl + 'network/get/' + encodeURI(name), 
							  '', callback);
	},	
	signup: function(callback, name, admin_name, admin_email) {
		LT.progress.start(LT.L('creating_new_network'));
		LT.loader.sendRequest(LT.baseUrl + 'network/add/' + encodeURI(name), 
							  "admin_name=" + admin_name + "&admin_email=" + admin_email, callback);
	},
	importUsers: function(callback, who) {
		LT.progress.start(LT.L('importing_users'));
		var ulist = "";
		for (var userIndex in who) {
			ulist += 'users[' + userIndex + '][username]=' + who[userIndex].username + '&';
			ulist += 'users[' + userIndex + '][full_name]=' + who[userIndex].full_name + '&';
			ulist += 'users[' + userIndex + '][email]=' + who[userIndex].email + '&';
		}
		LT.loader.sendRequest(LT.baseUrl + 'user/importusers/', 
							  ulist, callback);
	},
	addLicense: function(callback, key) {
		LT.progress.start(LT.L('validating_license'));
		LT.loader.sendRequest(LT.baseUrl + 'account/statusget', '',
			callback);
	},
	updateBillingInfo: function(callback, billingInfo, orderNumber){
		LT.progress.start(LT.L('updating_billing_info'));
		LT.loader.sendRequest(LT.baseUrl + 'account/updatebillinginfo/' + orderNumber, LT.createUrlString(billingInfo),
			callback);
	},
	switchServicePlan: function(callback, plan_id) {
		LT.progress.start(LT.L('changing_service_plan'));
		LT.loader.sendRequest(LT.baseUrl + 'account/changeserviceto/' + plan_id, '',
			callback);
	},
	cancelOrder: function(callback, orderNumber) {
		LT.progress.start(LT.L('cancelling_order'));
		LT.loader.sendRequest(LT.baseUrl + 'account/cancelorder/' + orderNumber, '',
			callback);
	},
	cancelAccount: function(callback) {
		LT.progress.start(LT.L('cancelling_account'));
		LT.loader.sendRequest(LT.baseUrl + 'account/cancelaccount', '',
			callback);
	},	
	getAccountStatus: function(callback) {
		LT.progress.start(LT.L('getting_account_data'));
		LT.loader.sendRequest(LT.baseUrl + 'account/statusget', '',
			callback);
	},
	getReceipt: function(callback, receiptNumber) {
		LT.progress.start(LT.L('loading_receipt'));
		var req = LT.baseUrl + "account/getreceipt";
		req += "/receipt_number/" + receiptNumber; 

		LT.loader.sendRequest(req, "",
			callback);
	},
	getOrders: function(callback, orderNumber, maxorders, startorder) {
		LT.progress.start(LT.L('loading_orders'));
		var req = LT.baseUrl + "account/getorders";
		if (orderNumber) {
			req += "/order_number/" + orderNumber; 
		}
		if (maxorders) {
			req += "/max/" + maxusers;
		}
		if (startorder) {
			req += "/start/" + startuser;
		}
		LT.loader.sendRequest(req, "",
			callback);
	},	
	getPaymentOptions: function(callback, orderNumber) {
		LT.progress.start(LT.L('loading_payment_options'));
		var req = LT.baseUrl + "account/getpaymentoptions";
		if (orderNumber) {
			req += "/order_number/" + orderNumber; 
		}
		LT.loader.sendRequest(req, "",
			callback);
	}		
}
LT.currency = {
	"USD": {
		name: "US Dollar",
		symbol: "$",
		pattern: "$%value%"
	},
	"EUR": {
		name: "Euro",
		symbol: "€",
		pattern: "%value%€"
	},
	"ZAR": {
		name: "South Africa Rand",
		symbol: "R",
		pattern: "R%value%"
	},
	"RUR": {
		name: "Российский рубль",
		symbol: "RUR",
		pattern: "%value% pуб"
	},
	"GBP": {
		name: "Great Britain Pound",
		symbol: "£",
		pattern: "£%value%"
	},
	"BRL": {
		name: "Brazil Real",
		symbol: "R$",
		pattern: "R$%value%"
	},
	"JPY": {
		name: "Japan Yen",
		symbol: "¥",
		pattern: "¥%value%"
	},
	"INR": {
		name: "Indian Rupee",
		symbol: "Rs",
		pattern: "Rs%value%"
	}
}
