var order_form_state = 'pre-init';
jQuery(function($){
	
	$('a.blank').each(function(){
		$(this).attr({ 'target' : '_blank' });
	});
	
	$('.get-started-button').hover(
		function(){ $(this).addClass('get-started-button-hover'); },
		function(){ $(this).removeClass('get-started-button-hover'); }
	);
	
	$('.submit-button').hover(
		function(){ $(this).addClass('submit-button-hover'); },
		function(){ $(this).removeClass('submit-button-hover'); }
	);
	
	$('.field')
		.focus( function(){ $(this).addClass('field-focus'); })
		.blur( function(){ $(this).removeClass('field-focus'); })
	
	/* ---- */
	$("#slider").slider({
		value:1,
		min: 1,
		max: 20,
		step: 1,
		slide: function(event, ui) {
			set_num_pages_proxy( ui.value );
		}
	});
	$("#slider").attr('class', '');
	$(".ui-slider-handle").attr('class', 'ui-slider-handle');
	
	// in case you're chanign something here, you need to:
	// 1. update PHP code(in order-fns.php)
	// 2. update test routine below
	function calculate_days_needed(num_pages) {
	    var business_days_needed = 0;
	    if (num_pages == 1) {
	    	business_days_needed = 1;
	    } else if (num_pages < 10) {
	    	business_days_needed = 1 + Math.ceil((num_pages - 1) / 2);
	    } else if (num_pages < 13) {
	    	business_days_needed = 6;
	    } else {
	    	business_days_needed = 2 + Math.ceil((num_pages - 4) / 2);
	    } 
	    return business_days_needed;
	}
	function test_calculate_days_needed() {
	    var cases = [
	    	{'num_pages': 1 , 'days_needed':  1 },
	    	
	    	{'num_pages': 2 , 'days_needed':  2 },
	    	{'num_pages': 3 , 'days_needed':  3 },
	    	{'num_pages': 4 , 'days_needed':  3 },
	    	
	    	{'num_pages': 5 , 'days_needed':  4 },
	    	{'num_pages': 6 , 'days_needed':  4 },
	    	
	    	{'num_pages': 7 , 'days_needed':  4 },
	    	{'num_pages': 8 , 'days_needed':  5 },
	    	{'num_pages': 9 , 'days_needed':  5 },
	    	{'num_pages': 10, 'days_needed':  6 },
	    	{'num_pages': 11, 'days_needed':  6 },
	    	{'num_pages': 12, 'days_needed':  6 },
	    	
	    	{'num_pages': 13, 'days_needed':  7 },
	    	{'num_pages': 14, 'days_needed':  7 },
	    	{'num_pages': 15, 'days_needed':  8 },
	    	{'num_pages': 16, 'days_needed':  8 },
	    	{'num_pages': 17, 'days_needed':  9 },
	    	{'num_pages': 18, 'days_needed':  9 },
	    	{'num_pages': 19, 'days_needed':  10},
	    	{'num_pages': 20, 'days_needed':  10},
	    	
	    	{'num_pages': 201, 'days_needed':  101}
	    ];
	    for (var i=0; i < cases.length; i++) {
	    	var c = cases[i];
	    	if (calculate_days_needed(c.num_pages)!==c.days_needed) {
	    		/* console.log("Failed for " + c.num_pages + ": expected " + 
	    			c.days_needed + ", got " + calculate_days_needed(c.num_pages));
	    		*/
	    	}
	    };
	    //console.log('done');
	}
	// test_calculate_days_needed();
	function format_the_date(dateobj) {
	    return weekdays[dateobj.getDay()] + ", " + months[dateobj.getMonth()] + "/" + zero_padded(dateobj.getDate());
	}
	
	function slider_changed(num_pages) {
	    $('.slider-numbers span').removeClass('active-number');
		$('.slider-numbers span').eq( num_pages - 1 ).addClass('active-number');
		$('#number-pages').html( num_pages );
	}
	// on IE moving scroll is causing lagging because
	// set_num_pages is creating expensive date picker objects
	var set_num_pages_interval = null;
	function set_num_pages_proxy(num_pages) {
		slider_changed(num_pages);
		
	    if (set_num_pages_interval!==null) {
	    	clearTimeout(set_num_pages_interval);
	    }
	    set_num_pages_interval = setTimeout(function () {
    	    set_num_pages(num_pages);
    	}, 150);
	}
	var delivery_date;
	function set_num_pages( num_pages ) {
		slider_changed(num_pages);
		
		var days_needed = calculate_days_needed(num_pages);
		delivery_date = calculate_delivery_date(days_needed);
		var formated_date = format_the_date(delivery_date);
		
		var tomorrow = new Date();
		tomorrow.setTime(create_date().getTime() + 86400 * 1000);
		
		
		if (delivery_date.to_iso()!=tomorrow.to_iso()) {
			$('#expedited-delivery').show();
			$('#delivery-date-expedited').datepicker('destroy');
			
			var first_possible_delivery_date = new Date(), last_possible_delivery_date = new Date();
			
			first_possible_delivery_date.setTime(create_date().getTime() + 86400 * 1000);
			var num_months = 1;
			if (first_possible_delivery_date.getMonth() != delivery_date.getMonth()) {
				num_months = 2;
			}
			$('#delivery-date-expedited').datepicker({
				minDate: first_possible_delivery_date,
				maxDate: delivery_date,
				beforeShowDay: $.datepicker.noWeekends,
				beforeShow: function(input, inst) {
					$('#ui-datepicker-div').css('visibility', 'hidden');
					setTimeout(function () {
						$('#ui-datepicker-div').css('visibility', 'visible');
						var should_show = true;
						if ($('#expedited-delivery').offset().top > $(document).scrollTop() + $('#ui-datepicker-div').height()) {
							$('#ui-datepicker-div').css({
								top: parseInt($('#ui-datepicker-div').position().top - $('#ui-datepicker-div').height() - 5) + 'px'
							});
						}
						
					})
			    },
				hideIfNoPrevNext: true,
				defaultDate: delivery_date,
				numberOfMonths: num_months,
				showAnim: null,
				duration: '',
				onSelect: function () {
					var expedied_by = 0, 
						new_delivery_date = $(this).datepicker('getDate'),
						tmp_date = new Date();
					tmp_date.setTime(delivery_date.getTime());
					
					while (tmp_date.getTime() > new_delivery_date.getTime()) {
						if (tmp_date.is_business_day()) {
							expedied_by++;
						}
						tmp_date.setTime(tmp_date.getTime() - 86400 * 1000);
					}
					adjust_price(expedied_by);
					$('#expedited-by').val(expedied_by);
					$('#deliverydate').html(format_the_date(new_delivery_date));
				}
			});
			$('#delivery-date-expedited').datepicker('setDate', delivery_date);
		} else {
			$('#expedited-delivery').hide();
		}
		
		$('#deliverydate').html(formated_date);
		var price;
		if (num_pages==1) {
			price = 138;
		} else if (num_pages<=4) {
			price = 274;
		} else if (num_pages<=6) {
			price = 412;
		} else if (num_pages<=12) {
			price = 480;
		} else {
			price = 480 + (num_pages - 12) * 48;
		}
		
		$('#price').html('$' + price);
		$('#price').data('unexpedited_price', price);
		
		$('#num-pages').val(num_pages);
	}
	function create_date(timestamp) {
		timestamp = timestamp || CURRENT_TIME;
	    var d = new Date();
	    d.setTime(timestamp * 1000);
	    return d;
	}
	function calculate_delivery_date(business_days_needed) {
	    var delivery_date = create_date();
	    for (var i=0; i < business_days_needed; ) {
	    	delivery_date.setTime(delivery_date.getTime() + 86400 * 1000);
	    	if (delivery_date.is_business_day()) {
	    		i++;
	    	}
	    }
	    return delivery_date;
	}
	set_num_pages(1);
	/* --- */
	$('#contactform').submit(function () {
	    var mail = $(this).find('input[name=mail]');
	    var message = $(this).find('textarea[name=message]');
	    
	    var err = '';
	    if (mail.val()=='') {
	    	err = {field: mail, msg: 'Please, enter your e-mail address'};
	    } else if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(mail.val())==false) {
	    	err = {field: mail, msg: 'Please, enter valid e-mail address'};
	    } else if (message.val()=='') {
	    	err = {field: message, msg: 'Please, enter your message'};
	    }
	    
	    if (err) {
	    	alert(err.msg);
	    	err.field.focus();
	    	return false;
	    }
	});
	function file_queue_error(file, code, message) {
		var error_message = "";
		if (code==SWFUpload.errorCode_QUEUE_LIMIT_EXCEEDED) {
			alert("Please choose single file.");
		} else if (code==SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE) {
			alert("Please choose non-empty file.");
		} else if (code==SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT) {
			alert("You're trying to upload too big file.");
		} else {
			alert(message);
		}
	}
	function file_dialog_complete(num_files_selected, num_files_queued) {
		var num_files = this.getStats().files_queued;
		
		var f = swfu.getFile(num_files - 1);
		$('.uploadfield').val(f.name);
		// cancel previous upload
		if (num_files > 1) {
			swfu.cancelUpload(swfu.getFile(0).id, false);
		}
		order_form_state = 'pending-upload';
	}
	function upload_progress(file, bytesLoaded) {
		var percent = Math.ceil((bytesLoaded / file.size) * 100);
		$('#progressbar-loader').css('width', percent + '%');
		$('#percent-done').html(percent);
	}
	function upload_success(file, files_location) {
		swfu.destroy();
		$('#designs-location').val(files_location);
		$('#progressbar-message').html("Please, wait ... ");
		order_form_state = 'upload-complete';
		$('#orderform').submit();
	}
	function upload_error(file, errorCode, message) {
		alert("upload_error" + message);
	}
	function upload_complete(file, errorCode, message) {
		
	}
	$('#orderform').submit(function () {
	    var name = $(this).find('input[name=uname]');
	    var mail = $(this).find('input[name=mail]');
	    var message = $(this).find('textarea[name=message]');
	    
	    if (name.val()=='') {
	    	alert("Please, enter your name");
	    	name.focus();
	    	return false;
	    }
	    if (mail.val()=='') {
	    	alert("Please, enter your e-mail address");
	    	mail.focus();
	    	return false;
	    }
	    if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(mail.val())==false) {
	    	alert("Please, enter valid e-mail address");
	    	mail.focus();
	    	return false;
	    }
	    if (message.val()=='') {
	    	alert("Please, enter comments or instructions");
	    	message.focus();
	    	return false;
	    }
		
	    if (order_form_state=='pending-upload') {
	    	$('.summary-order-button').addClass('disabled');
		    $('#progress').slideDown();
		    swfu.startUpload();
		    return false;	
	    }
	});
	
	if ($('#flash-upload-button').length) {
		swfu = new SWFUpload({
			// Backend Settings
			upload_url: SITE_HOME + "/upload.php",
	
			// File Upload Settings
			file_size_limit: "100 MB",	// 2MB
			file_types: ALLOWED_FORMATS,
			file_types_description : "Design Assets",
			file_upload_limit : "0",
	
			file_queue_error_handler: file_queue_error,
			file_dialog_complete_handler: file_dialog_complete,
			upload_progress_handler: upload_progress,
			upload_error_handler: upload_error,
			upload_success_handler: upload_success,
			upload_complete_handler: upload_complete,
	
			// Button Settings
			button_image_url: STYLESHEET_DIRECTORY + "/images/browse.png",
			button_placeholder_id : "flash-upload-button",
			button_width: 71,
			button_height: 26,
			button_text : '',
			button_text_style : '',
			button_text_top_padding: 0,
			button_text_left_padding: 0,
			button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
			button_cursor: SWFUpload.CURSOR.HAND,
			
			// Single file upload allowed
			button_action: SWFUpload.BUTTON_ACTION.SELECT_FILE,
			
			// Flash Settings
			flash_url : STYLESHEET_DIRECTORY + "/js/swfupload/swfupload.swf",
			
			// Debug Settings
			debug: false
		});
		order_form_state = 'init';
	};
	
	$('#delivery-date-expedited').datepicker();
	$('#expedited-delivery').click(function () {
	    $('#delivery-date-expedited').datepicker('show');
	    return false;
	});
	function adjust_price(expedited_by) {
		var expedited_fee = expedited_by * 98;
		var current_price = $('#price').data('unexpedited_price');
		
	    $('#price').html('$' + parseInt(current_price + expedited_fee));
	}
});
SUNDAY = 0, SATURDAY = 6;
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
Date.prototype.is_business_day = function () {
	return !(this.getDay()==SUNDAY || this.getDay()==SATURDAY);
}
function zero_padded(i) {
    return i < 10 ? '0' + i : i;
}
Date.prototype.to_iso = function () {
    return this.getFullYear() + "-" + zero_padded(this.getMonth() + 1) + "-" + zero_padded(this.getDate());
}
