var adminWig = {

	onPageId : "",
	editorShown : false,
	langId : 0,
	currentPageId : 0,
	currentContentId : 0,
	currentContentName : "",
	currentContentType : "",
	currentRev : 0,
	baseRev : 0,
	currentContent : "",
	maxRev : 0,
	overrideDataSource : false,
	hideClass : "hidden",
	bindSave : "",
	
	init : function(){
		//Setup AJAX
		$.ajaxSetup({ scriptCharset: "utf-8" ,contentType: "application/x-www-form-urlencoded; charset=UTF-8" });
		
		$('.edit-area-click').bind('click', this.applyEditClick);
		//Add button events
		$('#admin-close').bind('click', this.closeClick);
		$('#admin-save').bind('click', this.saveClick);
		$('#admin-savepublish').bind('click', this.savePublishClick);

		//Add event to inline editor
		$('#content-inline').bind('change keyup', this.updateTextboxContentOnChange);
	},

	overrideSource : function(val){
		adminWig.overrideDataSource = val;
	},

	overrideHideClass : function(val){
		adminWig.hideClass = val;
	},

	bindSaveCallback : function(val){
		adminWig.bindSave = val;
	},

	showHideEditor : function(show){
		var editorType = adminWig.currentContentType.toLowerCase();

		//If edit has been clicked whilst the window is still open... reset elements
		if(show == adminWig.editorShown){
			$('#content-inline').addClass(adminWig.hideClass);
			$('#content-block_parent').addClass(adminWig.hideClass);
		}

		if(show == true){
			$('#save_content').removeClass(adminWig.hideClass);
			$('#content-' + editorType).removeClass(adminWig.hideClass);

			//Wig editor automatically removes the content tag, and adds it's own, must deal with this seperately
			if(editorType == "inline"){
				$('#content-block_parent').addClass(adminWig.hideClass);
			}else{
				$('#content-block_parent').removeClass(adminWig.hideClass);
			}

			adminWig.editorShown = true;
		}else{
			$('#save_content').addClass(adminWig.hideClass);
			$('#content-' + editorType).addClass(adminWig.hideClass);

			adminWig.editorShown = false;
		}
	},

	applyEditClick : function(){
		//Set initial data from the page
		var ids_str = "";
		if(!adminWig.overrideDataSource){
			var ids = $(this).parent();
			ids_str = ids[0].id;
		}else{
			ids_str = adminWig.overrideDataSource;
		}

		if(ids_str == ""){
			alert("Cannot find editor area ID.");
			return false;
		}

		adminWig.onPageId = ids_str;
		var ids_split = ids_str.split("-");
		adminWig.currentPageId = ids_split[1];
		adminWig.currentContentId = ids_split[2];
		adminWig.langId = ids_split[3];
		adminWig.currentContentType = ids_split[4];
		adminWig.currentContentName = ids_split[5];

		adminWig.showHideEditor(true);

		//Get editor content
		adminWig.startLoader("Loading Editor");
		adminWig.getLatestRevision();
		adminWig.loadContent();
		adminWig.getAllRevisions();
		adminWig.stopLoader();

		return false;
	},

	loadContent : function(){
		$.ajax({
			url: "/admin/cms/regionedit?mode=showRev&pageid="+adminWig.currentPageId+"&id="+adminWig.currentContentId+"&rev="+
					adminWig.currentRev+"&lang_id="+adminWig.langId,
			type: 'get',
			success: function(t) {
				adminWig.currentContent = t;
				adminWig.setEditorContent();
			},
			error : function () {
				alert("Error with function loadContent. Trying again");
				adminWig.loadContent();
			},
			timeout : function () {
				alert("Timeout with function loadContent. Trying again");
				adminWig.loadContent();
			},
			async : false
		});
	},

	getAllRevisions : function () {
		if(adminWig.currentRev != 0 || adminWig.maxRev != 0){
			var html = "<p>Revison (";
			var maxToShow = 11;
			var halfMaxToShow = (maxToShow-1) / 2;
			var a;

			if(maxToShow > adminWig.maxRev){
				for(a = 1; a <= adminWig.maxRev; a++){
					if(adminWig.currentRev != a){
						html += " <a href='#' class='admin-change-rev'>" + a + "</a> ";
					}else{
						html += " " + a + " ";
					}
				}
			}else{
				//We have a lot more to show.

				var start = adminWig.currentRev - halfMaxToShow;
				var end = adminWig.currentRev + halfMaxToShow;

				//See if we can add to it.
				if((start - halfMaxToShow) <= 0){
					end += halfMaxToShow - start;
				}

				for(a = start; a < end; a++){
					if(a <= 0 || a > adminWig.maxRev){
						continue;
					}
					if(adminWig.currentRev != a){
						html += " <a href='#' class='admin-change-rev'>" + a + "</a> ";
					}else{
						html += " " + a + " ";
					}
				}
			}

			html += ")";

			html += "</p>";

			$('#admin-revisions').html(html);
			$('#admin-current-revision').html(adminWig.currentRev);

			//Add Event handlers
			$('.admin-change-rev').bind('click', adminWig.applyChangeRevisionClick);
		}else{
			$('#admin-revisions').html("");
			$('#admin-current-revision').html("");
		}
	},

	applyChangeRevisionClick : function(){
		adminWig.currentRev = parseInt($(this).html());

		adminWig.startLoader("Changing Revision");
		adminWig.loadContent();
		adminWig.getAllRevisions();
		adminWig.stopLoader();

		$('#' + adminWig.onPageId + " .edit-area-content").html(adminWig.getEditorContent());

		return false;
	},

	closeClick : function() {
		adminWig.showHideEditor(false);
		
		return false;
	},

	saveClick : function(){
		adminWig.startLoader("Saving");
		if(!adminWig.save()){
			adminWig.closeClick();
		}else{
			adminWig.getAllRevisions();
		}
		adminWig.stopLoader();

		if(adminWig.bindSave){
			adminWig.bindSave();
		}

		return false;
	},

	savePublishClick : function(){
		adminWig.startLoader("Saving and Publishing");
		adminWig.save();
		adminWig.publish();
		adminWig.stopLoader();
		adminWig.closeClick();

		if(adminWig.bindSave){
			adminWig.bindSave();
		}

		return false;
	},

	getLatestRevision : function(){
		$.ajax({
			url: "/admin/cms/regionedit?mode=getCurrentRev&pageid="+adminWig.currentPageId+"&id="+adminWig.currentContentId+"&lang_id="+adminWig.langId,
			type: 'get',
			success : function(t) {
				var currentRev = t;
				var revData = currentRev.split("|");
				adminWig.currentRev = parseInt(revData[0]);
				adminWig.baseRev = revData[0];
				adminWig.maxRev = revData[1];
			},
			error : function () {
				alert("Error with function getLatestRevision. Trying again");
				adminWig.getLatestRevision();
			},
			timeout : function () {
				alert("Timeout with function getLatestRevision. Trying again");
				adminWig.getLatestRevision();
			},
			async : false
		});
	},

	save : function(){
		var editorContent = adminWig.getEditorContent();
		if(adminWig.currentContent == editorContent){
			return false;
		}else{
			adminWig.currentContent = editorContent;
		}

		var i = Math.round(100000*Math.random());
		var pars = '&text-area=';
		if(encodeURIComponent){
			pars += encodeURIComponent(editorContent);
		}else{
			alert("Your browser doesn't support encodeURIComponent. Non standard chars may encode incorrectly");
			pars += escape(editorContent);
		}
		pars += '&val' + i;

		$.ajax({
			url: "/admin/cms/regionedit?mode=save&pageid="+adminWig.currentPageId+"&id="+adminWig.currentContentId + "&name="+adminWig.currentContentName
					+"&lang_id="+adminWig.langId,
			type: 'post',
			data: pars,
			success : function(t) {
				var currentRev = t;
				var revData = currentRev.split("|");
				var newId = parseInt(revData[0]);
				adminWig.maxRev = parseInt(revData[1]);
				adminWig.currentRev = parseInt(revData[1]);
				if(adminWig.currentContentId == ""){
					//Id wasn't set, update the HTML
					$('#content-'+adminWig.currentPageId+'--'+adminWig.currentContentType+'-'+adminWig.currentContentName).attr("id",
						'content-'+adminWig.currentPageId+'-'+newId+'-'+adminWig.currentContentType+'-'+adminWig.currentContentName);
				}

				adminWig.currentContentId = newId;
			},
			error : function () {
				alert("Error with function save. Trying again");
				adminWig.save();
			},
			timeout : function () {
				alert("Timeout with function save. Trying again");
				adminWig.save();
			},
			async : false
		});
		return true;
	},

	publish : function(){
		$.ajax({
			url: "/admin/cms/regionedit?mode=publishRev&pageid="+adminWig.currentPageId+"&id="+adminWig.currentContentId + "&rev="+adminWig.currentRev+
					"&lang_id="+adminWig.langId,
			type: 'get',
			error : function () {
				alert("Error with function publish. Trying again");
				adminWig.save();
			},
			timeout : function () {
				alert("Timeout with function publish. Trying again");
				adminWig.save();
			},
			async : false
		});

	},

	getEditorContent : function(){
		if(adminWig.currentContentType == "INLINE"){
			return $('#content-inline').val();
		}else if(adminWig.currentContentType == "BLOCK"){
			return tinyMCE.activeEditor.getContent();
		}else{
			alert("Unspported content type " + adminWig.currentContentType);
		}
		return false;
	},

	setEditorContent : function(){
		if(adminWig.currentContentType == "INLINE"){
			$('#content-inline').val(adminWig.currentContent);
		}else if(adminWig.currentContentType == "BLOCK"){
			tinyMCE.activeEditor.setContent(adminWig.currentContent);
		}else{
			alert("Unspported content type " + adminWig.currentContentType);
		}
		return false;
		
	},

	updateContentEvent : function(t){
		if(t.type == "keyup"){
			$('#' + adminWig.onPageId + " .edit-area-content").html(tinyMCE.activeEditor.getContent());
		}
		return true;
	},

	updateContentOnChange : function(t){
		$('#' + adminWig.onPageId + " .edit-area-content").html(t.getBody().innerHTML);
	},

	updateTextboxContentOnChange : function(){
		$('#' + adminWig.onPageId + " .edit-area-content").html($(this).val());
	},

	startLoader : function(msg){
		$('#admin-loader').html("<p>"+msg+"</p>");
		$('#admin-loader').removeClass(adminWig.hideClass);
	},

	stopLoader : function(){
		$('#admin-loader').addClass(adminWig.hideClass);
	}

}
