var hooks = {
	hooks:new Array(),
	registerHook:function(hookName, context){
		if (String(typeof(hooks.hooks[hookName])) == 'undefined') {
			hooks.hooks[hookName] = new Array();
		}
		d = hooks.hooks[hookName].push(context);
	},
	
	callHook:function(hookName,data){
		if (String(typeof(hooks.hooks[hookName]))== 'undefined') {
			return true;
		}
		try{
			for(var context in hooks.hooks[hookName]){
				el = hooks.hooks[hookName][context];
				if (String(typeof(el)) == 'undefined') {
					continue;
				}
				if (el.call(el,data) == false) {
					throw{err: 'Hook is stopped'};
				}
			}
		}
		catch(e){
			return false;
		}
		return true;
	},
	unregisterHook:function(hookName,context){
		hooks.hooks[hookName] = hooks.hooks[hookName].filter(
			function(el){
				if (el !== context) {
					return el;
				}
			}
		);
	}
};

// AO specific JS
var AO = {
	
	key:null,
	loaded:false,
	openFolders: {},	
	checkedFolders:{},
	amountCheckedFiles:0,
	amountCheckedFolders:0,
	browseAction:'',
	clearSelected:false,
	browseNumbers:null,
	browseObjects:null,
	multimail_last_selected:{'users':{},'lists': {}},
	
	jx:{ // used for actions regarding ajax requests
	
		setupRequest:function(e,xreq,xreqOptions){
		},

		handleCommand:function(data, textStatus){
			if (data == false || data == null || typeof(data) == 'string') {
				return false;
			};
			ln=data.length-1;
			for (var i = 0; i <=ln; i++){
				if(String(typeof(data)) == 'undefined' || String(typeof(data[i])) == 'undefined' || String(typeof(data[i].command)) == 'undefined'){
					continue;
				}
				if ( typeof(AO.jx.commands[data[i].command]) != undefined) {
					AO.jx.commands[data[i].command](data[i].data);
				}
			};
		},
		
		commands:{	// placeholder for commmands via ajax
			alert:function(searchInfo){
				AO.alert(searchInfo);
			},
			
			update_marked_files:function(){
				$('.module-tabs li:eq(2)').trigger('click');
			},
			
			folder_message_pane:function(msg){
				AO.folder_message_pane(msg);
			},
			setNumberofMarkedFiles:function(num){
				$('#menutool_markfiles span').text(num);
			},
			searchResultDone:function(searchInfo){
				if (searchInfo.numhits < 1) {
					AO.search.updateLastSearches();
					return false;
				};
				try{
					console.log(searchInfo);
				}
				catch(e){
					
				}
				AO.search.loadSearchResult(searchInfo.id);
			},
			searchCounter:function(num){
				AO.search.updateSearchCounter(num);
			},
			message:function(inputData){
				o = $('#message');
				switch(typeof(inputData)){
					case 'string':
						o.html(inputData);
					break;
					case 'object':
						if (typeof(inputData.cssclass) != undefined) {
							if (!o.hasClass(inputData.cssclass)) {
								o.addClass(inputData.cssclass);
							};
						};
						o.html(inputData.message);
					break;
				}
			},
			location:function(inputData){
				// check if inputData equals the current url
				// all locations should be ABSOLUTE and they should NOT be outside this domain
				// this means we assume a location is basicly: '/something/somethingelse/furthermore/...'
				w = window.top.location;
				if (inputData == window.location.href.split(window.location.protocol+'//'+window.location.hostname)[1] ) {
					AO.jx.commands.reload();
					return false;
				};
				// then we should use reload and not location.href
				window.top.location.href = inputData;
			},
			reload:function(){
				window.top.location.reload(true);
			},
			key:function(inputData){
				if (arguments.length== 1 && inputData.length > 0) {
					AO.key = inputData;
					AO.loaded = true;
					AO.Start();
				}
			},
			setFormNames:function(inputData){
				for (var inputName in inputData) {
					$("*[name='"+inputName+"']").val(inputData[inputName]);
				}
			},
			ahah:function(inputData){
				// checking context: then we use that
				if (String(typeof(this.context)) != 'undefined') {
					o = $(this.context);
				}
				else{
					o = $(inputData.context);
				}
				o.html(inputData.message);  
			},
			updateBrowse:function(data){
				AO.browse.update(data);
			},
			folderActionOk:function(){
				AO.folder.folderActionOk();
			},
			fileActionOk:function(){
				AO.file.fileActionOk();
			},
			setBrowseNumbers:function(nums){
				
				if($(".browse-timeline-main").attr("status") == "manimport"){
					return false;
				}
				else if (AO.browseNumbers == null || AO.browseNumbers[0] != nums[0] || AO.browseNumbers[1] != nums[1] ) {		
					$('#browse-timeline-fulldocmax').html(nums[0]);
					$('#browse-timeline-fullist').html(nums[1]);
					nuffra = $('.browse-timeline-graph .type').text() == 'document'?nums[0]:nums[1];
					$('.browse-timeline-graph .end').text(nuffra);
					$('.browse-timeline-graph .counter').html(nums[0]+' hits');
					AO.browseNumbers = nums;				
				}
			},
			setNumberOfSelectedFoldersAndFiles:function(num){
				AO.amountCheckedFolders = num[0];
				AO.amountCheckedFiles = num[1];
				AO.search.pageLoaded();
			},
			alterDom:function(data){
				if (String(typeof(data['args'])) == 'undefined') {
					data['args'] = new Array();
				}
				switch(data['args'].length){
					case 0:
						$(data['el'])[data['func']]();
					break;
					case 1:
						$(data['el'])[data['func']](data['args'][0]);
					break;
					case 2:
						$(data['el'])[data['func']](data['args'][0],data['args'][1]);
					break;
					case 3:
						$(data['el'])[data['func']](data['args'][0],data['args'][1],data['args'][2]);
					break;
					case 4:
						$(data['el'])[data['func']](data['args'][0],data['args'][1],data['args'][2],data['args'][3]);
					break;
					case 5:
						$(data['el'])[data['func']](data['args'][0],data['args'][1],data['args'][2],data['args'][3],data['args'][4]);
					break;
					case 6:
						$(data['el'])[data['func']](data['args'][0],data['args'][1],data['args'][2],data['args'][3],data['args'][4],data['args'][5]);
					break;
				}
			}
		}	
	},
	
	search:{	// handle searching 
		find:function(){

			if (AO.amountCheckedFiles < 1) {
			}
			if (arguments.length > 0) {
				searchValues = arguments[0];
				searchValues.key = AO.key;
				searchValues.module = AO.module;
			}
			else{
				filled = true;
				// check if the form has any values...
				if ($('#search_filters form input:checked').size() == 0) {
					filled = false;
					$('#search_filters form input:text,#search_filters form textarea').each(
						function(){
							if (filled == false && this.value != '') {
								filled = true;
							}
						}
					);
				}
				if (filled == false) {
					return false;
				}
				
				// lets serialize the form...
				searchValues = $('#search_filters form').serialize()+"&cid="+$("#search_button_ajax").attr("status")+"&key="+AO.key+'&module='+AO.module;
				for (var x in AO.checkedFolders) {
					searchValues+='&folder[]='+AO.checkedFolders[x];
				}
			}
			$.ajax(
				{
					url:'/API/search/index.php',
					data:searchValues,
					type:"POST",
					timeout: 1000000,
					dataType:'json'
				}
			);
			setTimeout(AO.search.updateLastSearches,1500);
			AO.browse.removeSteps();
		},
		
		updateLastSearches:function(){
			if($("#menutool_main").css("display") == "block"){			
			$.ajax(
				{
					url:'/API/searchList/',
					dataType:'html',
					success:function(msg){
						$('#search_form_last_five').replaceWith(msg);
					}
				}
			);
			}
		},
		
		updateSearchCounter:function(data){
			o = $('#menutool_search');
			if (data == 0) {
				o.find('span').remove();
				return true;
			}
			if (o.find('span').size() == 1) {
				o.find('span').html(data);
			}
			else{
				o.prepend('<span>'+data+'</span>&nbsp;');
			}
		},
		
		// TODO: Got to work more like: this is the module I'm in, then take whatever module
		loadSearchResult:function(searchId){
			// if browse exists, ajax-load it
			if (AO.isBrowseAvailable()) {
				AO.tab = window.top.location.hash.split("#").join('');
				$.ajax(
					{
						url:'/API/searchResult/?id='+searchId+'&result=1&module='+AO.module+'&search_result=true',
						dataType: 'json'
					}
				);
				//AO.menuToolLoad();
				$.get("API/browseloaddata/index.php");				
				AO.browse.removeSteps();
			}
			else{				
				$.ajax({
					url:'/API/searchResult/?id='+searchId+'&result=1&module=archive2&search_result=true',
					dataType:'json',
					timeout:120000,
					success: function(msg){
						window.location = "index.php?module=archive2#tab1";   
						$.get("API/browseloaddata/index.php");						             	
					}
					
				});
	    	    
			}
			return false;
		},
		clearForm:function(){
			searchForm = $('#search_filters form');
			searchForm.find('input:text, textarea').val('');
			searchForm.find('input:checked').attr('checked',false);
			AO.search.toggleHiddenFields(true);
			return false;
		},
		toggleHiddenFields:function(){
			removeHiddenClass = (arguments.length == 1 && arguments[0] == true)?true:false;
			hiddenFields = $('#search_filters form label.hidden,#search_filters form span.hidden');
			if (removeHiddenClass == true) {
				hiddenFields.slideDown('fast',function(){$(this).removeClass('hidden');$('#hidden-field-toggle-button').remove();});
			}
			else{
				hiddenFields.slideToggle('fast');	
			}
		},
		resetSearchCounter:function(){		
			$.ajax(
				{
					url:'/API/search/index.php',
					data:{reset:"true",key:AO.key},
					type:"POST",
					timeout: 1000000,
					dataType:'json',
					success:AO.search.updateLastSearches
				}
			);
		},
		removeSearches:function(){
			$.ajax(
				{
					url:'/API/search/index.php',
					data:{'remove':"true",key:AO.key},
					type:"POST",
					timeout: 1000000,
					dataType:'json',
					success:AO.search.updateLastSearches
				}
			);
		},
		
		pageLoaded:function(){
			if (AO.amountCheckedFiles < 1) {
				$('#search_button_ajax').addClass('disabled');
			}
			else{
				$('#search_button_ajax').removeClass('disabled');
			}
		}
	},

	menuToolLoad:function(){	// default is search
		pageToLoad = String(typeof(arguments[0]))=='undefined'?'search':arguments[0];
		$("#menutool_main").attr("status",'testing');
		$('#menutool_'+pageToLoad).trigger('click');
	},
	
	alert:function(message){
		messageType = arguments.length == 2?'class="'+arguments[1]+'"':'';
		$('#alert').remove();
		html = '<div id="alert" '+messageType+'><span id="alert_message"><p>'+message+'</p><a onclick="$(\'#alert\').slideUp(\'fast\',function(){$(\'#alert\').remove();});return false;" href="#" class="module-button-small">Close</a></span></div>';
		$(html).appendTo('body').slideDown();
		return false;
	},
	
	folder_message_pane:function(message){
		$('ul.module-tabs li:first').trigger('click');
		html = '<a onclick="$(\'#alert_message_folder_pane\').slideUp(\'fast\',function(){$(\'#alert_message_folder_pane\').remove();});return false;" href="#" class="module-button-small">Close</a><p>'+message+'</p>';
		o = $('#alert_message_folder_pane');
		if (o.size() == 1) {
			o.html(html);
		}
		else{
			$('#markedfilesActionPane').html('<div id="alert_message_folder_pane">'+html+'</div>');	
		}
		return false;
		
	},
	// buttons is the 'buttons' with message:callback to use if clicked
	confirm:function(msg,buttons){
		
	},

	notify:{	// takes care of polling the server for new information
		wait: (5*1000),	// how many seconds to wait before a new ajax request
		timeout: (15*1000),	// how long to wait before a request times out
		req:null,
		
		get:function(){
			
			$.get("API/browseloaddata/index.php");
			
			if (AO.notify.req != null) {
				AO.notify.req.abort();
				AO.notify.req = null;
			}
			AO.notify.req = $.ajax(
				{
					'url':'/API/notify/?key='+AO.key,
					timeout: AO.notify.timeout,
					cache:false,
					dataType:'json',
					complete:function(req,status,txt){
						w = AO.notify.wait;
						if (status !== 'success') {	// something went wrong... so wait abit further
							w = AO.notify.timeout;
						}
						setTimeout(AO.notify.get,w);
						AO.search.updateLastSearches();
						
					}
				}
			);
		}
	},
	// update for live deploy
	getKey:function(){
		$.ajax({
			url:'/API/key/',
			dataType:'json',
			timeout: 999999999
		});
	},
	
	isBrowseAvailable:function(){
		return $('#browse_main_archive').size()==1?true:false;
	},
	
	ok:function(){
		return this.loaded;
	},
	
	multimail:function(){
		// live listen to checkboxes
		// counjour up the ajax needed
		// done 
		$('input.multimailservice').live('click',
			function(){
				el = $(this);
				el.attr('disabled','disabled').parent().addClass('sending');
				data = {
					'action':'MSF',
					'do':this.checked?'addFile':'removeFile',
					'file':el.parent().parent().attr('title')
				};				
				data[String(el.attr('name')).substr(0,5)] = el.val();
				$.ajax(
					{
						url:'/index.php',
						type:'POST',
						'data':data,
						timeout:300000,
						context:el,
						dataType:'html',
						complete:function(xreq,status){
							if (status != 'success' || xreq.status!=200) {
								this.attr('disabled','').parent().removeClass('sending');
								if (this.attr('checked') == 'checked') {
									this.attr('checked','');
								}
								else{
									this.attr('checked','checked');
								}
							}
							else{
								this.attr('checked',xreq.responseText).attr('disabled','').parent().removeClass('sending');								
							}
							AO.multimail_check_all_input();
							AO.multimail_get_default_values(this);
						}
					}
				);
			}
		);
		/*$('#multimail-mailmessage').live('focus',
			function(){
				$('#multimail-send').addClass('disabled');
			}
		);		
		
		$('#multimail-mailmessage').live('blur',
			function(){
				el = $(this);
				$.ajax(
					{
						url:'/index.php',
						type:'POST',
						data: {'do':'setMsg','msg':el.val(),'action':'MSF'},
						dataType:'json',
						timeout: 3000000,
						complete:function(xreq,status){
							ret = jQuery.parseJSON(xreq.responseText);
							$('#multimail-send').removeClass('disabled');
						}
					}
				);
			}
		);*/
	},
	
	multimail_send:function(el){
		// gather the mail
		// then... send it!
		el = $(el);
		if (el.hasClass('disabled')) {
			return;
		}
		$.ajax(
			{
				url:'/index.php',
				data:{'do':'send','action':'MSF','msg':$('#multimail-mailmessage').val()},
				dataType: 'json',
				type:'POST',
				context:el,
				timeout: 3000000,
				complete:function(xreq,status){
					ret = jQuery.parseJSON(xreq.responseText);
					msg = $('#multimail_status_message');
					if (ret.error == false && ret.status == true) {
						$("#menutool_markfile_exporttool_sendmail").html('<p class="text">Emails sent!</p>');
						$('#multimail-mailmessage').val('');
						$('#menutool_markfiles_list').html('');
						AO.monitoring.multimail.hide();
						AO.monitoring.multimail.update();
					}
					else{
						msg.text(ret.message);
					}
				}
			}
		);
	},
	
	multimail_get_default_values:function(el){
		// get what siblings are checked....
		is = el.parent().parent().parent().find('input.multimailservice');
		AO.multimail_last_selected = {'users':{},'lists': {}};
		is.each(function(){
			i = $(this);
			if (i.attr('name') == 'users[]') {
				AO.multimail_last_selected.users[i.attr('value')]=i.attr('checked');
			}
			if (i.attr('name') == 'lists[]') {
				AO.multimail_last_selected.lists[i.attr('value')]=i.attr('checked');
			}
		});
	},
	
	multimail_check_default:function(el){
		if (String(typeof(AO.multimail_last_selected)) == 'undefined') {
			return false;
		}

		$(el).parent().parent().find('input.multimailservice').each(
			function(){
				i = $(this);
				if (i.attr('name') == 'users[]') {
					v = AO.multimail_last_selected.users[i.attr('value')];
				}
				if (i.attr('name') == 'lists[]') {
					v = AO.multimail_last_selected.lists[i.attr('value')]
				}
				if (i.attr('checked') != v) {
					i.attr('checked',v);
					i.trigger('click');
				}
			}
		);
		return false;
	},
	
	multimail_check_file:function(el){
		el = $(el);
		data = {'users[]':[],'lists[]':[],'file':null};
		inputs = el.parent().parent().parent().find('input.multimailservice').each(function(){
			i = $(this);
			if (i.attr('checked') != el.attr('checked')) {
				i.attr('checked',el.attr('checked')).trigger('click');
			}
		}
		);
	},
	
	multimail_regret:function(fileId, userlistId, userType,el){
		data = {
			'file':fileId,
			'do':'removeFile',
			'action':'MSF'
		};
		switch(userType){
			case 'user':
				data['users'] = userlistId;
			break;
			case 'list':
				data['lists'] = userlistId;
			break;
		}
		$.ajax(
			{
				url: '/index.php',
				type:'POST',
				'data':data,
				dataType:'html',
				context:el,
				success:function(msg){
					if (msg != 'checked') {	//something did go wrong here...
						el = $(this);
						if (el.parent().parent().parent().find('li').size() < 2){
							el.parent().parent().parent().parent().remove();
						}
						else{
							el.parent().parent().remove();
						}
					}
					o = $('#browsetab_list');
					o.removeClass('active').parent().attr('rel','');
					o.trigger('click');
				}
			}
		);
	},
	
	multimail_check_all_input:function(){
		$('input.multimail_allcheck').each(
			function(){
				el = $(this);
				checked = 0;
				num = 0;
				el.parent().parent().parent().find('input.multimailservice').each(
					function(){
						i = $(this);
						num++;
						if (i.attr('checked') ) {
							checked ++;
						}
					});
				if (checked == num) {
					el.attr('checked','checked');
				}
				else{
					el.attr('checked','');
				}
			});
	},
	
	overlay:{
		show:function(overlayHtml){
			AO.overlay.hide();
			$('body').append('<div id="overlay_holder"><div id="overlay_container"><div class="close"><a href="javascript://" class="module-button-small" onclick="AO.overlay.hide();">Close</a></div>'+overlayHtml+'</div></div>');
			if ($.browser.msie && $.browser.version < 7) {
				if($.browser.version < 7){
					$('#overlay_holder').css('position','absolute');
					$('body').css('overflow','hidden');
				}
			}
			$('#overlay_holder').fadeIn('fast');
		},
		
		hide:function(){
			$('#overlay_holder').remove();
			$('html,body').css('overflow','auto');
		},
		init:function(){
		}
	},
	
	init:function(){
		this.getKey();
	},
	//browse:{},
	// once we got a key, this continues
	started:false,
	Start:function(){
		if (AO.started==true) {
			return true;
		}
		AO.started=true;
		// live bind to search button
		$('#search_button_ajax').live('click',
			function(){
				AO.search.find();
			}
		);
		
		// add live binding to search box on top of page
		$('#quicksearch_field').live('keyup',function(e){
			if (e.which == 13) {
				AO.search.find({qsearch:this.value});
				return false;
			};
			return true;
		});
		
		$('#search_filters input').live('keyup',function(e){
			// check if it is the 'enter' button pressed
			if (e.which == 13) {
				// then 'click' the search button
				$('#search_button_ajax').trigger('click');
				return false;
			}
		});
		AO.notify.get();
		AO.multimail();
		AO.overlay.init();
		loadPlugin('browse',true);
		loadPlugin('folder',true);
		loadPlugin('file',true);
		loadPlugin('monitoring',true);
		loadPlugin('metacolumns',true);
		loadPlugin('newsfeed',true);
		loadPlugin('report',true);
		loadPlugin('upload',true);
	},
	ready:function(){
		//setTimeout(AO.multimail_check_all_input,5000);
		//AO.multimail_check_all_input();
	}
};

$(document).ready(AO.ready);

function loadPlugin(pluginName){	// sending second parameter, and setting it to true will yield in a no async call....
	asyncCall=true;
	if (arguments.length > 1 && arguments[1] == true) {
		asyncCall = false;
	}
	$.ajax({
		url:'/js/AOPLUGIN/'+pluginName+'.js',
		dataType:'script',
		async:asyncCall,
		cache:false
	});
}

$.ajaxSetup(
	{
		timeout:60000,
		global:true,
		beforeSend: AO.jx.setupRequest,
		success: AO.jx.handleCommand
	}
);
