// ajaxproxy requires jQuery (no conlict)
jQuery.noConflict();

try {
	var oProxy = new CFAjaxProxy();
	oProxy.setErrorHandler(handleError);
	oProxy.setCallbackHandler(handleResult);
	oProxy.setHTTPMethod("POST");
} catch(er) {
	// suppress error
}

/**
 * @author Elko van den Busken
 * @since 05-11-2009
 * handleError : Event handler voor AjaxProxy errors
 * @param string p_sCode Status code
 * @param string p_sMsg Message
 * @return void
 */
function handleError(p_sCode, p_sMsg) {
	// toon foutmelding op het scherm
	alert('Status code: ' + p_sCode + '\n' + 'Message: ' + p_sMsg);
}

/**
 * @author Elko van den Busken
 * @since 01-09-2008
 * handleResult : Callback handler of ColdFusion AjaxProxy
 * @param string p_sResult Status code
 * @return void
 */
function handleResult(p_sResult) {
	// vertaal json string naar echt js object
	//var sResult = p_sResult.replace(/<script[^>]*?>[\s\S]*<\/script>/gi, '');
	var oResponse = ColdFusion.JSON.decode(p_sResult);
	try {			
		if (oResponse.SHANDLER) {
			// handler defined, use it
			var handler = new Function(oResponse.SHANDLER);
			handler();			
		} else {
			switch(oResponse.SACTION) {
				case 'updateList':
					updateList(oResponse);
					break;
				case 'activateListItem':
					activateListItem(oResponse);
					break;			
				case 'deleteListItem':
					deleteListItem(oResponse);
					break;			
				case 'hideListItem':
					hideListItem(oResponse);
					break;			
				case 'editListItem':
					editListItem(oResponse);
					break;				
				case 'saveListItem':
					saveListItem(oResponse);
					break;			
				case 'updateSortable':
					updateSortable(oResponse);
					break;
				case 'loadSortableDetailData':
					loadSortableDetailData(oResponse);
					break;
				case 'saveSortableDetailData':
					saveSortableDetailData(oResponse);
					break;
				case 'chkPcHnr':
					setValues(oResponse);
					break;	
				case 'getPostCodePlaats':
					setValues(oResponse);
					break;			
				case 'getDownload':
					getDownload(oResponse);
					break;
				case 'checkCode':
					if (g_oSearch) {
						g_oSearch.checkCode(oResponse);
					} else {
						handleResponse(oResponse);
					}
					break;
				case 'checkLabel':
					if (g_oSearch) {
						g_oSearch.checkLabel(oResponse);
					} else {
						handleResponse(oResponse);
					}
					break;
				default:
					// use specific handler
					if (typeof g_oView !== 'undefined' && typeof g_oView.handleResponse !== 'undefined') {
						g_oView.handleResponse(oResponse);
					} else if (typeof g_oView !== 'undefined' && typeof g_oView[oResponse.SACTION] !== 'undefined') {
						g_oView[oResponse.SACTION](oResponse);
					} else {
						handleResponse(oResponse);
					}
			}
		}
	} catch(er) {
		alert('Fout bij afhandelen: \'' + oResponse.SACTION + '\'\n' + er);
	}
}

function handleResponse(p_oResponse) {
	/*
	 * LAAT OMGEVING SPECIFIEKE JAVASCRIPT FILE HET RESULTAAT AFHANDELEN
	 * - definieer een functie 'handleResponse(p_oResponse)' in eigen programma
	 */ 
	throw 'Geen afhandeling voor action \''+p_oResponse.SACTION+'\'.';
}

jQuery(document)
	.ready(function(){
		// console.log('jQuery running!');
		initMsg();
		initList();
		initFilter();
		initSortable();
	}
);

var g_sSortable = new String();
var g_sDefaultDetail = new String('(-)');
function initSortable() {
	try {
		jQuery('.sortable ol')
			.sortable({
				connectWith: '.sortable ol'
				, start: function(p_oEvent, p_oUI) {
					oItem = p_oUI.item;
					g_sSortable = oItem.parent().attr('id');
				}
				, stop: function(p_oEvent, p_oUI) {
					oItem = p_oUI.item;
					var sSortable = oItem.parent().attr('id');
					if (sSortable!=g_sSortable) {					
						var oContainer = new Object();
						oContainer.nSortableId = document.getElementById('sortable-id').value;
						oContainer.sSortableType = document.getElementById('sortable-type').value;
						oContainer.sItemId = oItem.attr('id');
						oContainer.sAction = oItem.parent().attr('id');
						oProxy.getJSON('updateSortable', oContainer);
					}
				}
			})
			//.disableSelection()
		;
	} catch(er) {
		// @notice: required /scr/jquery-ui-1.7.2.custom.min.js
	}
	jQuery('.sortable li')
		.click(function(p_oEvent){
			$this = jQuery(this);
			if ($this.hasClass('on')) {
				$this.removeClass('on');
			} else {
				$this.addClass('on');
			}
		})
	;
	jQuery('#sortable-all2right')
		.click(function(p_oEvent){
			moveSortableItem(true, true);
		})
	;
	jQuery('#sortable-select2right')
		.click(function(p_oEvent){
			moveSortableItem(true, false);
		})
	;
	jQuery('#sortable-all2left')
		.click(function(p_oEvent){
			moveSortableItem(false, true);
		})
	;
	jQuery('#sortable-select2left')
		.click(function(p_oEvent){
			moveSortableItem(false, false);
		})
	;
	initEditableSortable();
	initSortableDetailFrm();
}
function initSortableDetailFrm() {
	jQuery('#sortable-dtl').hide();
}
function initEditableSortable() {
	if (jQuery('#sortable-dtl').length) {// er is een detail formulier	
		// verwijder alle options
		jQuery('.sortable div.opt').remove();
		
		// maak een jQuery Options Object
		$oOptions = jQuery('<div class="opt"></div>');
		jQuery('<a href="#"><img src="/gfx/ab/16x16/plain/edit.png" alt="" /></a>')
			.click(function(p_oEvent){
				p_oEvent.preventDefault();
				var oContainer = new Object();
				oContainer.nId = jQuery(this).parent().parent().attr('id').replace(/\D/gi, '');
				oContainer.nSortableId = jQuery('#sortable-id').val();
				oContainer.sSortableType = jQuery('#sortable-type').val();
				oProxy.getJSON('loadSortableDetailData', oContainer);
				showOverlay();
			})
			.appendTo($oOptions)
		;
		
		// Voeg toe aan alle 'destination' items 
		jQuery('#item-dst li').each(function(p_nIndex){
			jQuery(this).prepend($oOptions.clone(true));
			if (jQuery(this).children('span.dtl').length==0) {
				jQuery(this).append(' <span class="dtl">'+g_sDefaultDetail+'</span>');
			}
		});
		// verwijder van alle 'source' items
		jQuery('#item-src li span.dtl').remove();
	}
}
function moveSortableItem(p_bFromSource, p_bAll) {
	var sSource = p_bFromSource ? 'item-src' : 'item-dst';
	var sDestination = p_bFromSource ? 'item-dst' : 'item-src';
	var sSelection = p_bAll ? '' : '.on';
	var aItemId = new Array();
	jQuery('#'+sSource+' li'+sSelection).each(function(p_nIndex) {
		aItemId.push(this.id);

		// jQuery(this).appendTo('#'+sDestination).removeClass('on');
		// eerst clonen: IE fix 'verplaatste item niet zichtbaar'
		$oClone = jQuery(this).clone(true).removeClass('on');
		jQuery(this).remove();
		$oClone.appendTo('#'+sDestination);
	})
	if (aItemId.length) {
		var oContainer = new Object();
		oContainer.nSortableId = document.getElementById('sortable-id').value;
		oContainer.sSortableType = document.getElementById('sortable-type').value;
		oContainer.sItemId = aItemId.join(',');
		oContainer.sAction = sDestination;
		oProxy.getJSON('updateSortable', oContainer);
	}
}
function updateSortable(p_oResponse) {
	showCommonMsg(p_oResponse.SMSG);
	initEditableSortable();
}
function loadSortableDetailData(p_oResponse) {
	var $oDetailFormClone = jQuery('#sortable-dtl').clone();
	$oDetailFormClone.attr('id','sortable-dtl-clone').show();
	showOverlayContent($oDetailFormClone);
	jQuery('#sortable-dtl-clone form').attr('id', 'frm-sortable-dtl-clone');
	setFormData('frm-sortable-dtl-clone', p_oResponse.STDATA);
	jQuery('#sortable-dtl-clone form input[name=do_submit]')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			oProxy.setForm('frm-sortable-dtl-clone');
			oProxy.saveSortableDetailData();
		})
	;
	jQuery('#sortable-dtl-clone form input[name=do_cancel]')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			deleteOverlay();
		})
	;
}
function saveSortableDetailData(p_oResponse) {
	if (p_oResponse.NSTATUS==1) {
		updateSortableDetailView(p_oResponse);
		deleteOverlay();
		showCommonMsg(p_oResponse.SMSG);
	}
}
function updateSortableDetailView(p_oResponse) {
	jQuery('#i-'+p_oResponse.NITEMID+' span.dtl').html('('+p_oResponse.SDETAIL+')');
}
function setFormData(p_sFormId, p_oData) {
	var oForm = document.getElementById(p_sFormId); 
	for(sField in p_oData) {
		oForm[sField.toLowerCase()].value = p_oData[sField];
	}
}
function initList() {
	initLinks();
}
function initFilter() {
	jQuery('#frm-filter_do_filter')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			applyListFilter();
		})
	;

	jQuery('#frm-filter_do_clear')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			this.form.reset();
			applyListFilter();
		})
	;
}
var g_sCFWindowName = new String('cf-window');
function initLinks() {
	var sClass = 'link-jquery-replaced';	
	jQuery('.list-nav li.first a, .lst-nav li.first a').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			jQuery('#frm-filter_x_lp').val(1);
			applyListFilter();
		})
	;	
	jQuery('.list-nav li.prev a, .lst-nav li.prev a').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			var nListPage = jQuery('#frm-filter_x_lp').val()*1-1;
			jQuery('#frm-filter_x_lp').val(nListPage);
			applyListFilter();
		})
	;	
	jQuery('.list-nav li.next a, .lst-nav li.next a').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			var nListPage = jQuery('#frm-filter_x_lp').val()*1+1;
			jQuery('#frm-filter_x_lp').val(nListPage);
			applyListFilter();
		})
	;
	jQuery('.list-nav li.last a, .lst-nav li.last a').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			var nListPage = jQuery('#frm-filter_x_lpc').val()*1;
			jQuery('#frm-filter_x_lp').val(nListPage);
			applyListFilter();
		})
	;
	jQuery('.list a.activate, .list a.deactivate, .lst a.activate, .lst a.deactivate').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			
			var oContainer = new Object();
			oContainer.nId = jQuery(this).parent().parent().attr('rel');
			oContainer.sModel = jQuery('#frm-filter_x_model').val();
			oProxy.getJSON('activateListItem', oContainer);
		})
	;
	jQuery('.list a.delete, .lst a.delete').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			if (confirm('Hiermee verwijdert u dit item!\nWilt u doorgaan?')) {
				var oContainer = new Object();
				oContainer.nId = jQuery(this).parent().parent().attr('rel');
				oContainer.sModel = jQuery('#frm-filter_x_model').val();
				oProxy.getJSON('deleteListItem', oContainer);
			}
		})
	;
	jQuery('.list a.hide, .lst a.hide').not('.'+sClass).addClass(sClass)
	.click(function(p_oEvent){
			p_oEvent.preventDefault();
			if (confirm('Hiermee verbergt u dit item!\nWilt u doorgaan?')) {
				var oContainer = new Object();
				oContainer.nId = jQuery(this).parent().parent().attr('rel');
				oContainer.sModel = jQuery('#frm-filter_x_model').val();
				oProxy.getJSON('hideListItem', oContainer);
			}
		})
	;
	/*
	jQuery('.list a.edit, .lst a.edit').not('.'+sClass).addClass(sClass)
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			showOverlay();

			var oInput = {};
			oInput.nId = jQuery(this).parent().parent().attr('rel');
			oInput.sModel = jQuery('#frm-filter_x_model').val();
			//oProxy.getJSON('editListItem', oInput);
			var oArguments = {sMethodName: 'editListItem', stInput: oInput};
			var oData = {argumentCollection: ColdFusion.JSON.encode(oArguments), returnFormat: 'json'};
			jQuery.post(oProxy.cfcPath+'?method=getJSON', oData, function(p_sResponse){
				oResponse = ColdFusion.JSON.decode(p_sResponse.replace(/<script[^>]*?>[\s\S]*<\/script>/gi, ''));
				editListItem(oResponse);
			});
		})
	;
	*/
}
var g_sListFilterImage = '/gfx/EFEFEF-alpha80.png'; 
function applyListFilter() {
	var $oElement = jQuery('.list table, .lst table');
	jQuery('<div id="msg-loading-list">Lijst wordt bijgewerkt. Een moment geduld a.u.b.&hellip;<img src="/CFIDE/scripts/ajax/resources/cf/images/loading.gif" alt="" /></div>')
		.css({
		  	  'position':'absolute'
			, 'background':'transparent url('+g_sListFilterImage+') 0 0 repeat'
			, 'width':jQuery('.list table, .lst table').width()
			, 'height':jQuery('.list table, .lst table').height()
			, 'line-height':jQuery('.list table, .lst table').height()+'px'
			, 'text-align':'center'
			, 'font-weight':'bold'
			})
		.insertBefore($oElement);
	
	oProxy.setForm('frm-filter');
	oProxy.updateList();
}
function updateList(p_oResponse) {
	var sHtml = new String('Fout bij ophalen data.');
	if (p_oResponse.SHTML) {
		sHtml = p_oResponse.SHTML;
	}
	// update filter form
	if (p_oResponse.NLISTPAGE) {
		jQuery('#frm-filter_x_lp').val(p_oResponse.NLISTPAGE);
		jQuery('#frm-filter_x_rpp').val(p_oResponse.NRECORDSPERPAGE);
		jQuery('#frm-filter_x_lpc').val(p_oResponse.NLISTPAGECOUNT);
	}
	// replace list
	jQuery('.list, .lst').before(sHtml).remove();
	initList();
}
function activateListItem(p_oResponse) {
	applyListFilter();
	showCommonMsg(p_oResponse.SMSG);
}
function deleteListItem(p_oResponse) {
	applyListFilter();
	showCommonMsg(p_oResponse.SMSG);
}
function hideListItem(p_oResponse) {
	applyListFilter();
	showCommonMsg(p_oResponse.SMSG);
}
function editListItem(p_oResponse) {
	showOverlayContent(p_oResponse.SHTML);
	initListItemForm();
}
function saveListItem(p_oResponse) {
	if (p_oResponse.NSTATUS!=1) {
		alert(p_oResponse.SMSG);
	} else {
		deleteOverlay();
		applyListFilter();
		showCommonMsg(p_oResponse.SMSG);
	}
}
function initListItemForm() {
	jQuery('#frm-edit_do_cancel')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			deleteOverlay();
		})
	;
	jQuery('#frm-edit_do_submit')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			oProxy.setForm(this.form.id);
			oProxy.saveListItem();
		})
	;
	jQuery('#frm-edit_do_add')
		.click(function(p_oEvent){
			p_oEvent.preventDefault();
			this.form.x_id.value='';
			oProxy.setForm(this.form.id);
			oProxy.saveListItem();
		})
	;
}
function showOverlayContent($p_oElement) {
	var $oContainer = jQuery('<div id="ed-o-container" class="ed-overlay"></div>');
	var $oContent = jQuery('<div id="ed-o-content" class="ed-overlay"></div>')
		.append($p_oElement)
		.appendTo($oContainer)
	;
	
	var $oShadow = jQuery('<div id="ed-o-shadow" class="ed-overlay"></div>')
		.css({'opacity':0})
		.appendTo($oContainer)
		.animate({opacity:0.4}, 3000)
	;
	$oContainer.appendTo('body');
	
	// resize, reposition
	var nContentHeight = jQuery('#ed-o-content').height();
	var nWindowHeight = jQuery(window).height() - 20;
	var nHeight = nContentHeight < nWindowHeight ? nContentHeight : nWindowHeight;
	var nMarginTop = nHeight*-0.5;
	jQuery('#ed-o-container div.ed-overlay').height(nHeight);
	jQuery('#ed-o-container').css({'margin-top': nMarginTop+'px'});
	
	// add deleteOverlay event
	jQuery('#ed-overlay').click(deleteOverlay);
}
function showOverlay() {
	jQuery('<div id="ed-overlay" class="ed-overlay"></div>')
		.css({'opacity':0})
		.appendTo('body')
		.animate({opacity:0.7}, 'fast')
	;
}
function deleteOverlay(p_oEvent) {
	jQuery('.ed-overlay')
		.stop().animate({opacity:0}, 'fast', function() {jQuery(this).remove();})
	;
}
function initMsg() {
	var $oMsg = jQuery('.msg');
    if ($oMsg.length) {
    	// Hij bestaat
    	// voeg knop en id toe
    	var $oCloseBtn = jQuery('<div class="close" title="Sluiten"><img src="/gfx/cross.gif" alt="" /></div>').click(function(p_oEvent){p_oEvent.preventDefault();jQuery(this).parent().slideUp('fast');});
    	$oMsg.prepend($oCloseBtn).attr('id', 'common-msg');
    }
}
function showCommonMsg(p_sMessage, p_sjQuerySelector) {
	var $oMsg = jQuery('#common-msg');
	var sjQuerySelector = '.tlb';

    if ($oMsg.length) {
    	// Hij bestaat
    	jQuery('#common-msg li').html(p_sMessage);
    	$oMsg.animate({borderLeftWidth: '50px'}, 'slow').animate({borderLeftWidth: '1px'}, 'fast');
    } else { 
    	// Hij bestaat niet, maken hem aan.
    	var $oMsg = jQuery('<div class="msg" id="common-msg"><ul><li>'+p_sMessage+'</li></ul></div>').hide();
    	$oCloseBtn = jQuery('<div class="close" title="Sluiten"><img src="/gfx/cross.gif" alt="Sluiten" /></div>').click(function(p_oEvent){p_oEvent.preventDefault();jQuery(this).parent().slideUp('fast');});
        $oCloseBtn.prependTo($oMsg);

        if (p_sjQuerySelector) {
        	sjQuerySelector = p_sjQuerySelector;
        }
        $oMsg.insertAfter(sjQuerySelector);
    }
    $oMsg.slideDown('slow');
}
function doGetDownload(p_sType,p_sFormaat) {
	jQuery('#frm-filter_download_type').val(p_sType);
	jQuery('#frm-filter_download_formaat').val(p_sFormaat);
	oProxy.setForm('frm-filter');
	showCommonMsg('Uw download wordt aangemaakt. Een moment geduld a.u.b.&hellip;<img src="/CFIDE/scripts/ajax/resources/cf/images/loading.gif" alt="" />');
	oProxy.getDownload();
}
function getDownload(p_oResponse) {
	showCommonMsg(p_oResponse.SMSG);
}

var g_nTransformSpeed = 100; //ms
/**
 * showElements : Shows/hides dom-nodes
 * @param string p_sElementId Comma seperated list of element-id's
 * @param boolean p_bShow Switch: true shows, hides otherwise
 * @return void
 */
function showElements(p_sElementId, p_bShow) {
	var aElements = p_sElementId.split(',');
	for (var i=0; i<aElements.length; i++) {
		try {
			if (p_bShow) {
				jQuery('#'+aElements[i]).slideDown(g_nTransformSpeed);
			} else {
				jQuery('#'+aElements[i]).hide();
			}
		} catch (er) {
			// suppress errors
		} 
	}
};
