function CheckOut() {
    ///
	this.opened = null;
	this.lastAnim = null;
	this.isSending = false;
	this.userData = ["","","","",""];
	this.url = "";
	///
	this.initialize = function(){
		if(App.user.isLogged){
			$("login_bar").style.display = "none";
			this.init();
		}
		this.getURL();
    }
	this.showForgotPassword = function(){
		Modalbox.show("content/Password.html?" + Math.random(), {title: "Remind Password", width: 500} );
	}
	this.remindPassword = function(){
		var email = Functions.trim($("remind_email").value);
		if(email == ""){
			$("remind_password_error").innerHTML = "User id not valid";
			return;
		}
		$("remind_password_error").innerHTML = "Sending data";
		////
		if(this.isSending){
			return;
		}
		this.isSending = true;
		Modalbox.deactivate();
		////
		var ap = new AjaxPlace({clas: "LSAccount", func:"remindPassword", args:[email]});
		ap.folder = "admin/";
		var callback = function(transport){
			this.isSending = false;
			Modalbox.activate();
			var str = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle"><b>Password sent to your email address!</b><br/><a href="#" onclick="Modalbox.hide(); return false;">Press here</a> to close</td></tr></table></div>';
			Modalbox.show(str, {title: "Thank you!", width: 400});
		}
		ap.call({ onSuccess:callback.bind(this) });
	}
	this.getURL = function(){
		var ap = new AjaxPlace({clas: "LSSetting", func:"getData", args:["CURL"]});
		ap.folder = "admin/";
		var callback = function(transport){
				this.url = eval(transport.responseText)[0].val;
		}
		ap.call({ onSuccess:callback.bind(this) });	
	}
	this.init = function(){
	    //alert('isLogged:'+App.user.isLogged);
	    $("b_fname").value = App.user.data.fname;
		$("b_lname").value = App.user.data.lname;
		$("b_email").value = App.user.data.email;
	    //alert(' 1 '+App.user.data.email+' '+App.user.data.fname+' '+App.user.data.lname);
		this.checkShoppingCart();
	}
	this.createAccount=function(){
		var username = Functions.trim($("new_username").value);
		var email = Functions.trim($("new_email").value);
		var email2 = Functions.trim($("new_email2").value);
		var pass = Functions.trim($("new_password").value);
		var cpass = Functions.trim($("new_confirm_password").value);
		var name = Functions.trim($("new_name").value);
		var lastname = Functions.trim($("new_lastname").value);
		///
		if(!Functions.checkFields(username, email, email2, pass, name, lastname)){
			$("new_account_error").innerHTML = "Required fields are missing";
			return;
		}
		if(!Functions.checkMail(email)){
			$("new_account_error").innerHTML = "Email address not valid";
			return;
		}
		if(email != email2){
			$("new_account_error").innerHTML = "Email fields must be equal";
			return;
		}
		if(pass != cpass){
			$("new_account_error").innerHTML = "Password fields must be equal";
			return;
		}
		////
		///alert(username);
		var ap = new AjaxPlace({clas: "LSOrder", func:"validateUserid", args:[username, pass]});
		ap.folder = "admin/";
		var callback = function(transport){
				var str = transport.responseText;
				//alert(str);
				if(str == "0"){
					$("b_fname").value = name;
					$("b_lname").value = lastname;
					$("b_email").value = email;
					this.userData = [username, email, pass, name, lastname];
					Effect.BlindUp("login_bar");
					this.getCartData();
					this.openPane(1);
				}else{
					var strr = "";
					if(str == "1"){
						var strr = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle">Please login and cancel you courses</td></tr></table></div>';
					}else if(str == "2"){
						var strr = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle">Please login before buying new courses</td></tr></table></div>';
					}else if(str == "3"){
						var strr = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle">This account has been cancelled</td></tr></table></div>';
					}else{
						var strr = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle">User id can not be used</td></tr></table></div>';
					}
					Modalbox.show(strr, {title: "Error", width: 400});
				}
		}
		ap.call({ onSuccess:callback.bind(this) });
	}
	this.login=function(em, pa){
		var email = (em != null) ? em : Functions.trim($("login_email").value);
		var pass = (pa != null) ? pa : Functions.trim($("login_password").value);
		if(!Functions.checkFields(email, pass)){
			$("login_error").innerHTML = "Required fields are missing";
			return;
		}
		if(this.isSending){
			return;
		}
		this.isSending = true;
		$("login_error").innerHTML = "Sending data";
		///
		var callback = function(r){
			this.isSending = false;
			if (r == false){
				$("login_error").innerHTML = "User or Password not valid";
			}else{
				this.userData = ["","","","",""];
				Effect.BlindUp("login_bar");
				this.init();
			}
		}
		App.user.loginCallServer(email, pass, callback.bind(this));
	}
	this.checkShoppingCart = function(){
		var ap = new AjaxPlace({clas: "LSShoppingCart", func:"checkShoppingCart"});
		ap.folder = "admin/";
		var callback = function(transport){
				var obj = eval(transport.responseText);
				//if items were removed;
				if(obj.length > 0){
					var str = '<div>These items were removed from your Shopping Cart. This can be caused by them being duplicated in your order or because they are activated for your account. The system has a limitation of one active course per account.<br/><br/>';
					for(var t=0; t<obj.length;t++){
						str += obj[t]+"<br/>";
					}
					str += "<br/></div>"
					var onHide = function(){
						if(App.shopppingCart.isEmpty()){
							App.loadSection(6);
						}
					}
					Modalbox.show(str, {afterHide:onHide, title: "Some Items were removed from your Shopping Cart", width: 400});
					var func = function(){
							this.getCartData();
							this.openPane(1);					
					}
					App.shopppingCart.checkSession(func.bind(this)); 
				}else{
				    this.getCartData();
					this.openPane(3);
				}
		}
		ap.call({ onSuccess:callback.bind(this) });
	}
	
	this.getCartData = function(){
		var ap = new AjaxPlace({clas: "LSShoppingCart", func:"getShoppingCart"});
		ap.folder = "admin/";
		var callback = function(transport){
				///alert(transport.responseText);
				var r = eval(transport.responseText);
				var sc = new ShoppingCart();
				$("cart_data").innerHTML = sc.drawData(r, true);
				$("submit_cart").style.display = "none";
		}
		ap.call({ onSuccess:callback.bind(this) });
	}
	this.openPane = function(num){
		if(num == 2){
			if(this.validateF1() == false)
				return;
		}
		if(num == 3 && !App.user.isLogged){
			if(this.validateF1() == false || this.validateF2() == false)
				return;
		}
		///
		var ts = new Date().getTime();
		if( ts-this.lastAnim < 1000 && this.lastAnim != null)
			return;
		this.lastAnim = ts;
		if(num != this.opened){
			if(this.opened != null){
				Effect.BlindUp('pane_' + this.opened);
			}
			this.opened = num;
			if(this.opened == 3){
				this.showData();
			}
			Effect.BlindDown('pane_' + this.opened);
		}
	}
	this.prevForm = function (num){
		if(num == 2){
			this.openPane(1);
		}else{
			this.openPane(2);
		}
	}
	this.checkForm = function(num){
		if (num == 1){
			$("errorF1").innerHTML = "";
			if(this.validateF1() != false){
				this.openPane(2);
			}else{
				$("errorF1").innerHTML = "Errors were found in the form";
			}
		}
		if (num == 2){
			$("errorF2").innerHTML = "";
			if(this.validateF2() != false){
				this.openPane(3);
			}else{
				$("errorF2").innerHTML = "Errors were found in the form";
			}
		}
	}
	this.validateF2 = function(){
		var name = Functions.trim($("p_name").value);
		var card = $("p_card").options[ $("p_card").selectedIndex ].text 
		var number = Functions.trim($("p_number").value);
		var date = $("p_month").options[ $("p_month").selectedIndex ].text + $("p_year").options[ $("p_year").selectedIndex ].text  
		var code = Functions.trim($("p_code").value);
		//card = "Visa";
		if(!Functions.checkFields(name, card, number, date, code))
			return false
		if(card == "Choose Type")
		    return false
		if(Functions.validString(code, "1234567890")=='')
		    return false
		/*if(card == "Amex" && code.length !=4)
		    return false
		if(card != "Amex" && code.length !=3)
		    return false*/
		return [name, card, number, date, code];
	}
	this.validateF1 = function(){
		var fields = ["b_fname", "b_lname", "b_email", "b_company", "b_address1", "b_address2", "b_city", "b_zip", "b_phone1", "b_phone2", "b_phone3", "b_phone4"];
		var values = [];
		var required = [0,1,2,4,6,7];
		var posr = 0;
		for(var t = 0; t < fields.length; t++){
			var v = $(fields[t]).value;
			values.push(Functions.trim( v ));
			if(t == required[posr]){
				posr++;
				if( Functions.trim( v ) == "" ){
					return false;
				}
			}
		}
		if(!($("b_phone1").value.length == 3 && $("b_phone2").value.length == 3 && $("b_phone3").value.length == 4))
		    return false;
		if(Functions.validString($("b_zip").value, "1234567890")=='')
		    return false
		/*if(!($("b_zip").value.length == 5))
		    return false;
		*/
		if( Functions.checkMail(values[2]) == false ){
			return false;
		}
		
		//
		var state = $("b_state").options[ $("b_state").selectedIndex ].value;
		if(state==-1)
		    return false;
		values.splice(7, 0, state) 
		///join the last 4 phone fields
		var phone = values.splice((values.length - 4), 4).join("-");
		values.push(phone);
		///alert(values);
		//
		return values;
	}
	this.showData = function(){
	    $("finaldata").style.display = (App.user.isLogged)?"none":"";
		if(App.user.isLogged){
			return;
		};
		var bData = this.validateF1();
		var cData = this.validateF2();
		$("b_data1").innerHTML = bData[3];
		$("b_data2").innerHTML = bData[0]+" "+bData[1];
		$("b_data3").innerHTML = bData[4];
		$("b_data4").innerHTML = bData[5];
		$("b_data5").innerHTML = bData[6];
		$("b_data6").innerHTML = bData[7];
		$("b_data7").innerHTML = bData[8];
		$("b_data8").innerHTML = bData[9];
		$("b_data9").innerHTML = bData[2];
		////
		$("c_data1").innerHTML = cData[0];
		$("c_data2").innerHTML = cData[1];
		$("c_data3").innerHTML = cData[2];
		$("c_data4").innerHTML = cData[3].slice(0,2)+"/"+cData[3].slice(2);
		$("c_data5").innerHTML = cData[4];
	}
	
	this.sendData = function(){
	    var ap ;
		if(App.user.isLogged){
			//alert("no");
			//return;
			ap = new AjaxPlace({clas: "LSOrder", func:"createOrder", args:[]});
		}else{
			var arr = this.validateF1().concat( this.validateF2() ).concat(this.userData);
			ap = new AjaxPlace({clas: "LSOrder", func:"createOrder", args:arr});
		}
		ap.folder = "admin/";
		var callback = function(transport){
				Modalbox.activate();
				///alert(transport.responseText);
				var r = eval("("+transport.responseText+")");
				
				if(r.code == 2){
				    Modalbox.show('<div><br/>'+r.message+'<br/><br/></div>', {title: "Validation Error", width: 400} );
					this.openPane(2);
				}else if (r.code == 1){
					Modalbox.show('<div><br/>'+r.message+'<br/><br/></div>', {title: "Validation Error", width: 400} );
					Effect.BlindDown("login_bar");
					Effect.BlindUp('pane_' + this.opened);
					this.opened == null;
				}else{
					App.shopppingCart.empty();
					try{
						Modalbox.hide();
					}catch(e){
					}
					var str = '<div style="height:200px;" align="center"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle">'+r.message+'<br/><a href="' + this.url + '" target="_blank">Please click here</a> to access your training</td></tr></table></div>';
					$('content').innerHTML = str;
					if(this.url != ""){
						///setTimeout("Functions.openInNewWindow('" + this.url + "');", 4000);
					}
				}
		}
		var onShow = function(){
			ap.call({ onSuccess:callback.bind(this) });
		}
		Modalbox.show('<div><br/>Validating credit card<br/><br/></div>', {title: "Validating", width: 300, afterLoad:onShow.bind(this)} );
		Modalbox.deactivate();		
	}
}
