var orderPage;

var OrderPage = new Class({
	Implements: [Events, Options],

	options: {
		stdDays: [],
		expDays: [],
		months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
		packages: {},
		webPageBasePrice: 0,
		emailTemplateBasePrice: 0,
		webPagePrices: {},
		emailTemplatePrices: {},
		idSelector: 'type',
		SELECTOR_VALUE_WEBPAGE: 'webpage',
		SELECTOR_VALUE_EMAIL: 'email',
		idAmount: 'amount',
		idTab: 'tab',
		idWebPageOptions: 'web-template',
		idEmailOptions: 'email-template',
		idOrderForm: 'order-form',
		idPages: 'order-pages',
		ID_SENDREQUEST: 'btn-send-request',
		idPreWebPageOption: '_input_',
		idPreEmailTemplateOption: '_input_em',
		idPreImplementationOption: '_input_i_engine',
		idPreOptionPrice: 'price',
		idPrePackage: 'pkg_',
		currencySign: '$',
		strIncluded: 'included',
		strSamePrice: 'same price',
		classExpandButton: 'expand-option-link',
		classExpandedOption: 'expand-option',
		classOption: 'option',
		freeOptions: {},
		selectActivePackage: false,
		debug: false
	},

	initialize: function(options) {
		this.setOptions(options);

		this.basePrice = {};
		this.freeOptions = {},
		this.prices = {};

		this.form = $(this.options.idOrderForm);
		var selector = $(this.options.idSelector);
		if(this.form && selector) {
			this.opts = {};
			this.opts[this.options.idWebPageOptions] = {};
			this.opts[this.options.idEmailOptions] = {};
			this.optionsSelector = selector.value;
			this.log('Default selector: ' + selector.value);

			this.activePackage = {};
			this.activePackage[this.options.idWebPageOptions] = null;
			this.activePackage[this.options.idEmailOptions] = null;

			this.basePrice[this.options.idWebPageOptions] = this.options.webPageBasePrice;
			this.basePrice[this.options.idEmailOptions] = this.options.emailTemplateBasePrice;

			this.prices[this.options.idWebPageOptions] = this.options.webPagePrices;
			this.prices[this.options.idEmailOptions] = this.options.emailTemplatePrices;

			this.initRadioButtons();
			this.initFreeOptions(this.options.idWebPageOptions);
			this.initFreeOptions(this.options.idEmailOptions);
			this.initPackages();
			this.initOptionButtons();
			this.initOrderForm();

			if(this.options.selectActivePackage) {
				this.selectPackage(this.activePackage[this.optionsSelector]);
			}
			else {
				this.calculatePrice();
			}
		}
	},

	initOptionButtons: function() {
		$$('.' + this.options.classExpandButton).each(function(item) {
			item.href = 'javascript:;';
			item.addEvent('click', (function() {
				var node = $(item.rel);
				if(node) {
					node.toggleClass(this.options.classExpandedOption);
				}

				return false;
			}).bind(this));
		}, this);
	},

	initRadioButtons: function () {
		// WebPage Options
		$$('#' + this.options.idWebPageOptions + ' input.' + this.options.classOption + '[type=radio]').each(function(item) {
			this.opts[this.options.idWebPageOptions][item.id] = true;
			item.addEvent('click', (function() {
				this.calculatePrice();
			}).bind(this));
		}, this);

		// Email Template Options
		$$('#' + this.options.idEmailOptions + ' input.' + this.options.classOption + '[type=radio]').each(function(item) {
			this.opts[this.options.idEmailOptions][item.id] = true;
			item.addEvent('click', (function() {
				this.calculatePrice();
			}).bind(this));
		}, this);
	},

	initOrderForm: function() {
		var pages = $(this.options.idPages);
		if(pages) {
			pages.addEvents({
				keyup: (function(event, object) {
					this.value = this.value.trim();
					if(this.value) {
						if(isNaN(this.value) || Number(this.value) < 1) {
							this.value = 1;
						}
						this.value = parseInt(this.value);

						object.fillOrderExpedited(this.value);
						object.calculatePrice();
					}
				}.bindWithEvent(pages, this)),
				change: (function(event, object) {
					this.value = this.value.trim();
					if(this.value) {
						if(isNaN(this.value) || Number(this.value) < 1) {
							this.value = 1;
						}
						this.value = parseInt(this.value);

						object.fillOrderExpedited(this.value);
						object.calculatePrice();
					}
				}.bindWithEvent(pages, this))
			});

			var orderExpedited = $('order-expedited');
			if(orderExpedited) {
				orderExpedited.addEvent('change', function() {
					this.calculatePrice();
				});
			}
			this.fillOrderExpedited(parseInt(pages.value));
		}
	},

	initFreeOptions: function(selector) {
		for(var option in this.opts[selector]) {
			var isFree = true;
			var element = $(option);
			if(element) {
				var set = this.form.elements[element.name];
				for(var i = 0; i < set.length; i++) {
					if(this.prices[selector][set[i].id] != 0) {
						isFree = false;
						break;
					}
				}
				if(isFree) {
					this.freeOptions[option] = true;
					for(var i = 0; i < set.length; i++) {
						var optionPrice = $(this.options.idPreOptionPrice + set[i].id);
						if(optionPrice) {
							optionPrice.set('html', '');
						}
					}
				}
			}
		}
	},

	initPackages: function() {
		var selector = this.options.idWebPageOptions;
		for(var pckg in this.options.packages) {
			var pack = $(this.options.idPrePackage + pckg);
			if(pack) {
				pack.addEvent('click', (function(event, object) {
					object.log('pack-change:' + this.id);
					object.selectPackage(this.id);
				}).bindWithEvent(pack, this));
			}
			if(pack.getProperty('checked')) {
				this.log('Set: ' + selector + ' = ' + pack.id);
				this.activePackage[selector] = pack.id;
				selector = this.options.idEmailOptions;
			}
		}
	},

	selectPackage: function(id) {
		this.log('selectPackage: ' + id);
		var pkg = $(id);
		if(pkg) {
			this.activePackage[this.optionsSelector] = id;
			for(var option in this.opts[this.optionsSelector]) {
				var element = $(option);
				if(element) {
					var set = this.form.elements[element.name];
					var len = (this.optionsSelector == this.options.idWebPageOptions? this.options.idPreWebPageOption: this.options.idPreEmailTemplateOption).length;
					var v = this.options.packages[id.replace(this.options.idPrePackage, '')][element.name.substr(len)];
					if(v) {
						for(var i = 0; i < set.length; i++) {
							if(set[i].value == v) {
								set[i].checked = true;
							}
						}
					}
					else {
						set[0].checked = true;
					}
				}
			}
			this.calculatePrice();
		}
	},

	selectTab: function(selector) {
		this.log('selectTab: ' + selector);
		this.optionsSelector = selector;
		this.calculatePrice();
	},

	selectExpedite: function(link) {
		var textExpeditedDelivery = $('text-expedited-delivery');
		if(textExpeditedDelivery) {
			var options = $$('#order-expedited option');
			if(link == options.length - 1) {
				textExpeditedDelivery.addClass('bold');
			}
			else {
				textExpeditedDelivery.removeClass('bold');
			}
		}
		this.calculatePrice();
	},

	calculatePrice: function() {
		var imp = 0;
		var sum = this.basePrice[this.optionsSelector];
		var amount = $(this.options.idAmount);

		for(var option in this.opts[this.optionsSelector]) {
			var element = $(option);
			if(element) {
				if(!this.freeOptions[option] && element.getProperty('checked')) {
					if(this.prices[this.optionsSelector][option]) {
						this.log(option + ':' + element.getProperty('checked'));
						if(option.indexOf(this.options.idPreImplementationOption) == 0) {
							imp = this.prices[this.optionsSelector][option];
						}
						else {
							sum += this.prices[this.optionsSelector][option];
						}
					}
				}
				else {
					continue;
				}

				var optionPrice = $(this.options.idPreOptionPrice + option);
				if(optionPrice) {
					optionPrice.set('html', this.options.strIncluded);
					optionPrice.addClass('bold');
				}

				var name = element.getProperty('name');
				var set = this.form.elements[name];
				for(var i = 0; i < set.length; i++) {
					if(set[i].id != option) {
						var p = this.prices[this.optionsSelector][set[i].id] - this.prices[this.optionsSelector][option];
						var optionPrice = $(this.options.idPreOptionPrice + set[i].id);
						if(optionPrice) {
							optionPrice.set('html', (p == 0? this.options.strSamePrice: (p > 0 ? '+' : '-') + this.options.currencySign + Math.abs(p)));
							optionPrice.removeClass('bold');
						}
					}
				}
			}
		}

		var timelineNote = $('timeline-note');
		var implementationNote = $('implementation-note');
		if(timelineNote && implementationNote) {
			if(imp) {
				timelineNote.addClass('hidden');
				implementationNote.removeClass('hidden');
			}
			else {
				timelineNote.removeClass('hidden');
				implementationNote.addClass('hidden');
			}
		}
		var pages = $(this.options.idPages);
		if(pages) {
			var pn = 1;
			pages.value = pages.value.trim();
			if(!(isNaN(pages.value) || Number(pages.value) < 1)) {
				pn = parseInt(pages.value);
			}
			if(pn > 1) {
				sum += sum * (pn - 1) / 2;
			}

			var orderExpedited = $('order-expedited');
			var orderEstDelivery = $('order-est-delivery');
			if(orderExpedited && orderEstDelivery) {

				// increases BOLD
				if(orderExpedited.value != 'no')
				{
					$('increases').setStyle('font-weight', 'bold');
				}
				else
				{
					$('increases').setStyle('font-weight', 'normal');
				}

				var pageIndex;
				if(this.options.expDays[pn - 1]) {
					pageIndex = pn - 1;
					var expeditedDays;
					if(orderExpedited.value == 'asap') {
						expeditedDays = this.options.expDays[pageIndex]['expETADays'];
					}
					else if(orderExpedited.value != 'no') {
						expeditedDays = parseInt(orderExpedited.value);
					}
					else {
						expeditedDays = 0;
					}

					this.log('expeditedDays: ' + expeditedDays);

					var workingHours;
					var businessDays;
					var deliveryDate;
					if(expeditedDays) {
						businessDays = this.options.expDays[pageIndex]['stdETADays'] - expeditedDays;
						workingHours = this.options.stdDays[businessDays - 1]['stdWorkingHours'];

						sum += sum * expeditedDays / this.options.expDays[pageIndex]['stdETADays'];
					}
					else {
						businessDays = this.options.expDays[pageIndex]['stdETADays'];
						workingHours = this.options.expDays[pageIndex]['stdWorkingHours'];
					}
					deliveryDate = this.addWorkingDays(businessDays);

					this.log('deliveryDate: ' + deliveryDate);

					orderEstDelivery.set('html', '<strong>' + this.options.months[deliveryDate.getMonth()] + '-' + deliveryDate.getDate() + '</strong> / ' + workingHours + ' working hrs / ' + businessDays + ' business day' + (businessDays == 1? '': 's'));
					if($('est-delivery'))
					{
						$('est-delivery').value = deliveryDate.getFullYear() + '-' + (deliveryDate.getMonth()+1) + '-' + deliveryDate.getDate() + '|' + workingHours + '|' + businessDays;
					}
				}
				else {
					orderEstDelivery.set('html', '<strong>Custom, Optimized</strong>');
					if(amount) {
						amount.set('html', 'Custom, Discounted');
					}
					if($('est-delivery'))
					{
						$('est-delivery').value = '';
					}

					return;
				}
			}
		}

		sum += imp;

		sum = Math.floor(sum);
		this.log('sum: ' + sum);
		if(amount) {
			amount.set('html', this.options.currencySign + sum);
		}
	},

	isDST: function(date) {
		var summerDate = new Date(date.getFullYear(), 6, 1);

		return summerDate.getTimezoneOffset() == date.getTimezoneOffset();
	},

	isHoliday: function(date) {
		var dayOfWeek = date.getDay();
		var day = date.getDate();
		var month = date.getMonth();

		return dayOfWeek == 0 || dayOfWeek == 6 ||
          (day == 1 && month == 0) ||
          (day == 2 && month == 0) ||
          (day == 8 && month == 2) ||
          (day == 9 && month == 4) ||
          (day == 24 && month == 7) ||
          (day == 31 && month == 11);
	},

	addWorkingDays: function(days) {
		var i = 0;
		var daysToAdd = 0;

		var now = new Date();
		var date = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours() + (now.getUTCSeconds()? 1: 0) - (this.isDST(now)? 0: 1), 0, 0);

		var hours = date.getHours();
		var isHoliday = this.isHoliday(date);
		if(hours <= 9 || hours > 17 || isHoliday) {
			if(hours <= 9 && !isHoliday && days) {
				days--;
			}
			date.setHours(17);
		}

		var timestamp = date.getTime();
		while(i < days) {
			daysToAdd++;
			tempDate = new Date(timestamp + daysToAdd * 24 * 60 * 60 * 1000);
			if(this.isHoliday(tempDate)) {
				days++;
			}
			i++;
		}

		return new Date(timestamp + daysToAdd * 24 * 60 * 60 * 1000);
	},

	fillOrderExpedited: function(pages) {
		var orderExpedited = $('order-expedited');
		if(orderExpedited) {
			var selected = orderExpedited.value;
			orderExpedited.empty();
			new Element('option', {
				'value': 'no',
				'html': 'no',
				'selected': selected == 'no'? 'selected': ''
			}).inject(orderExpedited);
			if(this.options.expDays[pages - 1]) {
				for(var i = 1; i <= expDays[pages - 1]['expETADays']; i++) {
					new Element('option', {
						'value': i,
						'html': 'yes, by ' + i + ' business day' + (i == 1? '': 's'),
						'selected': selected == i? 'selected': ''
					}).inject(orderExpedited);
				}
			}
			new Element('option', {
				'value': 'asap',
				'html': 'yes, as soon as possible; get back to me!',
				'selected': selected == 'asap'? 'selected': ''
			}).inject(orderExpedited);

			var s0 = $('sarea0');
			if(s0) {
				s0.destroy();
			}
			var optionsDiv0 = $('optionsDiv0');
			if(optionsDiv0) {
				optionsDiv0.destroy();
			}
			var s1 = $('sarea1');
			if(s1) {
				s1.destroy();
			}
			var optionsDiv1 = $('optionsDiv1');
			if(optionsDiv1) {
				optionsDiv1.destroy();
			}
			replaceSelects();
		}
	},

	log: function(text, args) {
		if(this.options.debug && window.console) console.log(text.substitute(args || {}));
	}
});

window.addEvent('domready', function() {
	initCastomForms();
	orderPage = new OrderPage({
		stdDays: stdDays,
		expDays: expDays,
		selectActivePackage: selectActivePackage,
		webPageBasePrice: webPageBasePrice,
		webPagePrices: webPagePrices,
		//emailTemplateBasePrice: emailTemplateBasePrice,
		//emailTemplatePrices: emailTemplatePrices
		idOrderForm: 'orderForm'
	});
})

window.addEvent('load', function() {
	// Order Form
	var orderForm = $('order-form');
	var orderS3Form = $('order-s3-form');
	var orderProgress = $('order-progress');
	var orderFile = $('order-file');
	var orderFakeFile = $('order-fake-file');
	var orderS3File = $('order-s3-file');
	var orderBrowse = $('order-browse');
	var orderButton = $('order-button');
	var orderContentType  = $('order-content-type');
	if(orderForm && orderS3Form && orderProgress && orderFile && orderFakeFile && orderS3File && orderBrowse && orderButton && orderContentType) {
		if(Browser.Plugins.Flash.version >= 9 && !(Browser.Engine.webkit419 || Browser.Engine.presto925)) {
			orderFakeFile.value = '';
			var orderSwiffy = new FancyUploadSingle(orderProgress, {
				url: orderS3Form.action,
				id: 'orderSwiffy',
				fieldName: 'file',
				limitSize: maxUploadSize,
				path: '/-swf/Swiff.Uploader.swf',
				target: orderBrowse,
				onLoad: function() {
					orderFile.destroy();
					orderFile = null;
					orderFakeFile.removeClass('hidden');
					orderBrowse.removeClass('hidden');
				},
				onSelect: function(file, index, length) {
					if(file.size > maxUploadSize) {
						alert('Please upload only files smaller than ' + sizeToKB(maxUploadSize) + '.');

						return false;
					}
					else {
						orderContentType.value = MIMEtype.getType(file.name);
						orderFakeFile.value = file.name;

						return true;
					}
				},
				fileError: function(file, error, info) {
					orderProgress.addClass('hidden');
					var orderProgressReplace = $('order-progress-replace');
					if(orderProgressReplace) {
						orderProgressReplace.removeClass('hidden');
					}

					orderFakeFile.value = '';
					orderS3File.value = 'Upload "' + file.name + '" failed.';
					alert('Upload "' + file.name + '" failed.');
					orderForm.submit();
				},
				fileUpload: function(file, options) {
					var orderProgressReplace = $('order-progress-replace');
					if(orderProgressReplace) {
						orderProgressReplace.addClass('hidden');
					}
					orderProgress.removeClass('hidden');
				},
				fileComplete: function(file, response) {
					orderS3File.value = S3StorageURL + encodeURIComponent(orderKeyPrefix + file.name);
					orderForm.submit();
				}
			});

			orderBrowse.addEvent('click', function() {
				orderSwiffy.browse();

				return false;
			});
		}

		orderButton.addEvent('click', function() {
			if(!_isEmail(orderForm.elements[NAME_EMAIL_LOGIN].value.trim())) {
				try {
					orderForm.elements[NAME_EMAIL_LOGIN].focus()
				}
				catch(e) {};
				alert(MSG_EMAIL);

				return false;
			}
			if(((orderForm.elements[NAME_SOURCE] && !orderForm.elements[NAME_SOURCE].value.trim()) || (orderSwiffy && !orderSwiffy.files.length) || (orderFile && !orderFile.value)) &&
				(!orderForm.elements[NAME_SOURCELINK].value.trim() || orderForm.elements[NAME_SOURCELINK].value == 'http://')) {
				try {
					orderForm.elements[NAME_SOURCE].focus()
				}
				catch(e) {};
				alert(MSG_SOURCE);

				return false;
			}

			setTimeOffset(orderForm);
			if(orderForm.elements[NAME_HEX]) {
				orderForm.elements[NAME_HEX].value = 'lmth2dsp';
			}

			if(orderSwiffy && orderSwiffy.files.length) {
				orderSwiffy.upload({data: orderS3Form});
			}
			else {
				orderForm.submit();
			}

			return false;
		});
	}
});
