var AdministrationCore = function(){
	
	this.host_url;
	this.shadowbox;
	this.tinyMCEinstances = new Array();
	this.tinyMCEsettings = {
		// General options
		mode : "none",
		theme : "advanced",
		plugins : "itbsgallery,safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
	
		// Theme options
		theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,formatselect,fontsizeselect",
		theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,image,cleanup,code,|,insertdate,inserttime,|,forecolor,backcolor",
		theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_statusbar_location : "bottom",
		theme_advanced_resizing : true,
		
		force_br_newlines : true, 
		forced_root_block: '', 
		force_p_newlines: false,
	
		// Drop lists for link/image/media/template dialogs
		template_external_list_url : "lists/template_list.js",
		external_link_list_url : "lists/link_list.js",
		external_image_list_url : "lists/image_list.js",
		media_external_list_url : "lists/media_list.js",
		
		//save_callback: "postForm",
	
		// Replace values for the template plugin
		template_replace_values : {
			username : "Some User",
			staffid : "991234"
		}
	};
	
	/* Init Actions */
	this.initTinyMCE = function(){
		tinyMCE.init(this.tinyMCEsettings);
	}
	
	this.initTabs = function(default_opened)
	{
		$(function() {
			$("#tabs").tabs();
		});
		
		if(default_opened != '' && typeof(default_opened) != 'undefined') 
			$("#tabs").tabs( 'select' , default_opened );
	}
	
	this.initAccordion = function(active_element)
	{
		$("#accordion").accordion({
			header: "h3",
			animated: false,
			autoHeight: false,
			collapsible: true,
			active: active_element
		});
	}
	
	this.initLoading = function()
	{
		$("body").append("<div id='loading-box'><span class='ui-icon-loading' style='float: left; margin-right: 0.3em;'/>" + $t('msg.loading') + "</div>");
		$("#loading-box").dialog({
			autoOpen: false,
			bgiframe: true,
			closeOnEscape: false,
			draggable: false,
			modal: true,
			resizable: false,
			minHeight: 10,
			title: $t('lbl.loading')
		});
	}
	
	this.initError = function()
	{
		$("body").append("<div id='error-box' title='" + $t('msg.error') + "'><div id='error-message' class='ui-state-error ui-corner-all'></div></div>");
		$("#error-box").dialog({
			autoOpen: false,
			bgiframe: true,
			draggable: false,
			modal: true,
			resizable: false,
			minHeight: 10,
			buttons: {
				Ok: function() {
					$(this).dialog('close');
				}
			}
		});
	}
	
	this.initMessage = function()
	{
		$("body").append("<div id='message-box' title='" + $t('msg.message') + "'><div id='message' class='ui-state-highlight ui-corner-all'></div></div>");
		$("#message-box").dialog({
			autoOpen: false,
			bgiframe: true,
			draggable: false,
			modal: true,
			resizable: false,
			minHeight: 10,
			buttons: {
				Ok: function() {
					$(this).dialog('close');
				}
			}
		});
	}
	
	/* Get & Load Actions */
	this.getURL = function(action, subaction, params){
		var url = this.host_url;
		
		if(action != '' && subaction != '' && typeof(action) != 'undefined' && typeof(subaction) != 'undefined')
		{
			url += "?action=" + action + "." + subaction;
		}
		
		if(params != '' && typeof(params) != 'undefined')
		{
			var additionalParams = "";
			jQuery.each(params, function(i, val) {
				additionalParams += "&" + i + "=" + val;
			});
			url += additionalParams
		}
		return url;
	}
	
	/* Add / Set / Show Actions */
	this.setURL = function(url){
		this.host_url = url;
	}
	
	this.setShadowbox = function(shadowbox){
		this.shadowbox = shadowbox;
	}
	
	/* Add/Create a default setup tinyMCE */
	this.addTinyMCE = function(text_area_id, custom_settings){
		if(document.getElementById(text_area_id) != null && tinyMCE.getInstanceById(text_area_id) == null) {
			if(typeof(custom_settings) != 'undefined') 
			{
				switch(custom_settings)
				{
					case 'simple':
						tinyMCE.settings = {mode: "none", theme: "advanced", content_css: "css/content.css", theme_advanced_toolbar_location: "top", theme_advanced_toolbar_align: "left", skin: "o2k7", skin_variant: "black", force_br_newlines : true, forced_root_block: '', force_p_newlines: false};
					break;
					default:
						tinyMCE.settings = custom_settings;
					break;
				}
			} else {
				tinyMCE.settings = this.tinyMCEsettings;
			}
			
			tinyMCE.execCommand('mceAddControl', false, text_area_id);
			
			this.tinyMCEinstances.push(text_area_id);
		}
	}
	
/*	this.addTinyGalleryList = function(text_area_id, gallery_list) {
		if(typeof(gallery_list) != 'undefined')
		{
			jQuery.each(gallery_list, function(i, val) {
				tinyMCE.get(text_area_id).controlManager.get('itbsgallery').add(val, i);
			});
		}
	}*/
	
	/* Supported types(events): 'keydown', 'keyup' and 'keypress'
	 * The options are 'combi' i.e. the key combination, 
	 * and 'disableInInput' which allow your code not to be executed when the cursor is located inside an input or textarea.
	 * The key combination can be passed as string or as an object. 
	 * You may pass an object in case you wish to override the default option for disableInInput which is set to false: {combi:'a', disableInInput: true}
	 * To omit the default action for the key combination, add evt.stopPropagation(), evt.preventDefault() and return false; inside youre handler. 
	 * More info at: http://code.google.com/p/js-hotkeys/wiki/about */
	this.addHotKey = function(types, options, handler) {
		$(document).bind(types, options, handler);
	}
	
	this.showLoading = function()
	{
		if($("#loading-box").length == 0) this.initLoading();
		$("#loading-box").dialog("open");
	}
	
	this.showError = function(error_message)
	{
		if($("#error-box").length == 0) this.initError();
		$("#error-box").find('#error-message').html('<span class="ui-icon ui-icon-alert" style="float: left; margin-right: 0.3em;"/>' + error_message);
		$("#error-box").dialog("open");
	}
	
	this.showMessage = function(message)
	{
		if($("#message-box").length == 0) this.initMessage();
		$("#message-box").find('#message').html('<span class="ui-icon ui-icon-info" style="float: left; margin-right: 0.3em;"/>' + message);
		$("#message-box").dialog("open");
	}
	
	this.showConfirm = function(confirm_message, post_application, post_action, post_form, post_params, load_application, load_action, load_body, load_params)
	{
		if(confirm(confirm_message)){
			if(typeof(post_application) != 'undefined' && post_application != '' && (typeof(load_application) == 'undefined' || load_application == ''))
			{
				cmsAdministration.postForm(post_application, post_action, post_form, post_params);
			} else {
				cmsAdministration.postLoadForm(post_application, post_action, post_form, post_params, load_application, load_action, load_body, load_params);
			}
		}
		return false;
	}

	/* Delete / Remove / Hide Actions */
	this.removeTinyMCE = function(text_area_id)
	{
		if(typeof(text_area_id) == 'undefined' || text_area_id == '')
		{
			for(var i=0; i<this.tinyMCEinstances.length; i++)
			{
				var text_area_id = this.tinyMCEinstances[i];
				
				if (tinyMCE.getInstanceById(text_area_id) != null) {
					tinyMCE.execCommand('mceRemoveControl', false, text_area_id);
				}
			}
			
			//this.tinyMCEinstances = new Array();
		} else if (tinyMCE.getInstanceById(text_area_id) != null) {
			for(var i=0; i<this.tinyMCEinstances.length; i++)
			{
				if(this.tinyMCEinstances[i] == text_area_id)
				{
					this.tinyMCEinstances.pop(i); // remove it from the array
					break;
				}
			}
			
			tinyMCE.execCommand('mceRemoveControl', false, text_area_id);
		}
	}
	
	this.hideLoading = function()
	{
		$("#loading-box").dialog("close");
	}
	
	this.replaceContent = function(body, response, textStatus, successHandler)
	{
		cmsAdministration.removeTinyMCE(); /// remove old editor if exists
		if(body == 'iframe') {
			cmsAdministration.shadowbox.open({
				player:     'iframe',
				content:    response
			});
		} else if(body == 'frame') {
			$(cmsAdministration.contentDocument).find('body').html(response);
		} else if(typeof(body) != 'undefined' && body !== null && body !== false) {
			$("#"+body).html(response);
		} else if(body !== false) {
			$("#content").html(response);
		}
		
		cmsAdministration.hideLoading();
		if(successHandler != '' && typeof(successHandler) != 'undefined')
		{
			successHandler(response, textStatus);
		}
	}
	
	/* Form Actions */
	this.autoFill = function(id, value)
	{
		if($("#" + id).length > 0) {
			$("#" + id).attr({ 
					value: value 
				}).focus(function(){
					if($(this).val()== value){
						$(this).val("");
					}
				}).blur(function(){
					if($(this).val()==""){
						$(this).val(value);
					}
			});
		}
	}
	
	this.sendForm = function(form_id){
		$("#" + form_id).submit();
	}
	
	this.submitParams = function(post_application, post_action, post_params, load_application, load_action, load_body, load_params) {
		this.submitForm('', post_application, post_action, '', post_params, load_application, load_action, load_body, load_params);
	}
	
	this.submitForm = function(validation_rules, post_application, post_action, post_form, post_params, load_application, load_action, load_body, load_params){			
		if(typeof(validation_rules) != 'undefined' && validation_rules != '')
		{
			var validator = new FormValidator();
			var res = validator.validate(validation_rules);
		} else {
			var res = true; // no validation needed
		}
		
		if(res == true)
		{
			if(typeof(post_application) != 'undefined' && post_application != '' && (typeof(load_application) == 'undefined' || load_application == ''))
			{
				cmsAdministration.postForm(post_application, post_action, post_form, post_params);
			} else {
				cmsAdministration.postLoadForm(post_application, post_action, post_form, post_params, load_application, load_action, load_body, load_params);
			}
		}
		
		return false;
	}
	
	this.loadForm = function(application, action, body, params, successHandler, returnDataType){
		var urlParams = "layout=ajax&action=" + application + "." + action;
	
		if(typeof(params) != 'undefined')
		{
			var additionalParams = "";
			jQuery.each(params, function(i, val) {
				additionalParams += "&" + i + "=" + val;
			});
			urlParams += additionalParams;
		}
		
		if(typeof(returnDataType) == 'undefined') returnDataType = 'html';
	
		this.showLoading();
		
		$.ajax({
			type: "POST",
			url: this.getURL(),
			data: urlParams,
			cache: false,
			dataType: returnDataType,
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				cmsAdministration.hideLoading();
				cmsAdministration.showError(XMLHttpRequest + " " + textStatus + " " + errorThrown);
			},
			success: function(response, textStatus) {
				cmsAdministration.replaceContent(body, response, response, successHandler);
			}
		});
	}
	
	this.loadXML = function(application, action, body, params, successHandler){
		return this.loadForm(application, action, body, params, successHandler, 'xml');
	}
	
	this.loadJSON = function(application, action, body, params, successHandler){
		return this.loadForm(application, action, body, params, successHandler, 'json');
	}
	
	this.loadModule = function(id, application, action)
	{
		// itbs-cms-panel-nonactive
		$("[class$='itbs-cms-panel-active']").attr('class', 'itbs-cms-panel-nonactive');
		$('#' + id).attr('class', 'itbs-cms-panel-active');
		this.loadForm(application, action, 'content');
	}
	
	this.postForm = function(application, action, form_id, params, successHandler, validation_rules, show_responce){
		if( ( form_id == '' || typeof(form_id) == 'undefined' ) && typeof(params) == 'undefined') return false;
		
		if(typeof(validation_rules) != 'undefined' && validation_rules != '')
		{
			var validator = new FormValidator();
			var res = validator.validate(validation_rules);
		} else {
			var res = true; // no validation needed
		}
		
		if(res != true) return false;
		
		tinyMCE.triggerSave(true,true);
		
		var urlParams = "layout=ajax&action=" + application + "." + action;
		if(form_id != '' && typeof(form_id) != 'undefined') urlParams += "&" + $("#"+form_id).serialize();
		if(params != '' && typeof(params) != 'undefined')
		{
			var additionalParams = "";
			jQuery.each(params, function(i, val) {
				additionalParams += "&" + i + "=" + val;
			});
			urlParams += additionalParams;
		}
		
		this.showLoading();
		
		$.ajax({
			type: "POST",
			url: this.getURL(),
			data: urlParams,
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				cmsAdministration.hideLoading();
				cmsAdministration.showError(XMLHttpRequest + " " + textStatus + " " + errorThrown);
			},
			success: function(response, textStatus) {
				cmsAdministration.hideLoading();
				// Have we got an error?
				if($(response).find('#error-list').length > 0)
				{
					cmsAdministration.showError($(response).find('#error-list').html());
				} else {
					if(show_responce != '' && typeof(show_responce) != 'undefined')
					{
						cmsAdministration.replaceContent(show_responce, response, textStatus, successHandler)
					} else {
						// if we have a handler send the responce there and leave the  message output to the handler
						if(successHandler != '' && typeof(successHandler) != 'undefined')
						{
							successHandler(response, textStatus);
						} else {
							if($(response).find('#message-list').length > 0) {
								cmsAdministration.showMessage($(response).find('#message-list').html());
							}
						}
					}
				}
			}
		});
	}
	
	this.postLoadForm = function(post_application, post_action, post_form, post_params, load_application, load_action, load_body, load_params) {
		this.postForm(post_application, post_action, post_form, post_params, function() {
			cmsAdministration.loadForm(load_application, load_action, load_body, load_params);
		});
	}
	
	this.doLogin = function(){
		var login = $("#i_l").val();
		if (login == "" || login == undefined) {
		  $("#i_l").focus();
		  return false;
		}
		var password = $("#i_p").val();
		if (password == "" || password == undefined) {
		  $("#i_p").focus();
		  return false;
		}
		var code = $("#i_code").val();
		if (code == "" || code == undefined) {
		  $("#i_code").focus();
		  return false;
		}
		
		var dataString = 'i_l='+ login + '&i_p=' + password + '&i_code=' + code;
			
		this.showLoading();	
			
		$.ajax({
		  type: "POST",
		  url: this.getURL('registration','login', {layout: 'ajax'}),
		  data: dataString,
		  cache: false,
		  dataType: "html",
		  success: function(response, textStatus) {
			cmsAdministration.hideLoading();
		  	// Have we got an error?
			if($(response).find('#error-list').length > 0)
			{
				cmsAdministration.showError($(response).find('#error-list').html());
			} else {
				if($(response).find('#message-list').length > 0) {
					cmsAdministration.showMessage($(response).find('#message-list').html());
				}
				
				$('#content_body').html(response);
			}
			
			var options = {
				doRefreshOnClose: true
			};
			if ( typeof(shadowbox) != "undefined" ) {
				cmsAdministration.shadowbox.applyOptions(options);
			}
		  }
		 });
		return false;
	}
	
	this.singleUpload = function(application, action, upload_field, upload_params){
		
		var default_params = {
		    action : application + "." + action
		    ,layout: 'ajax'
		};
		
		var uploader = new AjaxUpload(upload_field + '-button', {
			id: upload_field,
			interval: 0,
			// Location of the server-side upload script
			action: cmsAdministration.getURL(),
			// File upload name
			name: 'userfile',
			// Additional data to send
			data: $.extend(default_params, upload_params),
			// Submit file after selection
			autoSubmit: true,
			// The type of data that you're expecting back from the server.
			// Html (text) and xml are detected automatically.
			// Only useful when you are using json data as a response.
			// Set to "json" in that case.
			responseType: false,
			// Fired after the file is selected
			// Useful when autoSubmit is disabled
			// You can return false to cancel upload
			// @param file basename of uploaded file
			// @param extension of that file
			onChange: function(file, extension){
				$(upload_field + '-file').val(file);
				$(upload_field + '-error').text('');
			},
			// Fired before the file is uploaded
			// You can return false to cancel upload
			// @param file basename of uploaded file
			// @param extension of that file
			onSubmit: function(file, extension) {
				var upload_field = this._settings.id;
					
				if (! (extension && /^(jpg|png|jpeg|gif)$/.test(extension))){
                    // extension is not allowed
					cmsAdministration.showError('Error: invalid file extension');
                    // cancel upload
                    return false;
				}
				
				$(upload_field + '-error').html('<img width="16" height="16" src="scss/js/ajax-loader.gif" border="0" />');
				
				// If you want to allow uploading only 1 file at time,
				// you can disable upload button
				this.disable();
				
				$(upload_field + '-button').text('Uploading');
				
				// Uploding -> Uploading. -> Uploading...
				this._settings.interval = window.setInterval(function(){
					$(upload_field + '-button').attr("disabled", "disabled");
					var text = $(upload_field + '-button').text();
					if (text.length < 13){
						$(upload_field + '-button').text(text + '.');					
					} else {
						$(upload_field + '-button').text('Uploading');				
					}
				}, 200);
			},
			// Fired when file upload is completed
			// WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
			// @param file basename of uploaded file
			// @param response server response
			onComplete: function(file, response) {
				var upload_field = this._settings.id;
				
				// enable upload button
				this.enable();
				
				$(upload_field + '-button').text('Browse...');
				
				window.clearInterval(this._settings.interval);
				
				if($(response).find('#error-list').length > 0)
				{
					cmsAdministration.showError($(response).find('#error-list').html());
				} else {
					$(upload_field).val(response);
					$(upload_field + '-error').text('Image uploaded');
					if($(response).find('#message-list').length > 0) {
						$(upload_field + '-error').text($t('msg.upload_sucess'));
					}
				}	
			}
		});
	}
	
	this.pause = function(millisecondi)
	{
		var now = new Date();
		var exitTime = now.getTime() + millisecondi;
	
		while(true)
		{
			now = new Date();
			if(now.getTime() > exitTime) return;
		}
	}
	
	this.stopEvent = function(event)
	{
		if (event.stopPropagation) {
			// this code is for Mozilla and Opera
			event.stopPropagation();
		}else if (window.event) {
			// this code is for IE
			window.event.cancelBubble = true;
		}
	}
	
	this.Client = {
	  viewportWidth: function() {
	    return self.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth);
	  },
	
	  viewportHeight: function() {
	    return self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight);
	  },
	  
	  viewportScrollWidth: function(){
		if (window.innerHeight && window.scrollMaxY) {// Firefox
			return  window.innerWidth + window.scrollMaxX;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			return document.body.scrollWidth;
		} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
			return document.body.offsetWidth;
	  	}
	  },
	  
	   viewportScrollHeight: function(){
		if (window.innerHeight && window.scrollMaxY) {// Firefox
			return  window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			return document.body.scrollHeight;
		} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
			return document.body.offsetHeight;
	  	}
	  },
	  
	  viewportSize: function() {
	    return { width: this.viewportWidth(), height: this.viewportHeight() };
	  },
	  
	   viewportScrollSize: function() {
	    return { width: this.viewportScrollWidth(), height: this.viewportScrollHeight() };
	  }
	};

}

var cmsAdministration = new AdministrationCore();
