/* JavaScript functions library for file upload (called "uh" - "upload handle") using AJAX */

var uh = {
	
	handlePath: '',
	filesPath: '',
	fwdDataPrefix: 'fwd_',
	
	filesLoadingCounter: 0,
	waitIntervals: new Array(),
	
	fileSizeLimit: 2097152,
		
	timeoutAfterSeconds: 25,
	timeoutIntervals: new Array(),

	displayNames: {
		uploadButton: 'Upload file',
		removeButton: 'Remove file',
		descriptionLabel: 'Description:'
    },
	
	messages: {
		loading: 'Loading...',
		success: 'File uploaded',
		failure: 'Error!\nEncountered error occured while uploading file.\nPlease try again.',
		error: {
			badExtension: 'Error!\nUploaded file format is not correct.\nPlease try with other file.',
			sizeLimitExceeded: 'Error!\nFile is to big.\nFile size of {0} exceeded.\nPlease try with smaller file.',
			fileCorrupted: 'Error!\nFile corrupted or unreadable format.\nPlease try with other file.',
			timeout: 'Error!\nRequest timeout.\nPlease try with smaller file.'
		}
	},
	
	init: function() {
		var uhForms = document.getElementsByTagName('form');
		for( var i = 0; i<uhForms.length; i++ ) {
			if( uhForms[i].className=='uhArea' ) {
				uh.initForm( uhForms[i] );
			}
		};
	},
	
	initForm: function( uhForm ) {
		if( !uhForm.id || uhForm.id=='' ) {
			uhForm.id = this.uniqueId( 'uh' );
			var data = eval('(' + uhForm.firstChild.nodeValue + ')');
			uhForm.firstChild.nodeValue = '';
			
			data['uhFormID'] = uhForm.id;
			if( this[ data['type'] ] ) {
				this[ data['type'] ].onInit( data );
			}
			data['addedFiles'] = null;
			
			this.createAdditionalInputs( uhForm, data );
			this.createFileInput( uhForm );
			this.createUploadButton( uhForm );
			
			uhForm.style.display = 'inline';
		}
	},
	
	/* creates form input for uploading files */
	createFileInput: function( uhForm ) {
		var fileInput = document.createElement('input');
		fileInput.type = 'file';
		fileInput.name = 'upFile';
		
		uhForm.insertBefore( fileInput, uhForm.firstChild );
	},
	
	/* creates form button initiating file upload */
	createUploadButton: function( uhForm ) {
		var buttonGreyArrow = document.createElement( 'span' );
		buttonGreyArrow.className = 'button v2 arrow';
		var buttonGreyArrowRight = document.createElement( 'span' );
		
		var uploadButton = document.createElement('input');
		uploadButton.type = 'button';
		uploadButton.value = this.displayNames.uploadButton;
		
		uploadButton.onclick = function() {
			uh.uploadFile( this );
		};
		
		buttonGreyArrowRight.appendChild( uploadButton );
		buttonGreyArrow.appendChild( buttonGreyArrowRight );
		uhForm.appendChild( buttonGreyArrow );
	},
	
	/* creates additional fields using data in JSON format */
	createAdditionalInputs: function( uhForm, data ) {
		for( var property in data ) {
			var hiddenInput = document.createElement('input');
			hiddenInput.type = 'hidden';
			hiddenInput.name = property;
			hiddenInput.value = data[property];
		
			uhForm.appendChild( hiddenInput );
		}
	},
	
	/* creates new form and submits it to an iframe */
	uploadFile: function( uhButton ) {
		var uhForm =  uhButton.form;
		
		var fileInput;
		for( var i = 0; i<uhForm.length; i++ ) {
			if( uhForm.elements[i].name=='upFile' ) {
				fileInput = uhForm.elements[i];
				break;
			}
		}
		if( !fileInput || fileInput.value=='' ) {
			return false;
		}
		
		this.filesLoadingCounter++;
		
		var uniqueID = this.uniqueId('');
		
		uhButton.id = 'uhButton' + uniqueID;
		uhButton.value = this.messages.loading;
		uhButton.disabled = true;
		
		try {
			var iframe = document.createElement('iframe');
			iframe.name = 'iframe' + uniqueID;
			iframe.id = iframe.name;
			iframe.style.display = 'none';
			document.getElementsByTagName('body')[0].appendChild( iframe );
			
	        if (typeof iframe.location == "undefined") {
	            iframe = frames[frames.length - 1];
	            iframe.name = 'iframe' + uniqueID;
	            iframe.id = iframe.name;
	        }
	    } catch (exception) {
	   		// intended to be IE5-only section - the browser that cannot append an iframe
	        var iframeHTML = '<iframe name="' + 'iframe' + uniqueID + '" id="' + 'iframe' + uniqueID + '" style="display: none;"></iframe>';
	        document.getElementsByTagName('body').item (0).insertAdjacentHTML("BeforeEnd", iframeHTML);
	        var iframe = frames['iframe' + uniqueID];
	    }
	    
		var fwdData = new Array();
		fwdData['uniqueID'] = uniqueID;
		
		var inputs = uhForm.elements;
		for( var i = 0; i<inputs.length; i++ ) {
			if( inputs[i].type=='hidden' && inputs[i].name=='type' ) {
				fwdData['type'] = inputs[i].value;
			} else if( inputs[i].type=='file' ) {
				inputs[i].id = 'upFile' + uniqueID;
			}
		}
		
		uhForm.name = 'uh' + uniqueID;
		uhForm.id = uhForm.name;
		//uhForm.method = 'POST';
		//uhForm.enctype = 'multipart/form-data';
		uhForm.target = iframe.name;
		if( fwdData['type'] && fwdData['type']!='' ) {
			uhForm.action = this.handlePath + fwdData['type'];
		} else {
			return false;
		}
		
		
		for( var property in fwdData ) {
			var hiddenInput = document.createElement('input');
			hiddenInput.type = 'hidden';
			hiddenInput.name = this.fwdDataPrefix + property;
			hiddenInput.value = fwdData[property];
		
			uhForm.appendChild( hiddenInput );
		}
		
		if( this[ fwdData['type'] ] ) {
			this[ fwdData['type'] ].onStart( fwdData );
		}

		this.waitIntervals[uniqueID] = window.setInterval( function(){uh.submitForm( uniqueID );}, 100 );
	},
	
	submitForm: function( uniqueID ) {
		if( document.getElementById('iframe' + uniqueID) ) {
			var uhForm = document.getElementById('uh' + uniqueID);
			try {
				uhForm.submit();
			} catch( e ) {
				var data = new Array();
				data['status'] = 0;

				var inputs = uhForm.elements;
				for( var i = 0; i<inputs.length; i++ ) {
					if( inputs[i].type=='hidden' ) {
						data[inputs[i].name] = inputs[i].value;
					}
				}
				this.fileUploaded( data );
				return true;
			}
			
			var data = new Array(); // data for timeouted request
			data['status'] = -4; // data for timeouted request
			
			var inputs = uhForm.elements;
			for( var i = 0; i<inputs.length; i++ ) {
				if( inputs[i].name.indexOf( uh.fwdDataPrefix ) == 0 ) {
					data[inputs[i].name] = inputs[i].value; // data for timeouted request
					inputs[i].parentNode.removeChild( inputs[i] );
					i--;
				}
			}
			uhForm.removeChild( document.getElementById('upFile' + uniqueID) );
			uh.createFileInput( uhForm )
			
			window.clearInterval( uh.waitIntervals[uniqueID] );
			
			onTimeout = function() {
				uh.fileUploaded( data )
			}
			this.timeoutIntervals[uniqueID] = window.setInterval( onTimeout, this.timeoutAfterSeconds*1000 );
		}
	},

	/* function called after uh response data load */
	fileUploaded: function( data ) {
		window.clearInterval( uh.timeoutIntervals[data['fwd_uniqueID']] );
		
		if( data['status']<1 ) {
			if( this[ data['fwd_type'] ] ) {
				this[ data['fwd_type'] ].onFailure( data );
			}
			alert( uh.getErrorMessage( data['status'] ) );
		} else {
			if( this[ data['fwd_type'] ] ) {
				this[ data['fwd_type'] ].onSuccess( data );
			} else {
				var info = '';
				for( var property in data ) {
					info += property + ' = ' + data[property] + '\n';
				}
				alert( info );
			}
		}
		//var iframe = document.getElementById( 'iframe' + data['fwd_uniqueID'] );
		//iframe.parentNode.removeChild( iframe );
		
		this.filesLoadingCounter--;
		var uhButton = document.getElementById( 'uhButton' + data['fwd_uniqueID'] )
		uhButton.value = this.displayNames.uploadButton;
        uhButton.disabled = false;
	},
	
	uploadChoosenFiles: function() {
		var uhForms = document.getElementsByTagName('form');
		for( var i = 0; i<uhForms.length; i++ ) {
			if( uhForms[i].className=='uhArea' ) {
				for( var j = 0; j<uhForms[i].elements.length; j++ ) {
					if( uhForms[i].elements[j].type=='button' ) {
						this.uploadFile( uhForms[i].elements[j] );
					}
				}
			}
		};
	},
	
	
	
	uniqueId: function( prefix ) {
	    var suffix;
	    do {
	        suffix = Math.round (Math.random () * 1000000000000000000);
	    } while (typeof document.getElementById (prefix + suffix) == "undefined" && document.getElementById (prefix + suffix) == null);
	    return prefix + suffix;
	},
	
	loadingNode: function() {
		var loading = document.createElement('span');
		loading.className = 'uhLoadingMessage';
		loading.appendChild( document.createTextNode( this.messages.loading ) );
		return loading;
	},
	
	getErrorMessage: function( errorNumber ) {
		if( errorNumber==-1 ) {
			return uh.messages.error.badExtension;
		} else if( errorNumber==-2 ) {
			return uh.messages.error.sizeLimitExceeded.replace(/\{0\}/, uh.fileSizeLimit + 'B');
		} else if( errorNumber==-3 ) {
			return uh.messages.error.fileCorrupted;
		} else if( errorNumber==-4 ) {
			return uh.messages.error.timeout;
		} else {
			return uh.messages.failure;
		}
	},
	
	
	// functions located below display uploaded data info or cleanup on failure
	advertPhoto: {
	    onInit: function( data ) {
			var picturesAdded = document.getElementById('picturesAdded');
			
			for( var i = 0; i<data.addedFiles.length; i++ ) {
				var uniqueID = uh.uniqueId('');
				
				var pictureFrame = document.createElement('div');
				pictureFrame.className = 'picture';
				pictureFrame.id = 'pictureFrame' + uniqueID;
				
				var image = document.createElement( 'img' );
				image.src = data.addedFiles[i]['fullImagePath'];
				//image.width = data.addedFiles[i]['width'];
				//image.height = data.addedFiles[i]['height'];
				pictureFrame.appendChild( image );
				
				var uhAdvertImageId = document.createElement('input');
				uhAdvertImageId.type = 'hidden';
				uhAdvertImageId.name = 'uhAdvertImageId';
				uhAdvertImageId.value = data.addedFiles[i]['advertImageId'];
				pictureFrame.appendChild( uhAdvertImageId );
				
				var buttonGrey = document.createElement( 'span' );
				buttonGrey.className = 'button v2';
				var buttonGreyRight = document.createElement( 'span' );
				
				var removeButton = document.createElement( 'input' );
				removeButton.type = 'button';
				removeButton.name = 'uhRemoveButton' + uniqueID;
				removeButton.value = uh.displayNames.removeButton;
				removeButton.onclick = function() {
					uh.advertPhoto.onRemove( this );
				};
				buttonGreyRight.appendChild( removeButton );
				buttonGrey.appendChild( buttonGreyRight );
				pictureFrame.appendChild( buttonGrey );
				
				var descriptionLabel = document.createElement('label');
				descriptionLabel.appendChild( document.createTextNode( uh.displayNames.descriptionLabel ) );
				pictureFrame.appendChild( descriptionLabel );
				
				var descriptionInput = document.createElement('input');
				descriptionInput.type = 'text';
				descriptionInput.maxLength = '90';
				descriptionInput.name = 'photoDesc_' + data.addedFiles[i]['advertImageId'];
				descriptionInput.id = descriptionInput.name;
				descriptionInput.value = data.addedFiles[i]['imageDescription'];
				pictureFrame.appendChild( descriptionInput );
		
        	     picturesAdded.appendChild( pictureFrame );
			}
     	},
		onStart: function( data ) {
			var uhForm = document.getElementById('uh' + data['uniqueID']);
			if( cid ) {
				var setCID = true;
				for( var i=0; i<uhForm.elements.length; i++ ) {
					if( uhForm.elements[i].name=='cid' ) {
						uhForm.elements[i].value = cid;
						setCID = false;
						break;
					}
				}
				if( setCID ) {
					var hiddenInput = document.createElement('input');
					hiddenInput.type = 'hidden';
					hiddenInput.name = 'cid';
					hiddenInput.value = cid;
					uhForm.appendChild( hiddenInput );
				}
			}
			var picturesAdded = document.getElementById('picturesAdded');
			var pictureFrame = document.createElement('div');
			pictureFrame.className = 'picture';
			pictureFrame.id = 'pictureFrame' + data['uniqueID'];
			pictureFrame.appendChild( uh.loadingNode() );
			picturesAdded.appendChild( pictureFrame );
		},
		onSuccess: function( data ) {
			var pictureFrame = document.getElementById( 'pictureFrame' + data['fwd_uniqueID'] );
			if( !pictureFrame ) {
				return false;
			}
			pictureFrame.removeChild( pictureFrame.firstChild );
			
			var image = document.createElement( 'img' );
			image.src = uh.filesPath + data['imagePath'] + '-list.jpg';
			pictureFrame.appendChild( image );
			
			var uhAdvertImageId = document.createElement('input');
			uhAdvertImageId.type = 'hidden';
			uhAdvertImageId.name = 'uhAdvertImageId';
			uhAdvertImageId.value = data['advertImageId'];
			pictureFrame.appendChild( uhAdvertImageId );
			
			var buttonGrey = document.createElement( 'span' );
			buttonGrey.className = 'button v2';
			var buttonGreyRight = document.createElement( 'span' );
			
			var removeButton = document.createElement( 'input' );
			removeButton.type = 'button';
			removeButton.name = 'uhRemoveButton' + data['fwd_uniqueID'];
			removeButton.value = uh.displayNames.removeButton;
			removeButton.onclick = function() {
				uh.advertPhoto.onRemove( this );
			};
			buttonGreyRight.appendChild( removeButton );
			buttonGrey.appendChild( buttonGreyRight );
			pictureFrame.appendChild( buttonGrey );
			
			var descriptionLabel = document.createElement('label');
			descriptionLabel.appendChild( document.createTextNode( uh.displayNames.descriptionLabel ) );
			pictureFrame.appendChild( descriptionLabel );

			var descriptionInput = document.createElement('input');
			descriptionInput.type = 'text';
			descriptionInput.maxLength = '90';			
			descriptionInput.name = 'photoDesc_' + data['advertImageId'];
			descriptionInput.id = descriptionInput.name;
			pictureFrame.appendChild( descriptionInput );
		},
		onFailure: function( data ) {
			var pictureFrame = document.getElementById( 'pictureFrame' + data['fwd_uniqueID'] );
			pictureFrame.parentNode.removeChild( pictureFrame );
		},
		onRemove: function( button ) {
			var uniqueID = button.name.substring(14);
			var pictureFrame = document.getElementById( 'pictureFrame' + uniqueID );
			pictureFrame.parentNode.removeChild( pictureFrame );
		}
	},
	
	psellerLogo: {
		smallLogoPath: 'psellerLogos/small/',
		onInit: function( data ) {
			var uhForm = document.getElementById( data.uhFormID );
			var hiddenInput = document.createElement('input');
			hiddenInput.type = 'hidden';
			hiddenInput.name = 'powerSellerID';
			hiddenInput.value = data.addedFiles[0]['powerSellerID'];
			uhForm.appendChild( hiddenInput );
			
			var psellerLogoArea = document.getElementById('psellerLogoArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var image = document.createElement( 'img' );
				image.src = uh.filesPath + this.smallLogoPath + data.addedFiles[0]['imageFileName'];
				
				psellerLogoArea.appendChild( image );
			}
		},
		onStart: function( data ) {
			var psellerLogoArea = document.getElementById('psellerLogoArea');
			psellerLogoArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var form = document.getElementById('powerSellerDataForm');
			if( form.elements['logoFileName'] ) {
				form.elements['logoFileName'].value = data['imageFileName'];
			}
			
			var psellerLogoArea = document.getElementById('psellerLogoArea');
			if( psellerLogoArea.firstChild ) {
				psellerLogoArea.removeChild( psellerLogoArea.firstChild );
			}
			
			var image = document.createElement( 'img' );
			image.src = uh.filesPath + this.smallLogoPath + data['imageFileName'];
				
			psellerLogoArea.appendChild( image );
			psellerLogoArea.style.display = 'inline';
		},
		onFailure: function( data ) {
			var psellerLogoArea = document.getElementById('psellerLogoArea');
			psellerLogoArea.style.display = 'inline';
		}
	},
	
	spLinksDisplayAd: {
		filesPath: 'displayAd/',
		displayAdDescription: 'Preview',
		onInit: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var link = document.createElement( 'a' );
				link.href = uh.filesPath + this.filesPath + data.addedFiles[0]['imageFileName'];
				link.target = '_blank';
				
				this.displayAdDescription = data.addedFiles[0]['description'];
				link.appendChild( document.createTextNode( this.displayAdDescription ) );
				
				filesArea.appendChild( link );
			}
		},
		onStart: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			filesArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var form = document.getElementById('sllDataForm');
			if( form.elements['displayAdGeneratedFileName'] ) {
				form.elements['displayAdGeneratedFileName'].value = data['imageFileName'];
			}
			
			var filesArea = document.getElementById('displayAdArea');
			if( filesArea.firstChild ) {
				filesArea.removeChild( filesArea.firstChild );
			}
			
			var link = document.createElement('a');
			link.href = uh.filesPath + this.filesPath + data['imageFileName'];
			link.target = '_blank';
			
			link.appendChild( document.createTextNode( this.displayAdDescription ) );
			
			filesArea.appendChild( link );
			filesArea.style.display = 'inline';
		},
		onFailure: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			filesArea.style.display = 'inline';
		}
	},
	
	spLinksLogo: {
		filesPath: 'slinkLogos/',
		resizedPrefix: 'resized-',
		onInit: function( data ) {
			var filesArea = document.getElementById('spLinksLogoArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var image = document.createElement('img');
				image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data.addedFiles[0]['imageFileName'];
				
				filesArea.appendChild( image );
			}
		},
		onStart: function( data ) {
			var filesArea = document.getElementById('spLinksLogoArea');
			filesArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var filesArea = document.getElementById('spLinksLogoArea');
			if( filesArea.firstChild ) {
				filesArea.removeChild( filesArea.firstChild );
			}
			
			var image = document.createElement('img');
			image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data['imageFileName'];
			
			filesArea.appendChild( image );
			filesArea.style.display = 'inline';
			
			var fileNameInput = document.getElementById('logoGeneratedFileName');
			if( fileNameInput ) {
				fileNameInput.value = data['imageFileName'];
			}
		},
		onFailure: function( data ) {
			var filesArea = document.getElementById('spLinksLogoArea');
			filesArea.style.display = 'inline';
		}
	},
	
	htmlBlockPhoto: {
		filesPath: 'blockPhotos/',
		resizedPrefix: 'resized-',
		onInit: function( data ) {
			var filesArea = document.getElementById('htmlBlockPhotoArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var image = document.createElement('img');
				image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data.addedFiles[0]['imageFileName'];
				
				filesArea.appendChild( image );
			}
		},
		onStart: function( data ) {
			var filesArea = document.getElementById('htmlBlockPhotoArea');
			filesArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var filesArea = document.getElementById('htmlBlockPhotoArea');
			if( filesArea.firstChild ) {
				filesArea.removeChild( filesArea.firstChild );
			}
			
			var image = document.createElement('img');
			image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data['imageFileName'];
			
			filesArea.appendChild( image );
			filesArea.style.display = 'inline';
			
			var fileNameInput = document.getElementById('blockPhotoGeneratedFileName');
			if( fileNameInput ) {
				fileNameInput.value = data['imageFileName'];
			}
		},
		onFailure: function( data ) {
			var filesArea = document.getElementById('htmlBlockPhotoArea');
			filesArea.style.display = 'inline';
		}
	},
	
	SLLinBO: {
		filesPath: 'sllImages/',
		resizedPrefix: 'thumb-',
		onInit: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var link = document.createElement( 'a' );
				link.href = uh.filesPath + this.filesPath + data.addedFiles[0]['imageFileName'];
				link.target = '_blank';
				
				var image = document.createElement('img');
				image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data.addedFiles[0]['imageFileName'];
				link.appendChild( image );
				
				filesArea.appendChild( link );
			}
		},
		onStart: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			filesArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var form = document.getElementById('sllDataForm');
			if( form.elements['displayAdGeneratedFileName'] ) {
				form.elements['displayAdGeneratedFileName'].value = data['imageFileName'];
			}
			
			var filesArea = document.getElementById('displayAdArea');
			if( filesArea.firstChild ) {
				filesArea.removeChild( filesArea.firstChild );
			}
			
			var link = document.createElement('a');
			link.href = uh.filesPath + this.filesPath + data['imageFileName'];
			link.target = '_blank';
			
			var image = document.createElement('img');
			image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data['imageFileName'];
			
			link.appendChild( image );
			
			filesArea.appendChild( link );
			filesArea.style.display = 'inline';
		},
		onFailure: function( data ) {
			var filesArea = document.getElementById('displayAdArea');
			filesArea.style.display = 'inline';
		}
	},

	categoryImages: {
		filesPath: 'categoryImages/',
		resizedPrefix: 'ico-',
		onInit: function( data ) {
			var filesArea = document.getElementById('categoryImagesArea');
			if( data.addedFiles[0]['imageFileName']!='' ) {
				var link = document.createElement( 'a' );
				link.href = uh.filesPath + this.filesPath + data.addedFiles[0]['imageFileName'];
				link.target = '_blank';
				
				var image = document.createElement('img');
				image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data.addedFiles[0]['imageFileName'];
				link.appendChild( image );
				
				filesArea.appendChild( link );
			}
		},
		onStart: function( data ) {
			var filesArea = document.getElementById('categoryImagesArea');
			filesArea.style.display = 'none';
		},
		onSuccess: function( data ) {
			var form = document.getElementById('categoryForm');
			if( form.elements['iconImageGeneratedFilename'] ) {
				form.elements['iconImageGeneratedFilename'].value = data['imageFileName'];
			}
			
			var filesArea = document.getElementById('categoryImagesArea');
			if( filesArea.firstChild ) {
				filesArea.removeChild( filesArea.firstChild );
			}
			
			var image = document.createElement('img');
			image.src = uh.filesPath + this.filesPath + this.resizedPrefix + data['imageFileName'];
			
			filesArea.appendChild( image );
			filesArea.style.display = 'inline';
		},
		onFailure: function( data ) {
			var filesArea = document.getElementById('categoryImagesArea');
			filesArea.style.display = 'inline';
		}
	}

};

listenEvent( window, "load", uh.init );
