/*===============================================================================
 Red4Net(R) - Content Management System : www.netsoftworks.eu
 Copyright (C) 2000-11 NETSOFTWORKS - Antonio Fonseca All Rights Reserved
 ===============================================================================*/

/** SCRIPT:	red4net.js
 *	DESCR:	Wird in allen Adminseiten mittels lib_html.printAdminMetaTags eingebunden.
 *	INTERFACE:
 *	function stopEvent(event)
 *	function onAjaxError(xhr, textStatus, error)
 *	function updateWidgetApprovalDisplay()
 *	function encodeHTML(str)
 *	function decodeHtmlEntity(str)
 *	function isArray(obj)
 *	function getXmlFromString()
 */

/**
 * Returns the class name of the argument or undefined if it's not a valid JavaScript object.
 * http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
 */
function getObjectClass(obj) {
	if (obj && obj.constructor && obj.constructor.toString) {
		var arr = obj.constructor.toString().match(/function\s*(\w+)/);
		if (arr && arr.length == 2) return arr[1];
	}
	return undefined;
}

/**
 * http://www.openjs.com/articles/prevent_default_action/
 */
function stopEvent(event) {
	if (!event) var event = window.event;
	//e.cancelBubble is supported by IE - this will kill the bubbling process
	event.cancelBubble = true;
	event.returnValue = false;
	//e.stopPropagation works only in Firefox
	if (event.stopPropagation) {
		event.stopPropagation();
		event.preventDefault();
	}
}

/**
 * Sorgt dafür daß ein Fehler mit einem ErrorPanel als Dialog ausgegeben wird.
 */
function onAjaxError(xhr, textStatus, error) {
	$('#r4n-error-panel').remove(); // ggf. vorhandenes Panel entfernen
	var panel = $('#r4n-error-panel', $(xhr.responseText)); // Panel auslesen
	if (1 > panel.length) panel = xhr.responseText; // sonst ganze Antwort
	$('body').append(panel); // Panel einhängen
	$('#r4n-error-panel').dialog({ // Panel als Dialog darstellen
		title: 'Error', width: 400, height: 250, minWidth: 400, minHeight: 250,
		close: function() {$.unblockUI();},
		buttons: {CLOSE: function(){$(this).dialog('close');}}
	});
}

/**
 * Aktualisiert das Widget zur Anzeige aller Freigaben eines gegebenen Objektes.
 * Das Objekt und seine ID werden aus der aktuellen URL ermittelt.
 */
function updateWidgetApprovalDisplay() {

	var elm = '#r4n-approval-list-widget';
	if ($(elm).length < 1) {
		alert('widget not found (' + elm + ')');
		return;
	}

	// Sicherstellen, daß die aktuelle URL der Seite verwendet wird.
	// Wurde eine FileDialog zuvor geöffnet, so ist dabei ggf. eine andere URL gesetzt worden.
	$.url.setUrl();

	var parent_type, parent_id;
	switch ($.url.attr('file')) {
		case 'adm_approvals_list.asp':
			parent_type = 12; // OBJ_PORTAL
			parent_id = '';
			break;
		case 'adm_group_form.asp':
			parent_type = 2; // OBJ_GROUP
			parent_id = $.url.param('id');
			break;
		case 'adm_author_form.asp':
			parent_type = 3; // OBJ_ACCOUNT
			parent_id = $.url.param('id');
			break;
		case 'serv_account_form.asp':
			parent_type = 3; // OBJ_ACCOUNT
			parent_id = $.url.param('accountId');
			break;
		case 'adm_content_form.asp':
			parent_type = 1; // OBJ_CONTENT
			parent_id = $.url.param('id');
			break;
		case 'serv_content_form.asp':
			parent_type = 1; // OBJ_CONTENT
			parent_id = $.url.param('content_id');
			break;
		case 'serv_file_form_dialog.asp':
			parent_type = 6; // OBJ_FILE
			parent_id = $.url.param('fileId');
			break;
		default:
			break;
	}

	$(elm).html(glob_str_please_wait);
	$.ajax({
		type: 'GET',
		url: app_url + '/red4net/serv_approval_action.asp',
		data: {
			anti: Math.random(),
			action: 'getView',
			parent_type: parent_type,
			parent_id: parent_id
		},
		success: function(data, textStatus) {
			if (!data) 
				data = 'widget could not be created';
			$(elm).replaceWith(data);
		},
		error: onAjaxError
	});
	
}

/**
 */
function updateEanHcsListWidget() {

	var elm = '#r4n-ean-hcs-list-widget';
	if ($(elm).length < 1) {
		alert('widget not found (' + elm + ')');
		return;
	}

	// Sicherstellen, daß die aktuelle URL der Seite verwendet wird.
	$.url.setUrl();

	var parent_type, parent_id;
	switch ($.url.attr('file')) {
		case 'adm_content_type_form.asp':
			parent_type = 11; // OBJ_CONTENT_TYPE
			parent_id = $.url.param('id');
			break;
		case 'adm_content_form.asp':
			parent_type = 1; // OBJ_CONTENT
			parent_id = $.url.param('id');
			break;
		case 'serv_content_form.asp':
			parent_type = 1; // OBJ_CONTENT
			parent_id = $.url.param('content_id');
			break;
		default:
			break;
	}

	$(elm).html(glob_str_please_wait);
	$.ajax({
		type: 'GET',
		url: app_url + '/red4net/serv_ean_hcs_action.asp',
		data: {
			anti: Math.random(),
			action: 'getView',
			parent_type: parent_type,
			parent_id: parent_id
		},
		success: function(data, textStatus) {
			if (!data) 
				data = 'widget could not be created';
			$(elm).replaceWith(data);
		},
		error: onAjaxError
	});
	
}

/**
 * convert characters to entities using the Unicode format
 * http://stackoverflow.com/questions/1354064/how-to-convert-characters-to-html-entities-using-plain-javascript/1354491
 */
function encodeHTML(str) {
	var aStr = str.split('')
	var i = aStr.length
	var aRet = [];
	for (i = 0; i < aStr.length; i++) {
		var iC = aStr[i].charCodeAt();
		if (iC < 65 || iC > 127 || (iC > 90 && iC < 97)) {
			aRet.push('&#' + iC + ';');
		}
		else {
			aRet.push(aStr[i]);
		}
	}
	return aRet.join('');
}

/**
 * function zum decodieren von Entities
 */
function decodeHtmlEntity(str) {
	var textarea = document.createElement('textarea');
	textarea.innerHTML = str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
	return textarea.value;
}

/**
 * http://www.bram.us/2008/02/01/javascript-isarray-check-if-an-elementobject-is-an-array/
 */
function isArray(obj) {
	return obj.constructor == Array;
}

/**
 * Parsing an XML String - A Cross browser Example
 */
function getXmlFromString() {
	try {
		//Internet Explorer
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(transport.responseText);
	} catch (e) {
		try {
			//Firefox, Mozilla, Opera, etc.
			parser = new DOMParser();
			xmlDoc = parser.parseFromString(text, "text/xml");
		} catch (e) {
			alert(e.message)
		}
	}
	return xmlDoc;
}

$(document).ready(function() {

	/**
	 * UPDATE TIME
	 * Ruft einen PeriodicalUpdater auf, so da�� alle 5 Minuten ein Lebenszeichen in
	 * konto_detail eingetragen wird.
	 * Ruft einen PeriodicalUpdater auf, so daß jede
	 * Minute die Zeit des Servers aktualisiert wird. Zudem wird damit das
	 * Session.TimeOut unterdrückt, solange ein Fenster offen ist.
	 */
	if (0 < $('#span_server_time').length) {
		$.PeriodicalUpdater({
			url: '/red4net/ajax_general.asp',
			method: 'get',
			sendData: {ajax: 'get_time', anti: Math.random()},
			multiplier: 1,
			minTimeout: 59000,
			maxTimeout: 60000,
			type: 'text'
		}, function(data){
			$('#span_server_time').html(data);
		});
	}
	
	/**
	 * PING
	 */
	if (0 < $('#span_ping_result').length) {
		$.PeriodicalUpdater({
			url: '/red4net/ajax_general.asp',
			method: 'get',
			sendData: {ajax: 'do_ping', anti: Math.random()},
			multiplier: 1,
			minTimeout: 290000,
			maxTimeout: 300000,
			type: 'text'
		}, function(data){
			//$('#span_ping_result').html(data);
		});
	}

	// Select Tag and update input#tags
	$('.tag, #taglist').click(function() {
		$(this).toggleClass('ui-selected');
		var selectedTags = $('#tags').empty();
		var count = 0;
		var inValue = '';
		$('.ui-selected', this).each(function() {
			count += 1;
			var tagId = $(this).attr('class').split(' ')[1];
			if (count > 1) {
				inValue = inValue + ',';
			}
			inValue = inValue + tagId;
		});
		$('#tags').val(inValue);
	});
	
	/**
	 * Zeigt den SuccessPanel als Dialog an.
	 */
	if (0 < $('#r4n-success-panel').length) {
		$.blockUI({
			message: $('#r4n-success-panel').html(),
			timeout: 2000
		});
	}
	
	/**
	 * Zeigt den ErrorPanel als Dialog an.
	 */
	if (0 < $('#r4n-error-panel').length) {
		$('#r4n-error-panel').dialog({
			title: 'Error',
			width: 400,
			height: 250,
			minWidth: 400,
			minHeight: 250,
			buttons: {
				CLOSE: function() {
					$(this).dialog('close');
				}
			}
		});
	}
	
	/**
	 * This function change the ui-state on hover, mousedown and mouseup events
	 * for all the elements with the class ui-state-default.
	 */
	$('.ui-state-default').hover(function() {
		$(this).addClass('ui-state-hover');
	}, function() {
		$(this).removeClass('ui-state-hover');
	}).mousedown(function() {
		$(this).addClass('ui-state-active');
	}).mouseup(function() {
		$(this).removeClass('ui-state-active');
	});
	
	/**
	 * Beim Submit eines Formulares wird die Meldung 'please wait' ausgegeben.
	 */
	$('form').submit(function() {
		$.blockUI({
			message: glob_str_please_wait
		});
	});

	/**
	 * Setzt Eventhandler für das Einbinden eines Contents.
	 */
	$('#r4n-mode-all').live('click', function(e){
		stopEvent(e);
		$.blockUI({message: glob_str_please_wait});
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(result, textStatus) {
				window.location = window.location;
			},
			error: onAjaxError,
			complete: function() {
				$.unblockUI();
			}
		});
	});

	/**
	 * DropDownButtons klickbar machen
	 */
	$('div.r4n-ddbutton > button').live('click', function() {
		$('ul', $(this).parent()).slideToggle('normal');
		$('span', this)
			.toggleClass('ui-icon-circle-triangle-s')
			.toggleClass('ui-icon-circle-triangle-n');
	})

	/**
	 * UL Unterlappung des ausgewählten DropDownButtons verhindern
	 */
	$('div.r4n-ddbutton').each(function(i, item) {
		$(this).css('zIndex', 1000 - i);
	});
	
	/**
	 * Initialisiert die jQuery UI Tabs.
	 * In einer Seite mit einer Division (class=r4n-tabbed) wird die darunter liegende UL
	 * als Tabs dargestellt. Die darauffolgenden Divisions (z.B. id=tabs-1, tabs-2,..)
	 * sind die Inhalte dieser Tabs.
	 */
	$('.r4n-tabbed').tabs();

	/**
	 * Initialize localized datepicker
	 * 
	 * The locale (lowercase ISO 639 language code) to use is set
	 * as an additional class value of the datepicker input.
	 */ 
	$('.r4n-datepicker').each(function() {

		// get config by locale
		var classes = $(this).attr('class').split(' ');
		var lang = '';
		for (var i=0; i<classes.length; i++)
			if (2 == classes[i].length)
				lang = classes[i];
		if ('en' == lang) lang = '';
		if (undefined==$.datepicker.regional[lang])
			alert('datepicker lacks file for lang ' + lang);
		var localeConfig = $.datepicker.regional[lang];

		var widgetId = $(this).attr('id');

		// get special config by widget id
		var specialConfig;
		if ('form_data_from' == widgetId) // BackContentForm - FormResults - from
			specialConfig = {};

		else if ('form_data_to' == widgetId) // BackContentForm - FormResults - until
			specialConfig = {};

		else if ('contentDateFrom' == widgetId) // FrontContentForm - content from
			specialConfig = {};

		else if ('contentDateUntil' == widgetId) // FrontContentForm - content until
			specialConfig = {};

		else if ('validUntil' == widgetId) // ApprovalForm
			specialConfig = {
				dateFormat: 'dd.mm.yy'
			};

		else if ('r4n-filter-from' == widgetId) // AbstractListWidget (for content) - filter from
			specialConfig = {
				changeMonth: true,
				changeYear: true,
				onChangeMonthYear: function(year, month, inst){
					$(this).datepicker('setDate', new Date(year, month, 0));
				},
				showButtonPanel: false,
				dateFormat: 'yy-mm'
			};

		else // all other occurences
			// BackContentForm - content from
			// BackContentForm - content until
			// ContactForm - day of birth
			// BackContentDelete - date
			// BackPortalForm - del_date_from
			// BackPortalForm - del_date_to
			specialConfig = {
				//altFormat: loc['dateFormat'],
				timeFormat: ' hh:ii:ss',
				showOtherMonths: true,
				show: 'both',
				yearRange: '-100:+3',
				changeMonth: true,
				changeYear: true,
				showButtonPanel: true
			};

		// init datepicker with accumulated config
		$(this).datepicker($.extend(localeConfig, specialConfig));

	});

	/**
	 * Überprüfen ob die angezeigte Seite übersetzt ist.
	 * Bei fehlender Übersetzung wird ein Meldung für 2s angezeigt.
	 */
	var displayNotTranslatedMessage = function(){
		// sicherstellen daß das Formular ein persistentes Objekt anzeigt
		// Backend (alle), Frontent ContentForm, Frontent AccountForm
		$.url.setUrl();
		if (undefined === $.url.param('id')
			&& undefined === $.url.param('content_id')
			&& undefined === $.url.param('accountId'))
			return;
		var activeFlag = $('#langtrns ul li.active a img')
		// sicherstellen daß eine aktive Flagge vorhanden ist
		if (0 == activeFlag.length) return;
		// sicherstellen daß die aktive Flagge ausgegraut ist (nicht übersetzt) 
		var match = activeFlag.attr('src').match(/_grey.gif$/);
		if (!match || 0 == match.length) return;
		// Objekt ist nicht übersetzt => Meldung ausgeben
		$.blockUI({
			message: 'is not translated', // I18N
			cursor: 'default',
			overlayCSS: {
				backgroundColor: '#000',
				opacity: '0.2'
			},
			css: {
				padding: '30px',
				width: '300px',
				cursor: 'default',
				textAlign: 'center'
			}
		});
		// Meldung entfernen
		setTimeout($.unblockUI, 2000);
	};
	displayNotTranslatedMessage();

	/**
	 * This handler sends a request to perform an action via Ajax and reloads
	 * the current page on success. It is used e.g. to set the default language,
	 * copy or delete a translation of an object.
	 */
	$('.r4n-action-and-reload').live('click', function(e){
		stopEvent(e);
		$.blockUI({
			message: null
		});
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {
				anti: Math.random()
			},
			beforeSend: function(xhr){
				// Sicherheitsabfrage vor dem L�schen einer �bersetzung
				if ('deleteTranslation' == $.url.setUrl(this.url).param('action')) {
					var question = 'DELETE_TRANSLATION_CONFIRMATION_MESSAGE';
					if (DELETE_TRANSLATION_CONFIRMATION_MESSAGE) 
						question = DELETE_TRANSLATION_CONFIRMATION_MESSAGE;
					if (!confirm(question)) 
						return false;
				}
			},
			success: function(data, textStatus){
				// reload page
				document.location.href = document.location.href; // hat ggf. keine ID
				//document.location.href = $('form').attr('action');
			},
			error: onAjaxError,
			complete: function(xhr, textStatus){
				//$.unblockUI(); // wird ja eh neu geladen
			}
		});
	});

	/**
	 * Klappt in der Verwaltung der Aktivierung eines Objektes für die Gruppen
	 * einen GruppenTypen auf und stellt all seine Gruppen dar.
	 */
	$('.r4n-icon-fold').live('click', function(e){
		stopEvent(e);
		var li = $(this).parent().parent();
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(data, textStatus){
				$(li).replaceWith(data);
			},
			error: onAjaxError
		});
	});

	/**
	 * (De)Aktiviert ein Objekt für alle Gruppen eines GruppenTypen.
	 */
	$('.r4n-set-activation').live('click', function(e){
		stopEvent(e);
		var icon = $(this).parent().parent().find('.r4n-icon-fold');
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(data, textStatus){
				icon.click();
			},
			error: onAjaxError
		});
	});

	/**
	 * Wechselt die Aktivierung eines Objektes für eine Gruppe.
	 */
	$('.r4n-toggle-activation').live('click', function(e){
		stopEvent(e);
		var img = $(this).find('img');
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(data, textStatus){
				if (0 < img.attr('src').indexOf('inactiv.gif'))
					img.attr('src', img.attr('src').replace('inactiv.gif', 'activ.gif'));
				else
					img.attr('src', img.attr('src').replace('activ.gif', 'inactiv.gif'));
			},
			error: onAjaxError
		});
	});

	/**
	 * Laden von ApprovalDisplay wenn es noch nicht passiert ist
	 */
	$('#r4n-approval-list-widget h3').click(function() {
		var approvalDisplay = $('#r4n-approval-list-widget');
		if (0 < approvalDisplay.children('table').length) 
			return; // Widget ist bereits geladen
		approvalDisplay.css('display', 'block');
		updateWidgetApprovalDisplay();
	});
	
	/**
	 * Löchen eines Approvals
	 */
	$('.r4n-approval-delete').live('click', function(e){
		stopEvent(e);
		if (!confirm('Do you really want to delete this approval?'))
			return;
		$.blockUI({
			message: null
		});
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(data, textStatus) {
				if ('function' == typeof updateWidgetApprovalDisplay)
					updateWidgetApprovalDisplay();
			},
			error: onAjaxError,
			complete: function() {
				$.unblockUI();
			}
		});
	});

	/**
	 * Löchen einer EanHcs
	 */
	$('.r4n-ean-hcs-delete').live('click', function(e){
		stopEvent(e);
		if (!confirm('Do you really want to delete this EAN-HCS?'))
			return;
		$.blockUI({
			message: null
		});
		$.ajax({
			type: 'GET',
			url: $(this).attr('href').replace('&amp;', '&'),
			data: {anti: Math.random()},
			success: function(data, textStatus) {
				if ('function' == typeof updateEanHcsListWidget)
					updateEanHcsListWidget();
			},
			error: onAjaxError,
			complete: function() {
				$.unblockUI();
			}
		});
	});

});

