/*

	Inline upload script made by shani elharrar & mor (a)butbul,
	
	Todo : 
		* Encapsulate
		* Fix bug with safari - create unique name foreach uploadField
		* Refactor (Change names)
		* Add settings : 
			* Upload callback
			* Deupload callback
			* Ratio
			* Min/Max Height/Width
		* Add CSS
 */

var inline_upload = function() {

	var isUploading = false;

	var onStateModified = function(e) {
		
		var obj = $(this);
		var value = '';
		if (isUploading) {
			value = 'disabled';
		}
		obj.attr('disabled', value);
				
	};
	
	$("input[type=button].upload").live('upload_state_modified', onStateModified);
	
	$.fn.inline_upload = function(settings) {

	  	settings = $.extend(true, 
			{ translations : { crop : 'חתוך', upload : 'העלאה', preview : 'צפה בתמונה', deupload : 'מחק תמונה'},
		  		 callbacks : { complete : null, canceled : null },
		  		      crop : {} },
		  settings);

		var imagesPrefixes = ['.jpg','.png','.gif', 'jpeg'];

		$.each(this, function() {

			var hiddenFileInput = $(this).hide();
			var fileInput = $('<input type="file" />').attr('name','uploadField');

			var jCropHandle = null;

			var uploadInput = $('<input type="button" />');
				uploadInput.addClass('upload')
						   .val(settings.translations.upload)
						   
			var deUploadInput = $('<input type="button" />');
				deUploadInput.addClass('deupload')
						   	 .val(settings.translations.deupload)
							 .attr('disabled','disabled');

            var upload_note_text = 'בחר/י קובץ להעלאה, ולאחר מכן לחץ/י על כפתור ההעלאה.';
			var note = $('<input type="text" />').attr('disabled', 'disabled')
												   .addClass('upload_note').val(upload_note_text);


			var previewButton = $('<input type="button" />').addClass('Preview').val(settings.translations.preview).attr('disabled','disabled');

			var cropOptions;
			var imageCropped = false;
			var imageContainer = $('<img />');
			var uploadFrame = $('<div />').addClass('uploadFrame');
			var isInitializing = true;
			// Insert html.
			hiddenFileInput.wrap(uploadFrame);
			fileInput.insertBefore(hiddenFileInput);

			previewButton.insertAfter(hiddenFileInput);
			uploadInput.insertAfter(hiddenFileInput);
			deUploadInput.insertAfter(hiddenFileInput);
			note.insertBefore(fileInput);
			if (hiddenFileInput.parent().parent().size > 0)
				note.effect('highlight');

			var imageContainerWrapper = $('<div />');
			var cropButton = $('<input type="button" />').val(settings.translations.crop).click( function () {

				var that = $(this);
				var data = $.extend(cropOptions, {image:hiddenFileInput.val(), 
	                                              tw:hiddenFileInput.attr('targetwidth'),
	                                              th:hiddenFileInput.attr('targetheight')});

				cropButton.attr('disabled', 'disabled');

				// Well, send the image for crop.
				$.post(baseUrl() + '/Uploader/crop?format=json', data, function(data, status, request) {

					if (jCropHandle != null) {
						jCropHandle.destroy();
					}

					var fullLocation = baseUrl() + data.image;
	                var timestamp = new Date().getTime();
					imageContainer.attr('src', fullLocation + '?' + timestamp);
					hiddenFileInput.val(data.image);

					imageCropped = true;

					cropButton.attr('disabled','disabled');

					$.fancybox.resize();
					$.fancybox.center();

				}, 'json');


			});

			imageContainerWrapper.append(cropButton)
	                             .append(imageContainer)
								 .append($('<br />'))
								 .appendTo($('<div />').hide().appendTo('body'));

			deUploadInput.click(function() {

				uploadInput.attr('disabled','');

				deUploadInput.attr('disabled','disabled');
				previewButton.attr('disabled','disabled');
				imageCropped = false;


				fileInput.attr('disabled','');
				hiddenFileInput.val('');
				note.val('בחר/י קובץ להעלאה, ולאחר מכן לחץ/י על כפתור ההעלאה.')
				if (hiddenFileInput.parent().parent().size > 0)
					note.effect('highlight');

				if (settings.callbacks.canceled != null) {
					settings.callbacks.canceled(uploadFrame);
				}

			});

			var cropMove = function(c)
			{
				cropOptions = c;
			}

			var uploadComplete = function(fileName) {

				var fullLocation = baseUrl() + fileName;
				
				hiddenFileInput.val(fileName);
				fileInput.attr('disabled','disabled').fadeIn('fast');

				note.val('הקובץ הועלה בהצלחה');

				if (settings.callbacks.complete != null) {
					settings.callbacks.complete();
				}

				if (imagesPrefixes.indexOf(fileName.toLowerCase().substr(fileName.length - 4)) != -1)
				{
					note.val('טוען את התמונה משרת התמונות לפני ביצוע עריכה...');

	                var timestamp = new Date().getTime();
					imageContainer.attr('src', fullLocation + '?' + timestamp);
					var initializing = isInitializing;
					imageContainer.load(function() {
						
						isUploading = false;
						$("input[type=button].upload").trigger('upload_state_modified');
						
						note.val('הקובץ הועלה ונטען בהצלחה, אנא לחץ/י על "צפה בתמונה" על מנת לחתוך אותו');

						imageContainer.unbind('load');
						cropButton.attr('disabled','');
						cropButton.attr('disabled','');

						previewButton.fancybox({type:'inline', 
											 	href:"#imContainer", 
											 onComplete: function() { if (!imageCropped) { jCropHandle = $.Jcrop(imageContainer,$.extend(true,{onSelect : cropMove, 
																						onChange : cropMove}, settings.crop)) } },
											 onStart : function() { $("#imContainer").attr('src', $("#imContainer").attr('src')); $("#imContainer").attr('id' ,''); imageContainerWrapper.attr('id', 'imContainer'); },
											 onClosed : function() { if (jCropHandle != null) { jCropHandle.destroy(); }} 
											 })
								   .attr('disabled','');
						if (!initializing) {
							previewButton.click();
						}
					}).error(function() {
						note.val('לא ניתן לטעון את התמונה, יתכן כי ההעלאה נכשלה');
						isUploading = false;
						$("input[type=button].upload").trigger('upload_state_modified');
					});

				} else {
					isUploading = false;
					$("input[type=button].upload").trigger('upload_state_modified');
				}

				uploadInput.attr('disabled','disabled');

				deUploadInput.attr('disabled','');
			}

			// Set upload event
			uploadInput.click(function() {

	            if (!fileInput.val())
	            {
	                alert("Please choose a file to upload");
	            }
	            else if (isUploading) {
					alert("כבר נמצא קובץ בהעלאה, אנא המתינו לסיום ההעלתו");
				}
				else
	            {
					isUploading = true;
					$("input[type=button].upload").trigger('upload_state_modified');
					
					note.val('מעלה...').effect('highlight');

	                uploadInput.attr('disabled','disabled');

	                fileInput.fadeOut('fast', function() {

	                    $.ajaxFileUpload({
	                        dataType:'json',
	                        fileElement:fileInput,
	                        url:baseUrl() + '/Uploader/?format=json',
	                        success: function (data, status)
	                        {
	                            uploadInput.attr('disabled','');

	                            var fileName = data.files[0];
	                            uploadComplete(fileName);
	                        },
	                        error: function (data, status, e)
	                        {
								alert('שגיאה בהעלאה, יתכן ומשקל התמונה גדול מדי. אנא נסו להעלות תמונה קטנה יותר.');
                                fileInput.attr('disabled','').show();
                                uploadInput.attr('disabled','');
                                note.val(upload_note_text);
                                isUploading = false;
	                        },
							progress : function(bytes, total, time) {
								var newTime = new Date().getTime();
								var diffTime = newTime - time;
								var toDone = diffTime*(1-bytes/total);
								 
								if (console) console.log(toDone);
								note.val('מעלה... ' + bytes + ' בתים מתוך ' + total + ' (' + (bytes*100/total) + '%)').effect();
							}
	                    });

	                });
	            }
			});

			if (hiddenFileInput.val() != '')
			{
				uploadComplete(hiddenFileInput.val());
			}
			
			isInitializing = false;

		});
	};

	// IndexOf fix for IE
	if(!Array.indexOf){
		    Array.prototype.indexOf = function(obj){
		        for(var i=0; i<this.length; i++){
		            if(this[i]==obj){
		                return i;
		            }
		        }
		        return -1;
		    }
		}
	
}();


