// Prototype patch for IE replacing evalScripts:
// ignoring <!-- and //--> while evaluating <script/> elements 
String.prototype.evalScripts = function() 
{
	return this.extractScripts().map(function(script) 
	{
      script = script.replace(/^[\s]*<!--/,''); // new line
      return eval(script); 
    });
};

var Application = Class.create();
Application.prototype =
{
	initialize: function()
	{
		this.workIndicator = $('workIndicator');
		
		this.popupDialog = 'popupDialog';
		this.popupDialogBody = 'popupDialogBody';
		
		// get pleaseWait page
		document.pleaseWaitPage = '';
		
		// selected tab of edit view
		this.editViewSelectedTab = 'metadataGeneral';

		// disable context menu
		window.oncontextmenu = function ()
		{
		//	return false;
		};	
		
		// register global handler
		var myGlobalHandlers = 
		{
			onCreate: this.showWorker.bind(this),
			onComplete: this.hideWorker.bind(this)
		};
		Ajax.Responders.register (myGlobalHandlers);
	},
	submitForm: function(formElement, url, successTarget, failedTarget)
	{
		var values = Form.serialize(formElement);

		if (successTarget == 'viewContent')
		{
			this.showPleaseWait();
		}

		new Ajax.Request(url, 
		{
			method: 'post',
			parameters: values,
	  		onSuccess: function(response) 
			{	
				// check form validation
				var validation = response.getResponseHeader("Form-Validation");
				if (validation == "failed" && failedTarget)
				{
					Element.update(failedTarget, response.responseText);
				}
				else
				{
					Element.update(successTarget, response.responseText);
				}
			},
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});		
	},	
	updateDiv: function(divElement, url, async)
	{
		var useAsync = (async == 'false')?false:true;
	
		if (divElement == 'viewContent' || divElement == 'viewNavigation')
		{
			this.showPleaseWait();
		}
			
		new Ajax.Request(url, 
		{ 
			method: 'post',
			evalScripts: true,
			asynchronous: useAsync,
	  		onSuccess: function(response) 
			{					
				Element.update(divElement, response.responseText);
			},
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});
	},
	showResponseError: function(response)
	{
		$(this.popupDialogBody).update(response.responseText);
		this.showPopupDialog(false);
	},
	doLogin: function(loginToken)
	{
		var form = $('LoginForm');
		
		var password = MD5($('password').value);
		form.password.value = "";		
		form.checksum.value = MD5(form.login.value+password+loginToken);
		
		this.submitForm('LoginForm', './LoginAction.do', 'popupDialogBody');
	},
	acceptUserAgreement: function(checkbox)
	{
		if(checkbox.checked == true)
		{
			$('userAgreementSubmitButton').style.visibility = 'visible';
		}
		else
		{
			$('userAgreementSubmitButton').style.visibility = 'hidden';
		}
	
	},
	addUploadedFilesToCollection: function(uploadid, async)
	{
		var useAsync = (async == 'false')?false:true;
	
		new Ajax.Request("./AddUploadedRecordsToCollection.do", 
		{ 
			method: 'post',
			evalScripts: true,
			asynchronous: useAsync,
			parameters: "uploadid="+uploadid,
	  		onSuccess: function(response) 
			{		
				this.updateDiv("viewNavigation", "./ChooseViewAction.do?view=collection", "false");
			}.bind(this),
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});

	},
	doCategorySearchOrSelection: function(categoryId, treeNodeTextElement, async, type) 
	{
		if(type == "folder") 
		{
			this.doCategorySelection(categoryId, async);
		}
		else if(type == "leaf") 
		{
			this.doCategorySearch(categoryId, treeNodeTextElement, async);
		}
	},
	doCategorySearch: function(categoryId, treeNodeTextElement, async)
	{
		$('rightContainerCategory').style.display = 'none';
		$('rightContainerAssets').style.display = 'block';
	
		if(!Prototype.Browser.IE && treeNodeTextElement)
		{
			if(treeNodeTextElement.hasClassName('tree0text')) 
			{
				treeNodeTextElement.removeClassName('tree0text');
				treeNodeTextElement.addClassName('tree0textPresel');
			}
			else if(treeNodeTextElement.hasClassName('tree1text')) 
			{
				treeNodeTextElement.removeClassName('tree1text');
				treeNodeTextElement.addClassName('tree1textPresel');
			}
			else if(treeNodeTextElement.hasClassName('treeNtext')) 
			{
				treeNodeTextElement.removeClassName('treeNtext');
				treeNodeTextElement.addClassName('treeNtextPresel');
			}
		}
		this.updateDiv("viewNavigation", "./CategorySearchRecordsAction.do?categoryid=" + categoryId, async);
		this.updateDiv("left", "./ChooseLeftAction.do", async);	
	},
	doCategorySelection: function(categoryId, async)
	{
		$('rightContainerCategory').style.display = 'block';
		$('rightContainerAssets').style.display = 'none';

		this.updateDiv("rightCategoryViewContent", "./SelectCategoryAction.do?categoryid=" + categoryId, async);	
		this.updateDiv("left", "./ChooseLeftAction.do", async);	
	},
	doQuickSearch: function(defaultText)
	{
		var errorMessage = $("quickSearchErrorMessages");
		if (errorMessage)
		{
			errorMessage.hide();
		}
		
		if ($('searchValue_1').value != defaultText)
		{
			this.submitForm('QuickSearchForm', './QuickSearchRecordsAction.do', 'viewNavigation', 'left');
		}
	},
	doExtendedSearch: function()
	{
		var errorMessage = $("extendedSearchErrorMessages");
		if (errorMessage)
		{
			errorMessage.hide();
		}
		this.submitForm('ExtendedSearchForm', './SearchRecordsAction.do', 'viewNavigation', 'left');
	},
	toggleMetadata: function()
	{
		if (this.editViewSelectedTab == 'metadataGeneral')
		{
			this.showMetadataGeneral();
		}
		else if (this.editViewSelectedTab == 'metadataCategory')
		{
			this.showMetadataCategory();
		}
		else if (this.editViewSelectedTab == 'metadataKeywords')
		{
			this.showMetadataKeywords();
		}
	},
	showMetadataGeneral: function()
	{
		this.editViewSelectedTab = 'metadataGeneral';
	
	 	$('metadataGeneral').style.display = "block";
	 	$('metadataCategory').style.display = "none";
	 	$('metadataKeywords').style.display = "none";
	 	
	 	try
	 	{
	 		$('metadataDownload').style.display = "none";
	 	}
	 	catch(ex)
	 	{
	 		// do nothing
	 	}
	 	
	},
	showMetadataCategory: function()
	{
		this.editViewSelectedTab = 'metadataCategory';

	 	$('metadataGeneral').style.display = "none";
	 	$('metadataCategory').style.display= "block";
	 	$('metadataKeywords').style.display = "none";
	 
	 	try
	 	{
	 		$('metadataDownload').style.display = "none";
	 	}
	 	catch(ex)
	 	{
	 		// do nothing
	 	}
	},
	showMetadataKeywords: function()
	{
		this.editViewSelectedTab = 'metadataKeywords';

		$('metadataGeneral').style.display = "none";
	 	$('metadataCategory').style.display = "none";
	 	$('metadataKeywords').style.display = "block";
	 	
	 	try
	 	{
	 		$('metadataDownload').style.display = "none";
	 	}
	 	catch(ex)
	 	{
	 		// do nothing
	 	}
	},
	showMetadataDownload: function()
	{
		this.editViewSelectedTab = 'download';
	
		$('metadataGeneral').style.display = "none";
	 	$('metadataCategory').style.display = "none";
	 	$('metadataKeywords').style.display = "none";
	 	
	 	try
	 	{
	 		$('metadataDownload').style.display = "none";
	 	}
	 	catch(ex)
	 	{
	 		// do nothing
	 	}
	 },
	showThumbnailInfo: function(index)
	{
		// check if info already there
		var divId = 'assetMouseOver_'+index;
		var divElement = $(divId);
		
		if (divElement.hasClassName('notRequested'))
		{
			new Ajax.Request("./GetThumbnailInfoAction.do", 
			{ 
				method: 'post',
				asynchronous: false,
				parameters: "recordIndex="+index,
		  		onSuccess: function(response) 
				{	
					divElement.removeClassName('notRequested');
					divElement.addClassName('requested')
					divElement.update(response.responseText);
				}.bind(this),
				onFailure : function(response)
				{
					// show error message
					this.showResponseError(response);
				}.bind(this)
			});
		}
	},
	showCollectionGenericForm: function(infoDiv, url)
	{
		$("viewInformation").update("&nbsp;");

		Element.hide("viewNavigationFunctions");
		Element.show(infoDiv);
		
		this.updateDiv("viewContent", url);
	},
	addEmailToCollectionForm: function()
	{
		var emailfilter = /^\w+[\+\.\w-]*@([\w-]+\.)*\w+[\w-]*\.([a-z]{2,4}|\d+)$/i

		var form = $('SendCollectionForm');
	    if (form.emailTextField.value > "")
	    {
			var emailIsOk = emailfilter.test(document.CollectionForm.emailTextField.value)
			if (emailIsOk)
			{
				newEmail = new Option(form.emailTextField.value, form.emailTextField.value, false, true);
				form.recipients.options[form.recipients.length] = newEmail;
			    	
				form.emailTextField.value = "";
	    	}
	    	else
	    	{
	    		var msg = $('sendCollectionEmailError').title;
	    		alert(msg);
	    	}
    	}

		for (var i = 0; i < form.recipients.length; i++)
    	{
    		form.recipients.options[i].selected = true;
    	}
	},
	removeEmailToCollectionForm: function()
	{
		$('SendCollectionForm').recipients.options[$('SendCollectionForm').recipients.selectedIndex] = null;
	},
	createNewCollection: function()
	{
		var newCollectionName = $("newCollectionName").value;
	
		this.updateDiv("viewNavigation", "./NewCollectionAction.do?newCollectionName="+newCollectionName);
		this.updateDiv("left", "./ChooseLeftAction.do");
	},
	ignoreFailedRecordsInCollection: function()
	{
		if ($("ignoreCollectionWarning").checked)
		{
			new Ajax.Request("./IgnoreCollectionHasFailedRecordsAction.do",
			{
				asynchronous: true,
				method: "post",
				parameters: "ignoreWarning=true",
				onFailure : function(response)
				{
					// show error message
					this.showResponseError(response);
				}.bind(this)
			}
			);
		}		
	},
	changeCollectionType: function(radioButton)
	{
		if (radioButton.value == "public" && radioButton.checked)
		{
			Element.show("collectionExpireContainer");
		}
		
		if (radioButton.value == "private" && radioButton.checked)
		{
			Element.hide("collectionExpireContainer");
			
			$("collectionUseExpireDate").checked = false;
			this.changeUseExpireDate();
		}
	},
	changeUseExpireDate: function()
	{
		if ($("collectionUseExpireDate").checked)
		{
			$("collectionExpireDateValue").disabled = "";
		}
		else
		{
			$("collectionExpireDateValue").disabled = "disabled";
		}
	},
	removeAllRecordsFromSelection: function()
	{
		this.updateDiv("viewNavigation", "./RemoveAllRecordsFromCollectionAction.do");
	},
	addAllRecordsToSelection: function()
	{
		this.updateDiv("viewNavigation", "./AddAllRecordsToCollectionAction.do");
	},
	toggleRecordSelection: function(index, view)
	{
		var imgElement = $("recordSelector_"+index);
		if (view == 'search')
		{
			if (imgElement.hasClassName('selected'))
			{
				this.removeRecordFromCollection(imgElement, index);
			}
			else if (imgElement.hasClassName('notSelected'))
			{
				this.addRecordToCollection(imgElement, index);
			}
		}
		if (view == 'collection')
		{
			if (imgElement.hasClassName('selected'))
			{
				this.updateDiv("viewNavigation", "./RemoveRecordFromCollectionAction.do?recordIndex="+index);
			}
			else if (imgElement.hasClassName('notSelected'))
			{
				this.updateDiv("viewNavigation", "./AddRecordToCollectionAction.do?recordIndex="+index);
			}
		}
	},
	toggleRecordSelectionLink: function(selectionType)
	{
		if (selectionType == 'none')
		{
			removeLink = $("removeAllRecordsFromCollectionLink");
			removeLink.addClassName('inactive');
			removeLink.href = '';

			addLink = $("addAllRecordsToCollectionLink");
			addLink.removeClassName('inactive');
			addLink.href = 'javascript:app.addAllRecordsToSelection();';
		}
		if (selectionType == 'any')
		{
			removeLink = $("removeAllRecordsFromCollectionLink");
			removeLink.removeClassName('inactive');
			removeLink.href = 'javascript:app.removeAllRecordsFromSelection();';

			addLink = $("addAllRecordsToCollectionLink");
			addLink.removeClassName('inactive');
			addLink.href = 'javascript:app.addAllRecordsToSelection();';
		}
		if (selectionType == 'all')
		{
			removeLink = $("removeAllRecordsFromCollectionLink");
			removeLink.removeClassName('inactive');
			removeLink.href = 'javascript:app.removeAllRecordsFromSelection();';

			addLink = $("addAllRecordsToCollectionLink");
			addLink.addClassName('inactive');
			addLink.href = '';
		}
	},
	addRecordToCollection: function(imgElement, index)
	{
		new Ajax.Request("./AddRecordToCollectionAction.do?recordIndex="+index, 
		{
			method: 'post',
	  		onSuccess: function(response) 
			{	
				imgElement.src = "./CumulusWebAccess/misc/img/iconSqNoteList_out.gif.view";
				imgElement.removeClassName('notSelected');
				imgElement.addClassName('selected');
				
				this.toggleRecordSelectionLink(response.responseText);
			}.bind(this),
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});		
	},
	removeRecordFromCollection: function(imgElement, index)
	{
		new Ajax.Request("./RemoveRecordFromCollectionAction.do?recordIndex="+index, 
		{
			method: 'post',
	  		onSuccess: function(response) 
			{	
				imgElement.src = "./CumulusWebAccess/misc/img/iconSqNoteList_in.gif.view";
				imgElement.removeClassName('selected');
				imgElement.addClassName('notSelected');

				this.toggleRecordSelectionLink(response.responseText);
			}.bind(this),
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});		
	},
	showRecordSelectionTip: function(imgElement, removeText, addText)
	{
		var img = $(imgElement);

		if (img.hasClassName('selected'))
		{
			return Tip(removeText);
		}
		if (img.hasClassName('notSelected'))
		{
			return Tip(addText);
		}
	},
	goToPage: function(layout, maxPageCount)
	{
		var inputField = $("goToPageValue");
		if (inputField.value > 0 && inputField.value <= maxPageCount)
		{
			this.updateDiv("viewContent", "./GoToPageAction.do?layout="+layout+"&page="+inputField.value);
		}
		else
		{
			inputField.value = "";
		}
	},
	openCollectionSlider: function(sliderName)
	{
		var slider = sliderName + "CollectionSlider";
		var sliderElement = $(slider);
		
		// check if slider is open
		if ( sliderElement.hasClassName('isClose') )
		{				
			sliderElement.removeClassName('isClose');
			sliderElement.addClassName('isOpen');

			sliderElement.style.display='block';
			
			// switch images
			$(sliderName + 'CollectionClose').style.display='block';
			$(sliderName + 'CollectionOpen').style.display='none';
			
			// send reqeust to server
			this.setPreference(slider, 'open');
		}
	
	},
	closeCollectionSlider: function(sliderName)
	{
		var slider = sliderName + "CollectionSlider";
		var sliderElement = $(slider);
		
		// check if slider is open
		if ( sliderElement.hasClassName('isOpen') )
		{				
			sliderElement.removeClassName('isOpen');
			sliderElement.addClassName('isClose');

			sliderElement.style.display='none';
			
			// switch images
			$(sliderName + 'CollectionClose').style.display='none';
			$(sliderName + 'CollectionOpen').style.display='block';
			
			// send reqeust to server
			this.setPreference(slider, 'close');
		}
	
	},
	setPreference: function(property, value)
	{
		var url = "./SetPreference.do";
		new Ajax.Request(url,
		{
			asynchronous: true,
			method: "post",
			parameters: "property="+property+"&value="+value,
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		}
		);
	},
	newPopupDialog: function(url, dynamicSize)
	{
		this.hideFormSelectElements();
	
		new Ajax.Updater({ success: this.popupDialogBody }, url,		
		{ 
			method: 'post',
			evalScripts: true,
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});

		this.showPopupDialog(dynamicSize);
	},
	showPopupDialog: function (dynamicSize)
	{		
	    document.getElementsByTagName('body')[0].style.overflow = 'hidden';
	   
	   	$(this.popupDialog).style.display = "block";
	},
	hidePopupDialog: function ()
	{
		this.showFormSelectElements();
		
       	$(this.popupDialog).style.display = "none";
		$(this.popupDialogBody).update("&nbsp;");
		
		
		document.getElementsByTagName('body')[0].style.overflow = 'scroll';
	},
	showPleaseWait: function()
	{
		$('viewContent').update(document.pleaseWaitPage);
	},
	getPleaseWaitPage: function()
	{
		new Ajax.Request("./PleaseWaitPage.do", 
		{
			method: 'post',
	  		onSuccess: function(response) 
			{	
				document.pleaseWaitPage = response.responseText;
			},
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});		
	},
	hideFormSelectElements: function ()
	{
		if (Prototype.Browser.IE)
		{
			var tagElements = $$('select');
			if (tagElements)
			{
				for (var j = 0; j < tagElements.length; j++)
				{
					Element.hide(tagElements[j])
				}
			}
		}
	},
	showFormSelectElements : function ()
	{
		if (Prototype.Browser.IE)
		{
			var tagElements = $$('select');
			if (tagElements)
			{
				for (var j = 0; j < tagElements.length; j++)
				{
					Element.show(tagElements[j])
				}
			}
		}
	},
	showWorker: function()
	{
		$(this.workIndicator).src = "./CumulusWebAccess/misc/img/indicator.grey.gif.view";
	},
	hideWorker: function()
	{
		if (Ajax.activeRequestCount == 0)
		{
			$(this.workIndicator).src = "./CumulusWebAccess/misc/img/transpar.gif.view";
		}
	},
	
	pdfExportCountInput: function(form)
	{
	    var maxCharacter = 300;
	
	    var length = document.getElementsByName('pdfExportDescription')[0].value.length;
	
	    if(length > maxCharacter)
	    {
	        document.getElementsByName('pdfExportDescription')[0].value = document.getElementsByName('pdfExportDescription')[0].value.substring(0, maxCharacter);
	        oddCharacter = 0;
	    }
	    else
	    {
	        oddCharacter = maxCharacter - length;
	    }
	
	    $('pdfExportCharacterCounter').value = oddCharacter;
	},
	saveEditRecord: function(defaultText)
	{
		this.addAllKeywords();
		this.submitForm('RecordForm', './EditRecordAction.do', 'viewContent', 'viewContent');
	},
	saveMultiEditRecords: function(defaultText)
	{
		this.addAllKeywords();
		this.submitForm('RecordForm', './MultiEditRecordsAction.do', 'viewNavigation', 'viewContent');
	},
	addKeyword: function()
	{
	    if (document.RecordForm.keywordTextField.value > "")
	    {
	    	NewKeyword = new Option(document.RecordForm.keywordTextField.value, document.RecordForm.keywordTextField.value, false, true);
	    	document.RecordForm.keywordList.options[document.RecordForm.keywordList.length] = NewKeyword;
	    	
	    	document.RecordForm.keywordTextField.value = "";
	    	document.RecordForm.keywordTextField.focus();
    	}
    },
	removeKeyword: function ()
    {
    	document.RecordForm.keywordList.options[document.RecordForm.keywordList.selectedIndex] = null;
    },
	addAllKeywords: function()
    {
    	for (var i = 0; i < document.RecordForm.keywordList.length; i++)
    	{
    		if( 0 != i)
    		{
    			document.RecordForm.keywords.value = document.RecordForm.keywords.value + ",";
    		}
    		document.RecordForm.keywords.value = document.RecordForm.keywords.value + document.RecordForm.keywordList.options[i].value;
    	}
    },
    initDefaultCategory: function(rootCategory, selectedCategory)
    {
		$('rightContainerCategory').style.display = 'block';
		$('rightContainerAssets').style.display = 'none';

    	// set root and selected category
		new Ajax.Request("./SetCategoryAction.do", 
		{
			method: 'post',
			asynchronous: false,
			parameters: "categoryid="+selectedCategory+"&rootCategoryid="+rootCategory,
			onFailure : function(response)
			{
				// show error message
				this.showResponseError(response);
			}.bind(this)
		});		

		app.updateDiv("rightCategoryViewContent", "./SelectCategoryAction.do?categoryid="+selectedCategory, "true");	

		// refresh category tree
		app.updateDiv("left", "./ChooseLeftAction.do", "true");	
    }
}

var app;
function init()
{
	app = new Application();
	
	// get pleaseWait page
	app.getPleaseWaitPage();

	// select root and default category
	app.initDefaultCategory("5:470","5:471");
	
	// @customer
	//app.initDefaultCategory("5:470","5:471");

}


