/**
 * MODES:
 * 1 = define theme
 * 2 = define media
 * 3 = generate output, let user select output
 * 4 = do something with selected output (store in list or send)
 */
	var persclubSearch = Class.create({
		
		initialize : function(container){
			this.container = container;
			this.mode = 1;
			this.page = 0;
			this.maxPages = 10;
		},
		
		draw : function(){
			new Ajax.Updater(
					this.container, 
					'/index.php', 
					{
						parameters: { 
							'page':'zoeken/',
							'action' : 'persclubSearch',
							'rpc':'1',
							'xmlReq':'<command><call><method>getUI</method></call></command>'
						},
						evalScripts : true,
						onLoading : this.waiter.bind(this),
						onSuccess : this.unWaiter.bind(this),
						onComplete : this.handlePageUpdate.bind(this)
					}
			);
		},
		
		handlePageUpdate : function(req){
			// assign events:
			this.hideAll();
			$('search' + this.mode).show();

			this.basket = new basketController($('_basketEdit'));
			this.basket.fromSearch = true;
			basketController.basketID = 0;
			
			$('themeSubmit').observe('click', this.goToNext.bind(this));
			$('mediumSubmit').observe('click', this.doSearch.bind(this));
			$('basketSave').observe('click', this.createNewBasket.bindAsEventListener(this));
		},
		
		checkChildren : function(event){
			// DISABLED!
			if (event.element().checked){
				var checked = true;
			}else{
				var checked = false;
			}
			var mainThemeID = parseInt(event.element().id);
			$$('.' +  mainThemeID + '_subTheme').each(
				function(checkbox){
					checkbox.checked = checked;
				}
			)
		},
		
		goToNext:  function(){
			//check if there's any checkbox selected:
			this.selectedSubThemes = [];
			this.selectedMainThemes = [];
			$$('.mainTheme').each(
				(function(main){
					if (main.checked){
						this.selectedMainThemes.push(parseInt(main.id));
					}
					var tokens = this.getSelectedSubThemes(main);
					tokens.each(
						(function(token){
							this.selectedSubThemes.push(token);
						}).bind(this)
					)
				}).bind(this)
			)
			if ( (this.selectedSubThemes.length < 1) && (this.selectedMainThemes.length < 1)){
				$('themeError').update(textHTML.noThemeError);
				return;
			}
			this.mode = 2;
			this.hideAll();
			$('search' + this.mode).show();
		},
		
		hideAll: function(){
			if ($('search1')) $('search1').hide();
			if ($('search2')) $('search2').hide();
			if ($('search3')) $('search3').hide();
//			if ($('search4')) $('search4').hide();
			if ($('searchNoResults')) $('searchNoResults').hide();
		},
		
		selectAll : function(className){
			$$(className).each(
					function(elem){
						elem.checked = true;
					}
			)
		},

		selectAllResults : function(){
			this.page = 0;
			$('resultsCount').value = 'max';
			var func = (function(req){
				this.handleSearchResults(req);
				this.selectPage();
			}).bind(this);
			this.refresh('', func);
		},
		
		getSelectedMedia : function(){
			this.selectedMedia = []; 
			$$('.medium').each(
				(function(elem){
					if (elem.checked == true){
						this.selectedMedia.push(parseInt(elem.id));
					}
				}).bind(this)
			)
		},
		
		getSelectedSubThemes : function(mainElem){
			var ret = [];
			$$('.' +  parseInt(mainElem.id) + '_subTheme').each(
				function(checkbox){
					if (checkbox.checked == true) {
						ret.push(parseInt(checkbox.id));
					}
				}
			)
			return ret;
		},
		
		getSelectedFilters : function(){
			this.selectedFilters = [];
			$$('.filter').each(
				(function(checkbox){
					if (checkbox.checked == true) {
						this.selectedFilters.push(checkbox.id);
					}
				}).bind(this)
			)
		},
		
		_doSearch : function(callBack){
			this.getSelectedMedia();
			this.getSelectedFilters();
			if (callBack){
				var func = callBack;
			}else{
				var func = this.handleSearchResults.bind(this);
			}
			var RPCObj = new rpc;
//			RPCObj.debug = true;
			RPCObj.createCall('persclubSearch', '', this);
			RPCObj.setMethod('search');
			
			RPCObj.addArgument('mainThemes', this.selectedMainThemes.join(','));
			RPCObj.addArgument('subThemes', this.selectedSubThemes.join(','));
			RPCObj.addArgument('media', this.selectedMedia.join(','));
			RPCObj.addArgument('oplage', $('oplage').getValue());
			RPCObj.addArgument('frequentie', $('frequentie').getValue());
			RPCObj.addArgument('geographic_id', $('geographic_id').getValue());
			RPCObj.addArgument('filters', this.selectedFilters.join(','));
			RPCObj.addArgument('amount', $('resultsCount').getValue());
			RPCObj.addArgument('page', this.page);
			RPCObj.addArgument('order', $('resultsSort').getValue());
			RPCObj.addArgument('orderBy', $('resultsSortBy').getValue());
			
			RPCObj.attachWaiter(this.waiter, this);
			RPCObj.attachUnWaiter(this.unWaiter, this);
			RPCObj.setCallback(func);
			RPCObj.call();			
		},
		
		doSearch : function(){
			// gather values:
			this.hideAll();
			$('search3').show();
			this._doSearch();

		},
		
		handleSearchResults : function(req){
			if (req.responseJSON.message){
				this.hideAll();
				$('searchNoResults').show();
				return;
			}
			this.rows = req.responseJSON.data;
			var prevRow = '';
			var medium = '';
			this.rowCount = 0;
			this.resultCount = req.responseJSON.count;
			
			var resContainer = $('resultsContainer');
			var tbody = '';
			$('search3').hide();
			$('search4').show();
			if (this.rows.length < 1){
				$('resultsMenu').hide();
				resContainer.update(textHTML.noResultHTML);
				return;
			}
			$('resultsMenu').show();
			resContainer.insert(textHTML.interpret('resultCountHTML', [this.resultCount] ));
			var div = new Element('div', {id:'selectSearchResults'}).update(textHTML.selectAll);
			div.setStyle("cursor:pointer");
			resContainer.insert(div);


			var div = new Element('div', {id:'selectAllSearchResults'}).update(textHTML.selectAllResults);
			div.setStyle("cursor:pointer");
			resContainer.insert(div);	

			$('selectAllSearchResults').observe('click', this.selectAllResults.bind(this));
			$('selectSearchResults').observe('click', this.selectPage.bind(this));
			if (!Prototype.Browser.WebKit) {
//				this.drawNavigator($('navigatorParent'));
			}
			
			$A(this.rows).each(
				(function(row){
					this.rowCount++;
					row = new media(row);
					//this.media.set(row.journalist_id, media)
					if (prevRow == '' || row.media_id != prevRow.media_id){
						tbody = new Element('tbody', {id:row.media_id});
						resContainer.insert(tbody);
						tbody.insert(this.drawRowHead(row));
						tbody.data = row;
						// assign rowHeadEvents;
						$(row.media_id + '_title').observe('click', this.showMedia.bindAsEventListener(this))
					}
					tbody.insert(this.drawRow(row));
					$(row.journalist_id + row.media_id + '_journalist').observe('click', this.showJournalist.bindAsEventListener(this))
					$(row.journalist_id + row.media_id + '_journalist').jID = row.journalist_id; 
					$(row.journalist_id + row.media_id + "_check").data = row;
					$(row.journalist_id + row.media_id + "_check").observe('click', this.itemSelect.bindAsEventListener(this))
					prevRow = row;
				}).bind(this)
			)
			
			resContainer.insert(textHTML.navigatorParentNodeBottom);
			this.drawNavigator($('navigatorParentBottom'));
		},
		
		drawRowHead : function(row){
			//return textHTML.interpret('searchRowHead', [row.media_id, row.titel] );
			var html ='';
            html += '<tr id="' + row.media_id+ '">';
            html += '	<td colspan="3">';
            html += '		<hr class="resultsDividerTop" noshade="noshade" size="1"/>';
            html += '		<span class="mediaTitle" id="' + row.media_id + '_title" >' + row.titel +  '</span>';
            html += '		<div class="mediaInfo" style="display:none;" id="' + row.media_id + '_mediaContainer"></div>'; //  DO NOT remove the style-tag; it's needed by Scriptaculous
            html += '		<hr class="resultsDividerMiddle" noshade="noshade" size="1"/>';
            html += '	</td>';
            html += '</tr>';
            return html;
		},

		drawRow : function(row){
			if ($(row.journalist_id + row.media_id + "_journalist")) return; 
			var html = '';
			html += '<tr>';
			html += '	<td align="left"><input type="checkbox" name="' + row.journalist_id + row.media_id + '_check" id="' + row.journalist_id+ row.media_id + '_check" value="' + row.journalist_id + '"/></td>';
			html += '	<td align="left">' + this.rowCount + '. <span ';
			if (row.journalist_id == row.hoofdredacteur){
				html += " class='hoofd'";
			}else{
				html += " class='niet-hoofd' ";
			}
			html += '		id="'+ row.journalist_id + row.media_id + '_journalist">' + row.naam() + '</span>';
			if (parseInt(row.fotograaf) == 1){
				html += '<img src="images/cam.gif" class="camIcon"/>';
			}
			if (parseInt(row.freelance) == 1){
				html += '<img src="images/Freelancer.gif" class="camIcon"/>';
			}
			
			html += '		</td>'; //  DO NOT remove the style-tag; it's needed by Scriptaculous
			html += '	<td align="right"><a href="mailto:' + row.email + '"><img src="images/email.gif" border="0"/></a></td>';
			html += '</tr>';
			html += '<tr><td colspan="3"><div class="journalistInfo" style="display:none;" id="' + row.journalist_id + row.media_id + '_journalistContainer"></div></td></tr>'
			if (row.notes){
				
			}
			return html;
		},

		drawNavItem : function(pageNum, pages, container){
			if (pageNum != pages){
				var text = (pageNum + 1 ) + ' - ';
			}else{
				var text = (pageNum + 1 );
			}
			if (pageNum == this.page){
				var elemClass = 'navigatorItemActive';
			}else{
				var elemClass = 'navigatorItem';
			}

			var spanner = new Element('span', {className:elemClass}).update(text);
			spanner.pageNum = pageNum;
			container.insert(spanner);
			spanner.observe('click', this.gotoPage.bind(this))
		},
		
		drawNavigator : function(container){
			// quite complex navigator-builder; remember!!! -> if it ain't broken, DON'T FIX IT
			var div = new Element('div', {className:'navigator'});
			container.insert(div);
			
			var itemsPerPage = $('resultsCount').getValue();
			if (itemsPerPage == 'max'){
				$$('.navigator').each(
					function(elem){
						elem.update('');
					}
				)
				return;	
			}
			itemsPerPage = parseInt(itemsPerPage);
			if (!itemsPerPage ) itemsPerPage = 20;
			var pages = Math.ceil( parseInt(this.resultCount) / itemsPerPage  );
			
			// we can show max. 15 items, cut the counter into parts if 15 items are exceeded
			if (pages <= (this.maxPages)){
				pages.times(
						(function(pageNum){
							div.insert(this.drawNavItem(pageNum, pages, div));
						}).bind(this)
					)
			}else{
				if (this.page > this.maxPages){
					var half = Math.floor( (this.maxPages/2));
					var start = (((this.page -half)))
					var end = (start + this.maxPages);
					if (end > pages) {
						end = pages;
						start = pages - this.maxPages;
					}
					
					// build select thingy before list:
					var select = new Element('select');
					select.insert(new Element('option'));
					div.insert(select);
					select.observe('change', this.gotoPageFromSelect.bindAsEventListener(this));
					for (var i=0;i<start;i++){
						var option = new Element('option', {value:i}).update((i+1));
						select.insert(option);
					}
					div.insert('-');
					// build normal numeric links
					for (var i=start;i<(end-1);i++){
						div.insert(this.drawNavItem(i, pages, div));
					}
					
					// build closing select thingy:
					if (end < pages){
						var select = new Element('select');
						select.insert(new Element('option'));
						div.insert(select);
						select.observe('change', this.gotoPageFromSelect.bindAsEventListener(this));
						for (var i=end;i<=pages;i++){
							var option = new Element('option', {value:i}).update((i+1));
							select.insert(option);
						}
					}

				}else{
					var select = new Element('select');
					select.insert(new Element('option'));
					pages.times(
							(function(pageNum){
								if (pageNum > this.maxPages){
									var option = new Element('option', {value:pageNum}).update(pageNum + 1);
									select.insert(option);
								}else{
									div.insert(this.drawNavItem(pageNum, pages, div));
								}
							}).bind(this)
						)
					if (select.options.length > 1){
						div.insert(select);
						select.observe('change', this.gotoPageFromSelect.bindAsEventListener(this));
					}
				}
			}
			return div;
		},

		
		refresh : function(event, callBack){
			if (event && event.element().getValue()=='') return;
			if (!callBack) callBack = '';
			$('resultsContainer').update('');
			this._doSearch(callBack);
		},

		gotoPageFromSelect : function(event){
			var element = event.element();
			this.page = parseInt(element.getValue());
			this.refresh();
		},
		
		gotoPage : function(event){
			var element = event.element();
			if (element.pageNum === '') return;
			this.page = parseInt(element.pageNum);
			this.refresh();
		},
		
		
		showJournalist : function(event){
			if ( $(parseInt(event.element().id) + "_journalistContainer").visible() ){
				$(parseInt(event.element().id) + "_journalistContainer").hide();
				return;
			}else{
				var jID = parseInt(event.element().jID);
				var func = (function(req){
					this._showJournalist(req, parseInt(event.element().id));
				}).bind(this)
				var RPCObj = new rpc;
	//			RPCObj.debug = true;
				RPCObj.attachWaiter(this.waiter, this);
				RPCObj.attachUnWaiter(this.unWaiter, this);
				RPCObj.createCall('persclubSearch', func, this);
				RPCObj.call('getJournalistHTML', "jID=" + jID);
			}
		},
		
		_showJournalist: function(req, mediaID){
			var container = $(mediaID + "_journalistContainer");
			container.update(req.responseText);
			container.show();
//			new Effect.SlideDown(container, {duration:'0.3'});
		},
		
		showMedia : function(event){
			var mediaID = parseInt(event.element().id);
			var func = (function(req){
				this._showMedia(req, mediaID);
			}).bind(this)
			var RPCObj = new rpc;
//			RPCObj.debug = true;
			RPCObj.attachWaiter(this.waiter, this);
			RPCObj.attachUnWaiter(this.unWaiter, this);
			RPCObj.createCall('persclubSearch', func, this);
			RPCObj.call('getMediaHTML', "mediaID=" + mediaID);		
		},
		
		_showMedia : function(req, mediaID){
			var container = $(mediaID + "_mediaContainer");
			container.update(req.responseText);
			container.show();
//			new Effect.SlideDown(container, {duration:'0.3'});
		},
		
		itemSelect : function(event){
			var row = event.element().data;
			if (event.element().checked){
				this.basket.add(row);
			}else{
				this.basket.remove(row);
			}
			this.updateBasketCount();
		},
		
		updateBasketCount : function(){
			if (this.basket.items.keys().length > 0){
				$('basketContainer').update(textHTML.interpret('basketCount', [this.basket.items.keys().length] ));
				$('basketSave').show();
			}else{
				$('basketContainer').update(textHTML.noSelection);
				$('basketSave').hide();
			}
		},
		
		createNewBasket : function(event){
			// start basket-editor:
			$('search4').hide();
			$('basketEdit').show();
			this.basket.items.keys().each(
				(function(jID){
					if ($(jID+ '_check')) $(jID+ '_check').checked = false;
				}).bind(this)
			)
			$('basketContainer').update('Geen selectie');
			this.basket.drawBasket();
		},
		
		selectPage : function(event){
			this.container.select('input').each(
				(function(element){
					if (element.id.indexOf('_check') > -1){
						var row = element.data;
						if (row) {
							this.basket.add(row);
						}
						element.checked = true;
					}
				}).bind(this)
			)
			this.updateBasketCount();
		},
		
		waiter : function (){
			$('persWaiter').show();
		},
		
		unWaiter : function (){
			$('persWaiter').hide();
		}
		
	})
	

