
// next function 
		function chooseAirfare(id){
				strPost = "";			
				
				strPost += 'id='+id+'&cmdChooseAirfare=doChoose';
				var $c=jQuery.noConflict(); 
				$c.ajax({
					url:  'getdata.php',
					type: 'POST',
					data: strPost,
					success: function(result) {
						//trim the data that is coming
						result = result.replace(/^\s+|\s+$/g, "");
						if (result == 'done') {
							window.location = 'searchResults.php';
						}
						else {
							alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						}
						return true;
					}
				});
				
				return false;
		} // func ends 



		function doMainSearch(dest){
			var $j=jQuery.noConflict(); 
			strMessage = "";
			infantMessage = "";
				include_airfare_or_resort = $j("input[name='include_airfare_or_resort']:checked").val();
				if(include_airfare_or_resort == 'include_airfare'){
					if ($j("select[name='leaving_from']").val() == '' || $j("select[name='leaving_from']").val() == '0') {strMessage += 'Leaving From is not selected.\n';}
				} // airefare only
				if ($j("input[name='departure_date']").val() == '') {strMessage += 'Departure date is missing.\n';}
				if ($j("input[name='return_date']").val() == '') {strMessage += 'Return date is missing.\n';}
				if ((($j("input[name='by_resort_or_destination']:checked").val()) == 'by_resort') && ($j("select[name='resortName']").val() == '' || $j("select[name='resortName']").val() == '0')) {
					strMessage += 'Resort is missing.\n';
				};
				if ((($j("input[name='by_resort_or_destination']:checked").val()) == 'by_destination') && (($j("select[name='destinationName']").val() == '') )) {
					strMessage += 'Destination information is missing.\n';
				};
				
				if ($j("select[name='room1_adults']").val() == '0') {strMessage += 'No. of Adults for Room1 is not selected.\n';}
				children_1 = parseInt($j("select[name='room1_children']").val());
				children_2 = 0;
				if( $j("#secondblk").is(':visible') ){
				children_2 = parseInt($j("select[name='room2_children']").val());
				}
				chcnt = children_1+children_2;
				if(chcnt>0){
					isChildRes = $j("input[name='isChildAllowed']").val();
					if(isChildRes == "no") {
						alert("The selected resort is for Adults Only.");
						return false;
					} 				
				}
				
				switch(children_1)
				{
					case 1:
						if ($j("select[name='room1_child1_age']").val() == '') {strMessage += 'Room1, Child1 age is not selected.\n';}
						break;
					case 2:
						if ($j("select[name='room1_child1_age']").val() == '') {strMessage += 'Room1, Child1 age is not selected.\n';}
						if ($j("select[name='room1_child2_age']").val() == '') {strMessage += 'Room1, Child2 age is not selected.\n';}
						break;
					case 3:
						if ($j("select[name='room1_child1_age']").val() == '') {strMessage += 'Room1, Child1 age is not selected.\n';}
						if ($j("select[name='room1_child2_age']").val() == '') {strMessage += 'Room1, Child2 age is not selected.\n';}
						if ($j("select[name='room1_child3_age']").val() == '') {strMessage += 'Room1, Child3 age is not selected.\n';}
						break;
					default:
						break;
				}
				
				if ($j("select[name='room1_child1_age']").val() == '0' || $j("select[name='room1_child1_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
				if ($j("select[name='room1_child2_age']").val() == '0' || $j("select[name='room1_child2_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
				if ($j("select[name='room1_child3_age']").val() == '0' || $j("select[name='room1_child3_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
				
				if( $j("#secondblk").is(':visible') ){
					if ($j("select[name='room2_adults']").val() == '0') {strMessage += 'No. of Adults for Room2 is not selected.\n';}
					children_2 = parseInt($j("select[name='room2_children']").val());
					switch(children_2)
					{
						case 1:
							if ($j("select[name='room2_child1_age']").val() == '') {strMessage += 'Room2, Child1 age is not selected.\n';}
							break;
						case 2:
							if ($j("select[name='room2_child1_age']").val() == '') {strMessage += 'Room2, Child1 age is not selected.\n';}
							if ($j("select[name='room2_child2_age']").val() == '') {strMessage += 'Room2, Child2 age is not selected.\n';}
							break;
						case 3:
							if ($j("select[name='room2_child1_age']").val() == '') {strMessage += 'Room2, Child1 age is not selected.\n';}
							if ($j("select[name='room2_child2_age']").val() == '') {strMessage += 'Room2, Child2 age is not selected.\n';}
							if ($j("select[name='room2_child3_age']").val() == '') {strMessage += 'Room2, Child3 age is not selected.\n';}
							break;
						default:
							break;
					}
					if ($j("select[name='room2_child1_age']").val() == '0' || $j("select[name='room1_of_2_child1_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
					if ($j("select[name='room2_child2_age']").val() == '0' || $j("select[name='room1_of_2_child2_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
					if ($j("select[name='room2_child3_age']").val() == '0' || $j("select[name='room1_of_2_child3_age']").val() == '1') {infantMessage = 'Please note that infants under age of 2 are not asigned an airline seat. If you want to book a seperate seat for your infant, you must call Airlines First. Thanks.';}
	
					} // if visible
								
					adults_1 = parseInt($j("select[name='room1_adults']").val());
					adults_2 = parseInt($j("select[name='room2_adults']").val());
					
					if ((adults_1 + adults_2 + children_1 + children_2) > 7) {
						strMessage += 'Total Passengers must be between 1 and 7.';
					}
					
					if (strMessage != '') {alert(strMessage); return false;}
					
					
					if (include_airfare_or_resort=='include_airfare')
					{
						if (infantMessage != '') {alert(infantMessage); }
					}
				
				$j.blockUI({ message: $j('#wait'), 
					 css:{
							border:'none',
							color:'#fff',
							width: '510px',
							height: '290px',
							padding: '0px',
						}
				 }); 
				
				strPost = '';
				leaving_from = $j("select[name='leaving_from']").val();
				if(dest != "--"){
					by_resort_or_destination = "by_resort";
					type_of_resort = dest;
					destination = "0";
					destination_2 = "ALL";
				} else {
					by_resort_or_destination = $j("input[name='by_resort_or_destination']:checked").val();
					type_of_resort = $j("select[name='resortName']").val();
					destination = $j("select[name='destinationName']").val();
					destination_2 = $j("select[name='resortType']").val();
				}
				departure_date = $j("input[name='departure_date']").val();
				//time = $j("select[name='time']").val();
				return_date = $j("input[name='return_date']").val();
				//time2 = $j("select[name='time2']").val();
	
				strPost += 'leaving_from='+leaving_from;
				strPost += '&include_airfare_or_resort='+include_airfare_or_resort;
				strPost += '&by_resort_or_destination='+by_resort_or_destination;
				strPost += '&resortName='+type_of_resort;
				strPost += '&type_of_resort='+type_of_resort;
				strPost += '&destinationName='+destination;
				strPost += '&resortType='+destination_2;
				strPost += '&departure_date='+departure_date;
				//strPost += '&time='+time;
				strPost += '&return_date='+return_date;
				//strPost += '&time2='+time2;
				
				strPost += '&room1_adults='+$j("select[name='room1_adults']").val();
				strPost += '&room1_children='+$j("select[name='room1_children']").val();
				strPost += '&room1_child1_age='+$j("select[name='room1_child1_age']").val();
				strPost += '&room1_child2_age='+$j("select[name='room1_child2_age']").val();
				strPost += '&room1_child3_age='+$j("select[name='room1_child3_age']").val();
				strPost += '&room2_adults='+$j("select[name='room2_adults']").val();
				strPost += '&room2_children='+$j("select[name='room2_children']").val();
				strPost += '&room2_child1_age='+$j("select[name='room2_child1_age']").val();
				strPost += '&room2_child2_age='+$j("select[name='room2_child2_age']").val();
				strPost += '&room2_child3_age='+$j("select[name='room2_child3_age']").val();
				strPost += '&cmdSearchResults=doSearch';
				
				//alert(strPost);
				//strPostEncode = (urlencode(strPost));
				
				$j.ajax({
					url:  '/getdata.php',
					type: 'POST',
					data: strPost,
					success: function(result) {
						//trim the data that is coming
						result = result.replace(/^\s+|\s+$/g, "");
						//alert(result);
						if (result == "success" || result == "") {
							if(by_resort_or_destination == 'by_resort') {
								window.location = '/searchResults.php';
							} else {
								window.location = '/choose_destination.php';							
							}
						}
						else {
							//alert("We have encountered an " +result+ " processing your request. Please try again.");
							alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
							$j.unblockUI(); 
						}
						return true;
					}
				});
				
				return false;
				
		}



	function urlencode(str) {
		str = escape(str);
		str = str.replace('+', '%2B');
		str = str.replace('%20', '+');
		str = str.replace('*', '%2A');
		str = str.replace('/', '%2F');
		str = str.replace('@', '%40');
		return str;
	}

	function urldecode(str) {
		str = str.replace('+', ' ');
		str = unescape(str);
		return str;
	}
	
	
	function setValidValue(vr){
		var strPosting = 'ht='+vr+'&checkValidChild=doCheck';
		var $b=jQuery.noConflict();
		$b.ajax({
			url:  '/getdata.php',
			type: 'POST',
			data: strPosting,
			success: function(res) {
				$b("#isChildAllowed").val(res);
			}
		});	
	}
	
	
	
	var $j=jQuery.noConflict(); 
	$j(function(){
		//$j("input[name='getquote']").click(function() {});
		
	// next function 	
		$j("#removeAirfareBtn").click(function() {
			strPost = "";			
			
			strPost += 'include_airfare_or_resort=just_resort';
			strPost += '&cmdRemoveAirfare=doRemove';
						
			$j.ajax({
				url:  'getdata.php',
				type: 'POST',
				data: strPost,
				success: function(result) {
                    //trim the data that is coming
                    result = result.replace(/^\s*/, "").replace(/\s*$/, "");
					if (result == 'done') {
						window.location = 'searchResults.php';
					}
					else {
						//alert("We encountered an " + result + " processing your request.  Please change your parameters and try again.");
						alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						$j.unblockUI(); 
					}
					return true;
				}
			});
			
			return false;
		});
		// func ends 
		
		
		
		// next function 
		$j("#showFlightsBtn").click(function() {
			strPost = "";			
			strPost += 'cmdChangePage=chooseAirfare';
			
			$j.ajax({
				url:  'getdata.php',
				type: 'POST',
				data: strPost,
				success: function(result) {
                    //trim the data that is coming
                    result = result.replace(/^\s*/, "").replace(/\s*$/, "");
					if (result == 'done') {
						window.location = 'choose_airfare.php';
					}
					else {
						//alert("We encountered an " + result + " processing your request.  Please change your parameters and try again.");
						alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						$j.unblockUI(); 
					}
					return true;
				}
			});
			
			return false;
		});
		// func ends
		

		$j("input[name='cmdContinueVerify']").click(function() {
			strMessage = ""; strPost = "";
			var ms1 =0; var ms2 =0; var ms3 =0; var ms4 =0;
			var pnum = $j("input[name='roomnum']").val();
			for(p=1;p<=pnum;p++){
				var pp = "room"+p;
				var pp1 = "room_"+p;
				var itm = pp+"ppl";
				vnum = $j("input[name='"+itm+"']").val();
				if(strPost == "" ) { strPost = strPost+pp+'='+vnum;}  else { strPost = strPost+'&'+pp+'='+vnum;}
				if(vnum != ""){
				vname = pp1+"_passengers_firstname[]";
				getval = document.getElementsByName(vname);
					for(var g=0;g<getval.length;g++){
						if(getval[g].value == ""){
							ms1 = ms1+1;
						} else {
							str = '&room'+p+'_fname_p'+(g+1)+'=';
							strPost += str+getval[g].value;
						}
					}
				if(ms1>0){	if(strMessage == '') {strMessage +="Room"+p+":\n";} strMessage +="Please enter your 'First Name(s).\n"; }	
				vname = pp1+"_passengers_mnmi[]";
				getval = document.getElementsByName(vname);
					for(var g=0;g<getval.length;g++){
						if(getval[g].value != ""){
							str = '&room'+p+'_mname_p'+(g+1)+'=';
							strPost += str+getval[g].value;
						}
					}
				vname = pp1+"_passengers_lastname[]";
				getval = document.getElementsByName(vname);
					for(var g=0;g<getval.length;g++){
						if(getval[g].value == ""){
							ms2 = ms2+1;
						} else {
							str = '&room'+p+'_lname_p'+(g+1)+'=';
							strPost += str+getval[g].value;
						}
					}	
				if(ms2>0){ if(strMessage == '') {strMessage +="Room"+p+":\n";} strMessage +="Please enter your 'Last Name(s).\n";	  }	
					if(document.getElementById('isAirfarePrice').value != 0){	 // if airfare 
					vname = pp1+"_passengers_dob[]";
					getval = document.getElementsByName(vname);
						for(var g=0;g<getval.length;g++){
							if(getval[g].value == ""){
								ms4 = ms4+1;
							} else {
								str = '&room'+p+'_dob_p'+(g+1)+'=';
								strPost += str+getval[g].value;
							}
						}
						if(ms4>0){ if(strMessage == '') {strMessage +="Room"+p+":\n";} strMessage +="Please enter your 'DOB(s).\n";	  }		
					} // if airefare ends 
				vname = pp1+"_passengers_gender[]";
				getval = document.getElementsByName(vname);
					for(var g=0;g<getval.length;g++){
						if(getval[g].value == ""){
							ms3 = ms3+1;  
						} else {
							str = '&room'+p+'_gen_p'+(g+1)+'=';
							strPost += str+getval[g].value;
						}
					}
				if(ms3>0){ if(strMessage == '') {strMessage +="Room"+p+":\n";} strMessage +="Please select 'Gender(s).\n";	  }	
					//if(document.getElementById('isAirfarePrice').value != 0){	// if airfare
						vname = pp1+"_passengers_age[]";
						getval = document.getElementsByName(vname); 
						if(getval.length == vnum){
							for(var g=0;g<getval.length;g++){
								if(getval[g].value != ""){
									str = '&room'+p+'_age_p'+(g+1)+'=';
									strPost += str+getval[g].value;
								}
							}
						} else {
							var diff = vnum-getval.length;
							for(var g=0;g<getval.length;g++){
								if(getval[g].value != ""){
									str = '&room'+p+'_age_p'+(g+1+diff)+'=';
									strPost += str+getval[g].value;
								}
							}
						}
						//
					//} // if airfare ends 
					
					vname = pp1+"_passengers_tsa[]";
				getval = document.getElementsByName(vname);
					for(var g=0;g<getval.length;g++){
						if(getval[g].value != ""){
							str = '&room'+p+'_tsa_p'+(g+1)+'=';
							strPost += str+getval[g].value;
						}
					}
					
			 	} // if ends  
			} // for ends 
			if(document.getElementById('certify_true').checked != true){
				strMessage +="Please certify that the information is TRUE. \n";
			}
			if(document.getElementsByName('travel_protection')[0].checked == "" && document.getElementsByName('travel_protection')[1].checked == ""){
				strMessage +="Please accept or decline the Travel Protection Plan. \n";
			}
			if (strMessage != '') { alert(strMessage); return false;}
			
			
			$j.blockUI({ message: $j('#processing'), 
				 css:{
						border:'none',
						color:'#fff',
						width: '425px',
						height: '240px',
						padding: '0px',
					}
			 }); 
			
			
			includetpp = $j("input[name='travel_protection']:checked").val();

			// if(includetpp == 'yes') {addtpp = "Y";} else {addtpp = "N"}
			
			tpp = $j("input[name='finalTPPPrice']").val();
			finalPrice = $j("input[name='finalPackagePrice']").val();
			
			strPost += '&includetpp='+includetpp;
			strPost += '&tpp='+tpp;
			strPost += '&finalPrice='+finalPrice;
			strPost += '&cmdContinueVerify=doVerify';

			$j.ajax({
				url:  'getdata.php',
				type: 'POST',
				data: strPost,
				success: function(result) {
                    //trim the data that is coming
                    //result = result.replace(/^\s*/, "").replace(/\s*$/, "");
					if (result == 'done') {
						window.location = 'confirm.php';
					}
					else {
						//alert("We encountered an " + result + " processing your request.  Please change your parameters and try again.");
						alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						$j.unblockUI(); 
					}
					return true;
				}
			});
			
		});
		
		
		
		$j("#btn_checkout").click(function() {
			strPost = "";			
			
			$j.blockUI({ message: $j('#processing'), 
				 css:{
						border:'none',
						color:'#fff',
						width: '425px',
						height: '240px',
						padding: '0px',
					}
			 }); 
			
			strPost += 'cmdCheckout=doCheckout';

			$j.ajax({
				url:  'getdata.php',
				type: 'POST',
				data: strPost,
				success: function(result) {
                    //trim the data that is coming
				    result = result.replace(/^\s+|\s+$/g, "");
					if (result == 'success') {
						window.location = 'billing.php';
					}
					else {
						//alert("We encountered an " + result + " processing your request.  Please change your parameters and try again.");
						alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						$j.unblockUI(); 
					}
					return true;
				}
			});
			
			return false;
		});
		// func ends 
		
		
		
		
		$j("#btn_billing").click(function() {
			var errMsg = ""; strPost = "";			
			
			ship_fname = $j("input[name='shipping_firstname']").val();
			if(ship_fname == ""){
				errMsg +="Shipping First Name is missing\n";
			}			
			ship_lname = $j("input[name='shipping_lastname']").val();
			if(ship_lname == ""){
				errMsg +="Shipping Last Name is missing\n";
			}
		    ship_add1 = $j("textarea[name='shipping_address1']").val();
			if(ship_add1 == ""){
				errMsg +="Shipping Address1 is missing\n";
			}
			ship_add2 = $j("textarea[name='shipping_address2']").val();
			ship_city = $j("input[name='shipping_city']").val();
			if(ship_city == ""){
				errMsg +="Shipping City is missing\n";
			}
			ship_state = $j("select[name='shipping_state']").val();
			ship_zip = $j("input[name='shipping_zip']").val();
			if(ship_zip == ""){
				errMsg +="Shipping Zip is missing\n";
			}
			ship_dayphone = $j("input[name='shipping_dayphone']").val();
			if(ship_dayphone == ""){
				errMsg +="Shipping Daytime Phone is missing\n";
			}
			ship_altphone = $j("input[name='shipping_altphone']").val();
			if(ship_altphone == ""){
				errMsg +="Shipping Alternate Phone is missing\n";
			}
			ship_email = $j("input[name='shipping_email']").val();
			if(ship_email == ""){
				errMsg +="Shipping Email is missing\n";
			}
			bill_fname = $j("input[name='billing_card_firstname']").val();
			if(bill_fname == ""){
				errMsg +="Billing First Name is missing\n";
			}
			bill_mname = $j("input[name='billing_card_midinitial']").val();
		    bill_lname = $j("input[name='billing_card_lastname']").val();
			if(bill_lname == ""){
				errMsg +="Billing Last Name is missing\n";
			}
			bill_add1 = $j("textarea[name='billing_address1']").val();
			if(bill_add1 == ""){
				errMsg +="Billing Address1 is missing\n";
			}
			bill_add2 = $j("textarea[name='billing_address2']").val();
			bill_city = $j("input[name='billing_city']").val();
			if(bill_city == ""){
				errMsg +="Billing City is missing\n";
			}
			bill_state = $j("select[name='billing_state']").val();
			bill_zip = $j("input[name='billing_zip']").val();
			if(bill_zip == ""){
				errMsg +="Billing Zip is missing\n";
			}
			payment_type = $j("input[name='payment_for']:checked").val();
			payment_cardnumber = $j("input[name='payment_cardnumber']").val();
			paycard = payment_cardnumber.replace(/\s+/g, '');
			if(trim(paycard) == ""){
				errMsg +="Card Number is missing\n";
			}
			payment_cardtype = $j("select[name='payment_cardtype']").val();
			
			if(payment_cardtype == "AX") {
				if(paycard.length != 15) { errMsg +="Card Number is invalid\n"; }
			} else if(payment_cardtype == "DC") {
				if(paycard.length != 14) { errMsg +="Card Number is invalid\n"; }
			} else if(payment_cardtype == "DI" || payment_cardtype == "MC" || payment_cardtype == "VI"){
				if(paycard.length != 16) { errMsg +="Card Number is invalid\n"; }	
			}
			
			payment_expiration_month = $j("select[name='payment_expiration_month']").val();
			payment_expiration_year = $j("select[name='payment_expiration_year']").val();
			payment_cvv = $j("input[name='payment_cvv']").val();
			if(trim(payment_cvv) == ""){
				errMsg +="CVV Number is missing\n";
			}
			
			if (errMsg != '') {alert(errMsg); return false;}
			
			
			$j.blockUI({ message: $j('#processing'), 
				 css:{
						border:'none',
						color:'#fff',
						width: '425px',
						height: '240px',
						padding: '0px',
					}
			 });
			
			strPost = 'cmdBilling=doBilling';
			
			strPost += '&shipping_firstname='+ship_fname;
			strPost += '&shipping_lastname='+ship_lname;
			strPost += '&shipping_address1='+ship_add1;
			strPost += '&shipping_address2='+ship_add2;
			strPost += '&shipping_city='+ship_city;
			strPost += '&shipping_state='+ship_state;
			strPost += '&shipping_zip='+ship_zip;
			strPost += '&shipping_dayphone='+ship_dayphone;
			strPost += '&shipping_altphone='+ship_altphone;
			strPost += '&shipping_email='+ship_email;
			
			strPost += '&billing_firstname='+bill_fname;
			strPost += '&billing_middlename='+bill_mname;
			strPost += '&billing_lastname='+bill_lname;
			strPost += '&billing_address1='+bill_add1;
			strPost += '&billing_address2='+bill_add2;
			strPost += '&billing_city='+bill_city;
			strPost += '&billing_state='+bill_state;
			strPost += '&billing_zip='+bill_zip;
			
			strPost += '&payment_type='+payment_type;
			//strPost += '&payment_cardnumber='+payment_cardnumber;
			strPost += '&payment_cardnumber='+paycard;
			strPost += '&payment_cardtype='+payment_cardtype;
			strPost += '&payment_expiration_month='+payment_expiration_month;
			strPost += '&payment_expiration_year='+payment_expiration_year;
			strPost += '&payment_cvv='+payment_cvv;		

			$j.ajax({
				url:  'getdata.php',
				type: 'POST',
				data: strPost,
				cache: false,
				success: function(result) {
                    //trim the data that is coming
					result = result.replace(/^\s+|\s+$/g, "");
					if (result == 'done') {
						window.location = 'thankyou.php';
					}
					else {
						//alert("We encountered an " + result + " processing your request.  Please change your parameters and try again.");
						alert(result + ": We are facing some technical difficulties right now. Our Apologies for the inconvinience. Please try again later.");
						$j.unblockUI(); 
					}
					return true;
				}
			});
			
			return false;
		});
		// func ends 
		
	});
	
	
	
	
	
	
	
	/*block start*/
	/*!
 * jQuery blockUI plugin
 * Version 2.36 (16-NOV-2010)
 * @requires jQuery v1.2.3 or later
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007-2008 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
 */

;(function($) {

if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
	alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
	return;
}

$.fn._fadeIn = $.fn.fadeIn;

var noOp = function() {};

// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
// retarded userAgent strings on Vista)
var mode = document.documentMode || 0;
var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;

// global $ methods for blocking/unblocking the entire page
$.blockUI   = function(opts) { install(window, opts); };
$.unblockUI = function(opts) { remove(window, opts); };

// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
$.growlUI = function(title, message, timeout, onClose) {
	var $m = $('<div class="growlUI"></div>');
	if (title) $m.append('<h1>'+title+'</h1>');
	if (message) $m.append('<h2>'+message+'</h2>');
	if (timeout == undefined) timeout = 3000;
	$.blockUI({
		message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
		timeout: timeout, showOverlay: false,
		onUnblock: onClose, 
		css: $.blockUI.defaults.growlCSS
	});
};

// plugin method for blocking element content
$.fn.block = function(opts) {
	return this.unblock({ fadeOut: 0 }).each(function() {
		if ($.css(this,'position') == 'static')
			this.style.position = 'relative';
		if ($.browser.msie)
			this.style.zoom = 1; // force 'hasLayout'
		install(this, opts);
	});
};

// plugin method for unblocking element content
$.fn.unblock = function(opts) {
	return this.each(function() {
		remove(this, opts);
	});
};

$.blockUI.version = 2.35; // 2nd generation blocking at no extra cost!

// override these in your code to change the default behavior and style
$.blockUI.defaults = {
	// message displayed when blocking (use null for no message)
	message:  '<h1>Please wait...</h1>',

	title: null,	  // title string; only used when theme == true
	draggable: true,  // only used when theme == true (requires jquery-ui.js to be loaded)
	
	theme: false, // set to true to use with jQuery UI themes
	
	// styles for the message when blocking; if you wish to disable
	// these and use an external stylesheet then do this in your code:
	// $.blockUI.defaults.css = {};
	css: {
		padding:	0,
		margin:		0,
		width:		'30%',
		top:		'40%',
		left:		'35%',
		textAlign:	'center',
		color:		'#000',
		border:		'3px solid #aaa',
		backgroundColor:'#fff',
		cursor:		'wait'
	},
	
	// minimal style set used when themes are used
	themedCSS: {
		width:	'30%',
		top:	'40%',
		left:	'35%'
	},

	// styles for the overlay
	overlayCSS:  {
		backgroundColor: '#000',
		opacity:	  	 0.9,
		cursor:		  	 'wait'
	},

	// styles applied when using $.growlUI
	growlCSS: {
		width:  	'350px',
		top:		'0px',
		left:   	'',
		right:  	'10px',
		border: 	'none',
		padding:	'0px',
		opacity:	0.9,
		cursor: 	'default',
		color:		'#fff',
		backgroundColor: '#000',
		'-webkit-border-radius': '10px',
		'-moz-border-radius':	 '10px',
		'border-radius': 		 '10px'
	},
	
	// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
	// (hat tip to Jorge H. N. de Vasconcelos)
	iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',

	// force usage of iframe in non-IE browsers (handy for blocking applets)
	forceIframe: false,

	// z-index for the blocking overlay
	baseZ: 1000,

	// set these to true to have the message automatically centered
	centerX: true, // <-- only effects element blocking (page block controlled via css above)
	centerY: true,

	// allow body element to be stetched in ie6; this makes blocking look better
	// on "short" pages.  disable if you wish to prevent changes to the body height
	allowBodyStretch: true,

	// enable if you want key and mouse events to be disabled for content that is blocked
	bindEvents: true,

	// be default blockUI will supress tab navigation from leaving blocking content
	// (if bindEvents is true)
	constrainTabKey: true,

	// fadeIn time in millis; set to 0 to disable fadeIn on block
	fadeIn:  200,

	// fadeOut time in millis; set to 0 to disable fadeOut on unblock
	fadeOut:  400,

	// time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
	timeout: 0,

	// disable if you don't want to show the overlay
	showOverlay: true,

	// if true, focus will be placed in the first available input field when
	// page blocking
	focusInput: true,

	// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
	applyPlatformOpacityRules: true,
	
	// callback method invoked when fadeIn has completed and blocking message is visible
	onBlock: null,

	// callback method invoked when unblocking has completed; the callback is
	// passed the element that has been unblocked (which is the window object for page
	// blocks) and the options that were passed to the unblock call:
	//	 onUnblock(element, options)
	onUnblock: null,

	// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
	quirksmodeOffsetHack: 4,

	// class name of the message block
	blockMsgClass: 'blockMsg'
};

// private data and functions follow...

var pageBlock = null;
var pageBlockEls = [];

function install(el, opts) {
	var full = (el == window);
	var msg = opts && opts.message !== undefined ? opts.message : undefined;
	opts = $.extend({}, $.blockUI.defaults, opts || {});
	opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
	var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
	var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
	msg = msg === undefined ? opts.message : msg;

	// remove the current block (if there is one)
	if (full && pageBlock)
		remove(window, {fadeOut:0});

	// if an existing element is being used as the blocking content then we capture
	// its current place in the DOM (and current display style) so we can restore
	// it when we unblock
	if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
		var node = msg.jquery ? msg[0] : msg;
		var data = {};
		$(el).data('blockUI.history', data);
		data.el = node;
		data.parent = node.parentNode;
		data.display = node.style.display;
		data.position = node.style.position;
		if (data.parent)
			data.parent.removeChild(node);
	}

	var z = opts.baseZ;

	// blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
	// layer1 is the iframe layer which is used to supress bleed through of underlying content
	// layer2 is the overlay layer which has opacity and a wait cursor (by default)
	// layer3 is the message content that is displayed while blocking

	var lyr1 = ($.browser.msie || opts.forceIframe) 
		? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
		: $('<div class="blockUI" style="display:none"></div>');
	var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
	
	var lyr3, s;
	if (opts.theme && full) {
		s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
				'<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
				'<div class="ui-widget-content ui-dialog-content"></div>' +
			'</div>';
	}
	else if (opts.theme) {
		s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:absolute">' +
				'<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
				'<div class="ui-widget-content ui-dialog-content"></div>' +
			'</div>';
	}
	else if (full) {
		s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+z+';display:none;position:fixed"></div>';
	}			
	else {
		s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+z+';display:none;position:absolute"></div>';
	}
	lyr3 = $(s);

	// if we have a message, style it
	if (msg) {
		if (opts.theme) {
			lyr3.css(themedCSS);
			lyr3.addClass('ui-widget-content');
		}
		else 
			lyr3.css(css);
	}

	// style the overlay
	if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
		lyr2.css(opts.overlayCSS);
	lyr2.css('position', full ? 'fixed' : 'absolute');

	// make iframe layer transparent in IE
	if ($.browser.msie || opts.forceIframe)
		lyr1.css('opacity',0.0);

	//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
	var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
	$.each(layers, function() {
		this.appendTo($par);
	});
	
	if (opts.theme && opts.draggable && $.fn.draggable) {
		lyr3.draggable({
			handle: '.ui-dialog-titlebar',
			cancel: 'li'
		});
	}

	// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
	var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
	if (ie6 || expr) {
		// give body 100% height
		if (full && opts.allowBodyStretch && $.boxModel)
			$('html,body').css('height','100%');

		// fix ie6 issue when blocked element has a border width
		if ((ie6 || !$.boxModel) && !full) {
			var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
			var fixT = t ? '(0 - '+t+')' : 0;
			var fixL = l ? '(0 - '+l+')' : 0;
		}

		// simulate fixed position
		$.each([lyr1,lyr2,lyr3], function(i,o) {
			var s = o[0].style;
			s.position = 'absolute';
			if (i < 2) {
				full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
					 : s.setExpression('height','this.parentNode.offsetHeight + "px"');
				full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
					 : s.setExpression('width','this.parentNode.offsetWidth + "px"');
				if (fixL) s.setExpression('left', fixL);
				if (fixT) s.setExpression('top', fixT);
			}
			else if (opts.centerY) {
				if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
				s.marginTop = 0;
			}
			else if (!opts.centerY && full) {
				var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
				var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
				s.setExpression('top',expression);
			}
		});
	}

	// show the message
	if (msg) {
		if (opts.theme)
			lyr3.find('.ui-widget-content').append(msg);
		else
			lyr3.append(msg);
		if (msg.jquery || msg.nodeType)
			$(msg).show();
	}

	if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
		lyr1.show(); // opacity is zero
	if (opts.fadeIn) {
		var cb = opts.onBlock ? opts.onBlock : noOp;
		var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
		var cb2 = msg ? cb : noOp;
		if (opts.showOverlay)
			lyr2._fadeIn(opts.fadeIn, cb1);
		if (msg)
			lyr3._fadeIn(opts.fadeIn, cb2);
	}
	else {
		if (opts.showOverlay)
			lyr2.show();
		if (msg)
			lyr3.show();
		if (opts.onBlock)
			opts.onBlock();
	}

	// bind key and mouse events
	bind(1, el, opts);

	if (full) {
		pageBlock = lyr3[0];
		pageBlockEls = $(':input:enabled:visible',pageBlock);
		if (opts.focusInput)
			setTimeout(focus, 20);
	}
	else
		center(lyr3[0], opts.centerX, opts.centerY);

	if (opts.timeout) {
		// auto-unblock
		var to = setTimeout(function() {
			full ? $.unblockUI(opts) : $(el).unblock(opts);
		}, opts.timeout);
		$(el).data('blockUI.timeout', to);
	}
};

// remove the block
function remove(el, opts) {
	var full = (el == window);
	var $el = $(el);
	var data = $el.data('blockUI.history');
	var to = $el.data('blockUI.timeout');
	if (to) {
		clearTimeout(to);
		$el.removeData('blockUI.timeout');
	}
	opts = $.extend({}, $.blockUI.defaults, opts || {});
	bind(0, el, opts); // unbind events
	
	var els;
	if (full) // crazy selector to handle odd field errors in ie6/7
		els = $('body').children().filter('.blockUI').add('body > .blockUI');
	else
		els = $('.blockUI', el);

	if (full)
		pageBlock = pageBlockEls = null;

	if (opts.fadeOut) {
		els.fadeOut(opts.fadeOut);
		setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
	}
	else
		reset(els, data, opts, el);
};

// move blocking element back into the DOM where it started
function reset(els,data,opts,el) {
	els.each(function(i,o) {
		// remove via DOM calls so we don't lose event handlers
		if (this.parentNode)
			this.parentNode.removeChild(this);
	});

	if (data && data.el) {
		data.el.style.display = data.display;
		data.el.style.position = data.position;
		if (data.parent)
			data.parent.appendChild(data.el);
		$(el).removeData('blockUI.history');
	}

	if (typeof opts.onUnblock == 'function')
		opts.onUnblock(el,opts);
};

// bind/unbind the handler
function bind(b, el, opts) {
	var full = el == window, $el = $(el);

	// don't bother unbinding if there is nothing to unbind
	if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
		return;
	if (!full)
		$el.data('blockUI.isBlocked', b);

	// don't bind events when overlay is not in use or if bindEvents is false
	if (!opts.bindEvents || (b && !opts.showOverlay)) 
		return;

	// bind anchors and inputs for mouse and key events
	var events = 'mousedown mouseup keydown keypress';
	b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);

// former impl...
//	   var $e = $('a,:input');
//	   b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
};

// event handler to suppress keyboard/mouse events when blocking
function handler(e) {
	// allow tab navigation (conditionally)
	if (e.keyCode && e.keyCode == 9) {
		if (pageBlock && e.data.constrainTabKey) {
			var els = pageBlockEls;
			var fwd = !e.shiftKey && e.target === els[els.length-1];
			var back = e.shiftKey && e.target === els[0];
			if (fwd || back) {
				setTimeout(function(){focus(back)},10);
				return false;
			}
		}
	}
	var opts = e.data;
	// allow events within the message content
	if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0)
		return true;

	// allow events for content that is not being blocked
	return $(e.target).parents().children().filter('div.blockUI').length == 0;
};

function focus(back) {
	if (!pageBlockEls)
		return;
	var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
	if (e)
		e.focus();
};

function center(el, x, y) {
	var p = el.parentNode, s = el.style;
	var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
	var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
	if (x) s.left = l > 0 ? (l+'px') : '0';
	if (y) s.top  = t > 0 ? (t+'px') : '0';
};

function sz(el, p) {
	return parseInt($.css(el,p))||0;
};

})(jQuery);

	/*block end*/

