var OrderForm = 
{
	_options: {
		textUploadUrl: null,
		fileUploadUrl: null,
		itemRemoveUrl: null,
		itemUpdateUrl: null,
		swfUrl: null,
		maxFileSize: "20 MB",
		buttonImageUrl: null,
		buttonText: null,
		buttonStyle: "",
		buttonWidth: null,
		buttonHeight: null,
		buttonPlaceholderId: null,
		templateSelector: null,
		overallPlaceholderId: null,
		categories: [],
		languages: []
	},
	
	_plu: null,
	
	_items: [],
	
	_instance: null,
	
	_template: '',
	
	overallPrice: null,
	
	init: function(options)
	{
		this.setOptions(options);

		this.initTemplate();
		this.initForm();
		this.initCurrentItems();
		this.initOverallPrice();
		this.initFileUpload();
		this.initTextUpload();
		this.initPoNumberInput();
		
		OrderForm._instance = this;
	},
	
	/** COMMON FUNCTIONS */
	
	initTemplate: function()
	{
		if(this._options.languages && this._options.categories)
		{
			this._template = '<div class="order-item" style="display: none;"> ' +
				'<div class="item-info"> ' +
	                            '<img class="icon" src="/i/icons/txt.gif" alt="txt"> ' +
	                            '<span class="name">{name}</span>&nbsp;<a href="#" class="edit" onclick="return false;">Edit</a>&nbsp;<a href="#" class="remove" onclick="return false;">Remove</a>&nbsp;<span class="price">&euro; {price}</span>' +
	                            '<span class="time">Approximate delivery time: {estimate}</span><div class="clear"></div>' +
				'</div> ' +
				'<div class="item-form" style="display: none;"> ' +
									'<br />' +
						            '<strong>Choose language (required):</strong>' +
						            '<br />' +
									'<select class="item-language required"> ';
									
									for(var i = 0; i < this._options.languages.length; i++)
									{
										// "General text" category has id 56, and it should be default for all new items.
										this._template += ' <option value="' + this._options.languages[i].id + '"' + (this._options.categories[i].id == "GB" ? ' selected="selected"' : '') + '>' + this._options.languages[i].value + '</option>';
									}
									
									this._template += '</select> ' +
									'<br/><br />' +
	                                '<strong>Text category (optional):</strong>' +
	                                '<br />' +
					'<select class="item-category required"> ';
	
			for(var i = 0; i < this._options.categories.length; i++)
			{
				// "General text" category has id 56, and it should be default for all new items.
				this._template += ' <option value="' + this._options.categories[i].id + '"' + (this._options.categories[i].id == 56 ? ' selected="selected"' : '') + '>' + this._options.categories[i].value + '</option>';
			}
			
			this._template += '</select> ' +
			    
			    '<input type="text" name="po_number" class="item-ponumber fr text-wide" value="Purchase order number"/>' +
			    
					'<br/><br />' +
					'<strong>Brief to editor (optional)</strong>' +
					'<br/> ' +
					'<textarea cols="55" rows="5" class="item-brief black"></textarea>' +
					'<br/>' +
  				'<br/>' +
  				'<label><input type="checkbox" class="applytoall" value="1" />&nbsp;Apply this language, text category and brief to all texts in my order</label>' +
				'</div> ' +
			'</div>';
		}
	},
	
	initForm: function()
	{
		var _this = this;
		$('input[type=submit]').bind('click', _this.validateForm);
	},
	
	initCurrentItems: function()
	{
		var _this = this;
		$('.order-item').each(function(i, domElement) {
			domElement = jQuery(this);
			var href = domElement.find('.remove')[0].href
			var uid = href.substr(href.lastIndexOf('#') + 1);
			
			domElement.find('.remove').bind('click', {
				'uid': uid,
				'element': domElement
			}, function (e) { _this.itemRemove(e.data); });
			
			domElement.find('.name').bind('click', function(e) {
				domElement.find('.item-form').slideToggle();
				domElement.find('.item-brief').focus();
			});
			
			domElement.find('.edit').bind('click', function(e) {
				domElement.find('.item-form').slideToggle();
				domElement.find('.item-brief').focus();
			});
			
			var language = domElement.find('.item-language').val();
			domElement.find('.item-language').attr('name', 'language[' + uid + ']');
			domElement.find('.item-language').bind('change', {
				'uid': uid,
				'element': domElement
			}, function(e) { _this.updateLanguage(e.data.uid, e.data.element.find('.item-language').val()); });
			
			
			var category = domElement.find('.item-category').val();
			domElement.find('.item-category').attr('name', 'category[' + uid + ']');
			domElement.find('.item-category').bind('change', {
				'uid': uid,
				'element': domElement
			}, function(e) { _this.updateCategory(e.data.uid, e.data.element.find('.item-category').val()); });
			
			var brief = domElement.find('.item-brief').val();
			domElement.find('.item-brief').attr('name', 'brief[' + uid + ']');
			domElement.find('.item-brief').bind('change', {
				'uid': uid,
				'element': domElement
			}, function(e) { _this.updateBrief(e.data.uid, e.data.element.find('.item-brief').val()); });
			
			var brief = domElement.find('.item-ponumber').val();
			domElement.find('.item-ponumber').attr('name', 'po_number[' + uid + ']');
			domElement.find('.item-ponumber').bind('change', {
				'uid': uid,
				'element': domElement
			}, function(e) { _this.updatePoNumber(e.data.uid, e.data.element.find('.item-ponumber').val()); });
			
			domElement.find('.applytoall').bind('click', {
			  'uid': uid,
			  'element': domElement
			}, function(e) { 
			  if(e.data.element.find('.applytoall').attr('checked') == true) { 
			    _this.applyAll(e.data.uid, e.data.element); 
			  } else { 
			    _this.unapplyAll(e.data.uid, e.data.element); 
			  } 
			});
      
			_this._items.push({
				'uid': uid,
				'category': category,
				'brief': brief,
				'committed': true
			});
		});
	},
	
	initOverallPrice: function()
	{
		if($('#overall-price span.s').html()=='&euro;' || $('#overall-price span.s').html()=='€')
    {
      this.overallPrice = this.roundNumber(parseFloat($('#overall-price span.p').html()),2);
    } else {
      this.overallPrice = this.roundNumber(parseFloat($('#overall-price span.p').html())/7.44,2);
    }
	},
	
	insertItem: function(item)
	{	
		var _this = this;
		$(this._template).render({
			'uid': item.uid,
			'name': item.name,
			'format': item.format,
			'price': item.price,
			'estimate': item.estimate
		}, {
			'clone': false,
			'preserve_template': false,
			'beforeUpdate': function()
			{
				$('.order-item .item-form').slideUp();
			},
			'afterUpdate': function(domElement) {
				domElement.appendTo('#order-items-list');
				domElement.addClass('item-' + item.uid);
				
				domElement.css('display', 'block');
				domElement.addClass('order-item');
				
				//_this.showCheckoutForm();
				
				var icon = $('<img src="/i/icons/' + item.format + '.gif" alt="' + item.format + '"/>');
				domElement.find('.icon').replaceWith(icon);
				icon.addClass("icon");
				
				domElement.children('.item-form').slideDown();
				domElement.find('.remove').bind('click', {
					'uid': item.uid,
					'element': domElement
				}, function (e) { _this.itemRemove(e.data); });
				
				domElement.find('.name').bind('click', function(e) {
					domElement.find('.item-form').slideToggle();
					domElement.find('.item-brief').focus();
				});
				
				domElement.find('.edit').bind('click', function(e) {
					domElement.find('.item-form').slideToggle();
					domElement.find('.item-brief').focus();
				});
				
				domElement.find('.item-category').attr('name', 'category[' + item.uid + ']');
				domElement.find('.item-category').bind('change', {
					'uid': item.uid,
					'element': domElement
				}, function(e) { _this.updateCategory(e.data.uid, e.data.element.find('.item-category').val()); });
				
				domElement.find('.item-language').attr('name', 'language[' + item.uid + ']');
				domElement.find('.item-language').bind('change', {
					'uid': item.uid,
					'element': domElement
				}, function(e) { _this.updateCategory(e.data.uid, e.data.element.find('.item-language').val()); });
				
				domElement.find('.item-brief').attr('name', 'brief[' + item.uid + ']');
				domElement.find('.item-brief').bind('change', {
					'uid': item.uid,
					'element': domElement
				}, function(e) { _this.updateBrief(e.data.uid, e.data.element.find('.item-brief').val()); });
				
				domElement.find('.item-brief').focus();
				
				domElement.find('.item-ponumber').attr('name', 'po_number[' + item.uid + ']');
				domElement.find('.item-ponumber').bind('change', {
					'uid': item.uid,
					'element': domElement
				}, function(e) { _this.updatePoNumber(e.data.uid, e.data.element.find('.item-ponumber').val()); });
				
				domElement.find('.applytoall').bind('click', {
  			  'uid': item.uid,
  			  'element': domElement
  			}, function(e) { if(e.data.element.find('.applytoall').attr('checked') == true) { _this.applyAll(e.data.uid, e.data.element); } else { _this.unapplyAll(e.data.uid, e.data.element); } });
        
        _this._items.push({
					uid: item.uid,
					category: "",
					brief: "",
					po_number: "",
					committed: false
				});
				
				_this.triggerApplyAll();
			}
		});
	},
	
	itemRemove: function(data)
	{
		var _this = this;

		data.element.slideUp(1000, function() { data.element.remove(); });
		$.post(this._options.itemRemoveUrl,
			   {'uid': data.uid},
			   function(a, b) { return _this.itemRemoveSuccessCallback(a, b); },
			   "json");	
		return false;
	},
	
	itemRemoveSuccessCallback: function(data, textStatus)
	{
		if(this.checkResponse(data) == true)
		{
			var items = [];
			for(var i = 0; i < this._items.length; i++)
			{
				if(this._items[i].uid == data.uid) continue;
				items.push(this._items[i]);
			}
			this._items = items;
		}
	},
	
	initPoNumberInput: function()
	{
	  $('input.item-ponumber').live('focus', function(event) {
	    if($(event.target).val() == 'Purchase order number') {
	      $(event.target).val('');
	    }
	  });
	  
	  $('input.item-ponumber').live('blur', function(event) {
	    if($(event.target).val() == '') {
	      $(event.target).val('Purchase order number');
	    }
	  });
	  
	  $('#neworderform').bind('submit', function() {
	    $('#neworderform').find('input.item-ponumber').each(function(index, element) {
	      if($(element).val() == 'Purchase order number') {
	        $(element).val('');
	      }
	    });
	  });
	},
	
	updateLanguage: function(uid, language)
	{
		for(var i = 0; i < this._items.length; i++)
		{
			if(this._items[i].uid == uid)
			{
				this._items[i].language = language;
			}
		}
	},
	
	updateCategory: function(uid, category)
	{
		for(var i = 0; i < this._items.length; i++)
		{
			if(this._items[i].uid == uid)
			{
				this._items[i].category = category;
			}
		}
	},
	
	updateBrief: function(uid, brief)
	{
		for(var i = 0; i < this._items.length; i++)
		{
			if(this._items[i].uid == uid)
			{
				this._items[i].brief = brief;
			}
		}
	},
	
	applyAll: function(uid, parent)
	{
	  $('#applytoall').val(uid);
	  
	  this.triggerApplyAll();
	},
	
	unapplyAll: function(uid, element)
	{
	  $('#applytoall').val('');
	  
	  $('.item-language').attr('readonly', false);
	  $('.item-category').attr('readonly', false);
	  $('.item-brief').attr('readonly', false);
	  $('.item-ponumber').attr('readonly', false);
	},
	
	triggerApplyAll: function()
	{
	  var uid = $('#applytoall').val();
	  if(uid == "") {
	    return;
	  }
	  
	  var master = $('.item-' + uid);
	  var language = master.find('.item-language').val(),
	      category = master.find('.item-category').val(),
	      brief = master.find('.item-brief').val(),
	      ponumber = master.find('.item-ponumber').val();
	  var _this = this;
	      
	  $(this._items).each(function(index, item) {
	    if(item.uid == uid) {
	      return;
	    }
	    
	    _this._items[index].language = language;
	    _this._items[index].category = category;
	    _this._items[index].brief = brief;
	    _this._items[index].po_number = ponumber;
	    
	    $('.item-' + item.uid).find('.item-language').val(language);
  	  $('.item-' + item.uid).find('.item-category').val(category);
  	  $('.item-' + item.uid).find('.item-brief').val(brief);
  	  $('.item-' + item.uid).find('.item-ponumber').val(ponumber);
	  });
	},
	
	updatePoNumber: function(uid, number)
	{
		for(var i = 0; i < this._items.length; i++)
		{
			if(this._items[i].uid == uid)
			{
				this._items[i].po_number = number;
			}
		}
	},
	
	checkResponse: function(response)
	{
		if(response.success == false)
		{
			console.log("Got error #" + response.error + ": " + response.message);
			return false;
		}
		
		if((response.overallPrice != 'undefined') || (response.overallTime != 'undefined'))
		{
			this.updateOverallInfo(response);
		}
		
		if(response.updateItems)
		{
			$.each(response.updateItems, function(index, element) {
				var selector = '.item-' + element.uid;
				if(element.price)
				{
					$(selector).find('span.price').html("&euro; " + element.price);
				}
			});
		}
		
		if(response.showSubmitForm == true)
		{
			this.showCheckoutForm();
		}
		else
		{
			this.hideCheckoutForm();
		}
		
		return true;
	},
	
	validateForm: function()
	{
		$('#neworderform').submit();
	},
	
	showCheckoutForm: function()
	{
		$('#checkout').slideDown();
	},
	
	hideCheckoutForm: function()
	{
		$('#checkout').slideUp();
	},
	
	updateOverallInfo: function(data)
	{
		var newPrice = data.overallPrice;
		
		if(data.overallPrice)
		{
			var price = '<span class="s">€</span> <span class="p">' + newPrice + '</span>';
			$(this._options.overallPlaceholderId).find('h2#overall-price').html(price);
			this.overallPrice = data.overallPrice;
		}
		if(data.overallTime)
		{
			var time = data.overallTime + " minute" + (data.overallTime == 1 ? "" : "s");
			$(this._options.overallPlaceholderId).find('h2#overall-time').text(time);
		}
	},
	
	/** FILE-UPLOAD FUNCTIONS */
	
	initFileUpload: function()
	{
		var _this = this;
		//try
		//{
		  this._plu = new plupload.Uploader({
		    runtimes: "gears,html5,flash,silverlight",
		    browse_button: 'upload-file-button',
		    container: 'upload-control-buttons',
		    max_file_size: this._options.maxFileSize,
		    url: this._options.fileUploadUrl,
		    flash_swf_url: '/plupload/plupload.flash.swf',
		    silverlight_xap_url: '/plupload/plupload.silverlight.xap',
		    filters: [
		      {title: "Documents", extensions: "doc,docx,odt,pdf,txt,rtf,html,txt"}
		    ]
		  });
		  
		  this._plu.init();
		  
		  $('div.plupload input').css('height', '100%');
		  
		  $('div.plupload').mouseover(function(){
		    $('#upload-file-button').css({ 
		      'background-image': "url('../i/button_select_file.png')",
		      'background-position': "0px -45px"
		    });
		  });
		  
		  $('div.plupload').mouseout(function(){
		    $('#upload-file-button').css({ 
		      'background-image': "url('../i/button_select_file.png')",
		      'background-position': "0px 0px"
		    });
		  });
		  
		  this._plu.bind('FilesAdded', function(up, files) {
		    plupload.each(files, function(file) {
		      var loader = $('<div class="loader">Analysing document...</div>');
		      loader.addClass('loader-file-' + file.id);
      		loader.appendTo('#order-items-list');
		    });
    		up.start();
		  });
		  
		  this._plu.bind('FileUploaded', function(up, file, info) {
		    var loaderSelector = '.loader.loader-file-' + file.id;
		    if($(loaderSelector)) {
    			$(loaderSelector).slideUp(500, function() {
    				$(loaderSelector).remove();
    			});
    		}
    		
    		var data = eval("(" + info.response + ")");
    		if(_this.checkResponse(data) == true)
    		{
    			OrderForm.insertItem(data);
    		}
		  });
		  
		  this._plu.bind('Error', function(up, args) {
		    var errorBox = $('<a href="#errormessage" title="Error Message">&nbsp;</a>').fancybox({
    			hideOnContentClick: true,
    			frameWidth: 300,
    			frameHeight: 20,
    			callbackOnStart: function()
    			{
    				var errorMessage = $('<div id="errormessage" style="display: none;"><div style="width:100%;height:100%;padding-top:3px;padding-left:4px;text-align:center;">' + args + '</div></div>');
    				errorMessage.appendTo('body');
    			},
    			callbackOnClose: function()
    			{
    				$('div#errormessage').remove();
    			}
    		}).click();
		  });
		//} 
		//catch(e)
		//{ }
	},
	
	initFileUploadFailedCallback: function()
	{
		$('#' + this._options.buttonPlaceholderId).html('Update your <a href="http://get.adobe.com/flashplayer/">flash player</a>.');
	},
	
	fileUploadStartCallback: function(file)
	{
		/** this must be checked before checkouting
		if(this._items[this._items.length - 1].category == "")
		{
			alert('you must select category');
			return false;
		}
		*/
		
		var loader = $('<div id="loader">Analysing document...</div>');
		loader.appendTo('#order-items-list');
		
		return true;
	},
	
	fileUploadSuccessCallback: function(file, serverData, receivedResponse)
	{
		if($('#loader'))
		{
			$('#loader').slideUp(500, function() {
				$('#loader').remove();
			});
		}
		
		/** @TODO: increase security, look for examples here: http://www.prototypejs.org/api/string/evalJSON */
		var data = eval('(' + serverData + ')');
		if(this.checkResponse(data) == true)
		{
			OrderForm.insertItem(data);
		}
	},
	
	fileUploadErrorCallback: function(file, errorCode, message)
	{
		var errorBox = $('<a href="#errormessage" title="Error Message">&nbsp;</a>').fancybox({
			hideOnContentClick: true,
			frameWidth: 300,
			frameHeight: 20,
			callbackOnStart: function()
			{
				var errorMessage = $('<div id="errormessage" style="display: none;"><div style="width:100%;height:100%;padding-top:3px;padding-left:4px;text-align:center;">' + message + '</div></div>');
				errorMessage.appendTo('body');
			},
			callbackOnClose: function()
			{
				$('div#errormessage').remove();
			}
		}).click();
	},
	
	fileUploadCompleteCallback: function(file)
	{
	},
	
	fileDialogCompleteCallback: function(fileCount, queuedCount, totalQueuedCount)
	{
		this.startUpload();
	},
	
	fileQueueErrorCallback: function(file, errorCode, message)
	{ 
		alert("(fileQueueError) " + errorCode + "#: " + message);
	},
	
	/** TEXT-UPLOAD FUNCTIONS */
	
	initTextUpload: function()
	{
		var _this = this;
		$('#upload-text-button').bind('click', function() { _this.textUploadStart(); return false; });
		$('#paste-text-button').bind('click', function() { _this.toggleTextDialog(); return false; });
		$('#cancel-text-button').bind('click', function() { _this.cancelTextDialog(); return false; });
		
		$('#text').bind('keyup', function() { _this.recountWords(); return false; });
	},
	
	recountWords: function()
	{
		var text = $('#text').val();
		text = text.replace("\n", " ");
		text = text.replace(/[\s]+/g, " ");
		text = text.replace(/^\s*/, "").replace(/\s*$/, ""); // trim spaces from start & end
		
		var words = text.split(" ");
		$('#nrofwords').text(words.length + " words pasted");
	},
	
	toggleTextDialog: function()
	{
		$('#upload-text-form').slideToggle();
	},
	
	cancelTextDialog: function()
	{
		this.toggleTextDialog();
		$('#text').val('Place text here...');
	},
	
	textUploadStart: function()
	{
		var _this = this;
		var text = $('#text').val();
		
		$.post(this._options.textUploadUrl,
			   {'text': text},
			   function(a, b) { return _this.textUploadSuccessCallback(a, b); },
			   "json");	
		$('#text').val('Place text here...');
		
		this.toggleTextDialog();
	},
	
	textUploadSuccessCallback: function(data, textStatus)
	{
		if(this.checkResponse(data) == true)
		{
			this.insertItem(data);
		}
	},
	
  /** FORM SUBMITTING */
    
	submit: function() 
	{
    	$('#neworderform').submit();
	},
	
	/** MISCELLANEOUS FUNCTIONS */
	
	getWID: function()
	{
		var c = document.cookie;
		var a = c.substr(c.indexOf("WID=")+4);
		if(a.indexOf(";") > 0)
		{
			a = a.substr(0, a.indexOf(";"));
		}
		return a;
	},
	
	setOptions: function(options)
	{
		if(options.textUploadUrl != 'undefined')
		{
			this._options.textUploadUrl = options.textUploadUrl;
		}
		
		if(options.fileUploadUrl != 'undefined')
		{
			this._options.fileUploadUrl = options.fileUploadUrl;
		}
		
		if(options.itemRemoveUrl != 'undefined')
		{
			this._options.itemRemoveUrl = options.itemRemoveUrl;
		}
		
		if(options.itemUpdateUrl != 'undefined')
		{
			this._options.itemUpdateUrl = options.itemUpdateUrl;
		}
		
		if(options.swfUrl != 'undefined')
		{
			this._options.swfUrl = options.swfUrl;
		}
		
		if(options.maxFileSize != 'undefined')
		{
			this._options.maxFileSize = options.maxFileSize;
		}
		
		if(options.buttonImageUrl != 'undefined')
		{
			this._options.buttonImageUrl = options.buttonImageUrl;
		}
		
		if(options.buttonText != 'undefined')
		{
			this._options.buttonText = options.buttonText;
		}
		
		if(options.buttonStyle != 'undefined')
		{
			this._options.buttonStyle = options.buttonStyle;
		}
		
		if(options.buttonWidth != 'undefined')
		{
			this._options.buttonWidth = options.buttonWidth;
		}
		
		if(options.buttonHeight != 'undefined')
		{
			this._options.buttonHeight = options.buttonHeight;
		}
		
		if(options.buttonPlaceholderId != 'undefined')
		{
			this._options.buttonPlaceholderId = options.buttonPlaceholderId;
		}
		
		if(options.templateSelector != 'undefined')
		{
			this._options.templateSelector = options.templateSelector;
		}
		
		if(options.overallPlaceholderId != 'undefined')
		{
			this._options.overallPlaceholderId = options.overallPlaceholderId;
		}
		
		if(options.categories != 'undefined')
		{
			this._options.categories = options.categories;
		}
		
		if(options.languages != 'undefined')
		{
			this._options.languages = options.languages;
		}
	},

        convertTotal: function()
        {
            if($('#overall-price span.s').html()=='&euro;' || $('#overall-price span.s').html()=='€')
            {
                $('#overall-price span.p').html(this.roundNumber(parseFloat($('#overall-price span.p').html())*7.44,2));
                $('#overall-price span.s').html('DKK');
                $('#convert-total').text('Show €');
            } else {
                $('#overall-price span.p').html(this.roundNumber(parseFloat($('#overall-price span.p').html())/7.44,2));
                $('#overall-price span.s').html('&euro;');
                $('#convert-total').text('Show DKK');
            }

        },

        roundNumber: function(num, dec) {
                var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
                return result;
        }
}

