﻿/****************************************
	Constants
****************************************/
var ASYNCMODE_MOVENUKEMODULE = "MOVE";
var ASYNCMODE_TOGGLEACTIVENUKEMODULE = "TOGGLEACTIVE";
var ASYNCMODE_DELETENUKEMODULE = "DELETE";
var ASYNCMODE_ADDNUKEMODULE = "ADD";

var HIGHLIGHTMODE_ADD = "ADD";
var HIGHLIGHTMODE_MOVE = "MOVE";

/****************************************
	Global Veriables
****************************************/
var g_NukeModuleEdit_strHighlightMode = "";


$(document).ready(function() {
	/****************************************
	Drag and Drop Global Variables
	****************************************/
	var intMovedNukeModuleID = 0;
	var strPage = "";
	var strNukeModuleActionMode = "";
	var strNewNukeModuleType = "";

	var strRawSourcePaneID;
	var strSourcePane = "";
	var intSourceSortOrder = 0;
	var strRawDestPaneID;
	var strDestPane = "";
	var intDestSortOrder = 0;

	var strHighlightPaneID = "";

	/*****************************************
	Drag and Drop
	*****************************************/
	$(".ContentPaneEditMode").sortable({
		connectWith: $(".ContentPaneEditMode"),

		handle: ".MoveHandle",

		tolerance: "pointer",

		helper: "clone",

		start: function(event, ui) {
			// Set drop target highlight mode to move
			if(g_NukeModuleEdit_strHighlightMode == "") {
				g_NukeModuleEdit_strHighlightMode = HIGHLIGHTMODE_MOVE;
			}

			// Set moved element id
			intMovedNukeModuleID = ui.item.attr("id");
			intMovedNukeModuleID = intMovedNukeModuleID.replace("Draggable_", "");

			// Set source pane side ID
			strRawSourcePaneID = $(this).attr("id");
			strSourcePane = parsePaneID(strRawSourcePaneID);

			// Set source sort order
			intSourceSortOrder = getSortOrder($(this).sortable("serialize"), intMovedNukeModuleID);
		},

		over: function(event, ui) {
			if(g_NukeModuleEdit_strHighlightMode != HIGHLIGHTMODE_MOVE) return;

			if(strHighlightPaneID != "") {
				$("#" + strHighlightPaneID).removeClass("DropZoneActive");
			}

			strHighlightPaneID = $(this).attr("id");
			$("#" + strHighlightPaneID).addClass("DropZoneActive");
		},

		receive: function(event, ui) {
			// Set source pane side ID
			strRawDestPaneID = $(this).attr("id");
			strDestPane = parsePaneID(strRawDestPaneID);

			var strReceivedID = ui.item.attr("id")

			// Set dest sort order
			if(strReceivedID.indexOf("Draggable_NewModule") == 0) {
				// Add new module
				strNukeModuleActionMode = ASYNCMODE_ADDNUKEMODULE
				strNewNukeModuleType = strReceivedID.replace("Draggable_NewModule", "");
				intDestSortOrder = getSortOrder($(this).sortable("serialize"), "NewModule" + strNewNukeModuleType);

				strPage = getPage();

				var dctRequestData = {in_strData: "mode=" + ASYNCMODE_ADDNUKEMODULE + "&nuke_module_type=" + strNewNukeModuleType + "&dest_page=" + strPage + "&dest_pane=" + strDestPane + "&dest_sort_order=" + intDestSortOrder};
				handleNukeModuleAsync(dctRequestData);
			}
			else
			{
				strNukeModuleActionMode = ASYNCMODE_MOVENUKEMODULE
				intDestSortOrder = getSortOrder($(this).sortable("serialize"), intMovedNukeModuleID);
			}
		},

		stop: function(event, ui) {
			if(strNukeModuleActionMode == ASYNCMODE_ADDNUKEMODULE) {
				return;
			}

			// Remove highlighted drop target, if any. Reset highlight mode.
			if(strHighlightPaneID != "") {
				$("#" + strHighlightPaneID).removeClass("DropZoneActive");
			}
			g_NukeModuleEdit_strHighlightMode = "" ;

			// Set page
			strPage = getPage();

			// Set dest pane and sort order if moved within same pane
			if(strDestPane == "") {
				strDestPane = strSourcePane
				intDestSortOrder = getSortOrder($(this).sortable("serialize"), intMovedNukeModuleID);
			}

			// Error checking
			if(strPage == "" || strSourcePane == "" || intSourceSortOrder == null || strDestPane == "" || intDestSortOrder == null) {
				return;
			}
			// Not moved
			if((strSourcePane == strDestPane) && (intSourceSortOrder == intDestSortOrder)) {
				return
			}

			// AJAX request
			var dctRequestData = {in_strData: "mode=" + ASYNCMODE_MOVENUKEMODULE + "&nuke_module_id=" + intMovedNukeModuleID + "&source_page=" + strPage + "&source_pane=" + strSourcePane + "&source_sort_order=" + intSourceSortOrder + "&dest_page=" + strPage + "&dest_pane=" + strDestPane + "&dest_sort_order=" + intDestSortOrder};
			handleNukeModuleAsync(dctRequestData);

			// Prevent moved module from doing postback
			swapAspPostback(strRawSourcePaneID);
			swapAspPostback(strRawDestPaneID);
		}
	});

	// Tool bar in edit mode
	var objEditClass = $(".ContentPaneEditMode");
	if (objEditClass.length) {
		// Show add modules widget
		addModuleWidget();
	}

	// Tool bar in dynamic mode
	var objDynamicClass = $(".DynamicWidget");
	if (objDynamicClass.length) {
		dynamicWidgetsPanel();
	}

	// Generically hide special classes marked as HideOnInit
	$(".HideOnInit").hide();

	// Show as accordion
	showAccordion(".AddModule", ".AddModuleLabel");
});

// Utility functions
function addToolTip(obj) {
	$(obj).find('a').tooltip({
		effect: 'slide',
		onShow: function () {
			tooltip = this.getTip();
		}
	});
}

function addModuleWidget() {
	var addModule = $(".AddModule");
	var strHighlightPaneID = "";

	if (addModule.length) {
		$(".AddModule .AddModuleDraggable").css("cursor", "move");

		$(".AddModule .AddModuleDraggable").draggable({
			connectToSortable: ".ContentPaneEditMode",

			tolerance: "pointer",

			opacity: 0.7,

			revert: "invalid",

			start: function (event, ui) {
				// set drop target highlight mode to add
				if(g_NukeModuleEdit_strHighlightMode == "") {
					g_NukeModuleEdit_strHighlightMode = HIGHLIGHTMODE_ADD;
				}
			},

			stop: function (event, ui) {
				// Remove highlighted drop target, if any. Reset highlight mode.
				if(strHighlightPaneID != "") {
					$("#" + strHighlightPaneID).removeClass("DropZoneActive");
				}
				g_NukeModuleEdit_strHighlightMode = "" ;
			},

			helper: "clone"
		});


		$(".ContentPaneEditMode").droppable({
			over: function(event, ui) {
				if(g_NukeModuleEdit_strHighlightMode != HIGHLIGHTMODE_ADD) return;

				if(strHighlightPaneID != "") {
					$("#" + strHighlightPaneID).removeClass("DropZoneActive");
				}

				strHighlightPaneID = $(this).attr("id");
				$("#" + strHighlightPaneID).addClass("DropZoneActive");
			}
		});
	}
}

function swapAspPostback(in_strPaneID){
	if(in_strPaneID == null) return;
	if(in_strPaneID == "") return;

	var strRawHtml = $("#" + in_strPaneID).html();

	strRawHtml = strRawHtml.replace("/__doPostBack/g", "handleAspPostback");
	$("#" + in_strPaneID).html(strRawHtml);
}

function handleAspPostback(in_strEventTarget, in_strEventArgument) {
	$("body").append("<div id='HandleAspPostback_RefreshDialog'>Refreshing</div>");
	$("#HandleAspPostback_RefreshDialog").dialog({
		modal: true,
		show: "fade",
		position: "center",
		minWidth: 600,
		minHeight: 60,
		dialogClass: "RefreshPageDialog",
		closeText: ""
	});

	setTimeout("window.location = window.location", 700);
}

function toggleActiveNukeModule(in_intNukeModuleID, in_strToggleFromID, in_strToggleToID) {
	var dctRequestData = {in_strData: "mode=" + ASYNCMODE_TOGGLEACTIVENUKEMODULE + "&nuke_module_id=" + in_intNukeModuleID};
	handleNukeModuleAsync(dctRequestData);

	$("#" + in_strToggleFromID).fadeOut("200", function() {
		$("#" + in_strToggleToID).fadeIn("200");
	});
}

function deleteNukeModule(in_intNukeModuleID) {
	if (!confirm("Are you sure you want to delete this module?")) {
		return false;
	}

	// Due to caching, we always remove it from dom on client first.
	// If removal failed on server afterwards, a refresh would re-sync up.
	$("#Draggable_" + in_intNukeModuleID).remove();

	var dctRequestData = {in_strData: "mode=" + ASYNCMODE_DELETENUKEMODULE + "&nuke_module_id=" + in_intNukeModuleID};
	handleNukeModuleAsync(dctRequestData);
}

function handleNukeModuleAsync(in_dctRequestData) {
	$.ajax ({
		url: "Callback.asmx/HandleNukeModuleAsync",
		data: in_dctRequestData,
		success: function(objXml) {
			var blnSuccess = $(objXml).find("Success").text();
			var strNeedRefresh = $(objXml).find("NeedRefresh").text();
			var strMessage = $(objXml).find("Message").text();

			var strAlertMessage = "";

			if(!blnSuccess) {
				strAlertMessage += "The operation failed.";
			}
			if(strMessage.length > 0) {
				strAlertMessage += " " + strMessage;
			}

			if(strAlertMessage.length > 0) {
				alert(strAlertMessage);
			}

			if(strNeedRefresh != "false") {
				// $("body").append('<div class="AjaxWaitSign"></div>');
				location.reload();
			}
		}
	})
}

function getPage() {
	var strReturn;
	var strRawPath = window.location.pathname;

	// Get page name
	strReturn = strRawPath.substring(strRawPath.lastIndexOf("/") +1);

	// If it's custom page, get custom page id preset by rendering code
	if(strReturn.toLowerCase() == "c.aspx") {
		strReturn = ($("#CustomPageID").attr("value"));
	}

	return strReturn
}

function parsePaneID(in_strRawID) {
	return in_strRawID.substring(in_strRawID.lastIndexOf("_") + 1);
}

function getSortOrder(in_strSerializedOrder, in_intFindID){
	var arySerializedOrder = in_strSerializedOrder.split("&");
	var i = 0;
	var intID = 0;

	for (i in arySerializedOrder) {
		intID = arySerializedOrder[i];
		intID = intID.replace("Draggable[]=", "");
		if(intID == in_intFindID) {
			break;
		}
	}

	return i;
}

function getUrlParam(in_strUrl, in_strKey) {
	// Default
	var strValue = "";

	// Short circuit if url empty
	if(in_strUrl.length == 0) {
		return strValue;
	}

	// Short circuit if no param
	var aryUrlComponents = in_strUrl.split("?");
	if(aryUrlComponents.length < 2) {
		return strValue;
	}

	// Split params into an array, loop through each
	// Return value if key found.
	var aryParams = aryUrlComponents[1].split("&");
	var i = 0;
	var aryKeyValue;
	for(i=0; i<aryParams.length; i++) {
		aryKeyValue = aryParams[i].split("=");
		if(aryKeyValue.length < 1) {
			break;
		}
		// aryKeyValue[0] is the key, aryKeyValue[1] is the value
		if(aryKeyValue[0] == in_strKey) {
			return aryKeyValue[1];
		}
	}

	// Not found, return default
	return strValue;
}

function combineUrl(in_strUrl1, in_strUrl2) {
	var strUrl1Normalized = "";
	var strUrl2Normalized = "";

	// Get url1 without ending "/"
	strUrl1Normalized = in_strUrl1;
	if(strUrl1Normalized.length > 0) {
		if(strUrl1Normalized.charAt(strUrl1Normalized.length - 1) == "/") {
			strUrl1Normalized = strUrl1Normalized.substring(0, strUrl1Normalized.length - 1);
		}
	}

	// Get url1 without leading "/"
	strUrl2Normalized = in_strUrl2;
	if(strUrl2Normalized.length > 0) {
		if(strUrl2Normalized.charAt(0) == "/") {
			strUrl2Normalized = strUrl2Normalized.substring(1);
		}
	}

	return strUrl1Normalized + "/" + strUrl2Normalized;
}


function handleNukeFormBuilderAsync(in_strGuid, in_strLayoutData) {
	$.ajax ({
		url: "Callback.asmx/HandleNukeFormBuilderAsync",
		data: {in_strData: "guid=" + in_strGuid + "&layout_data=" + in_strLayoutData},
		success: function(objXml) {
			var blnSuccess = $(objXml).find("Success").text();
			var strNeedRefresh = $(objXml).find("NeedRefresh").text();
			var strMessage = $(objXml).find("Message").text();

			var strAlertMessage = "";

			if(!blnSuccess) {
				strAlertMessage += "The operation failed.";
			}
			if(strMessage.length > 0) {
				strAlertMessage += " " + strMessage;
			}

			if(strAlertMessage.length > 0) {
				alert(strAlertMessage);
			}

			if(strNeedRefresh != "false") {
				// $("body").append('<div class="AjaxWaitSign"></div>');
				location.reload();
			}
		}
	})
}
