var URL_SOAP_TOOLBOX = "/cms/controller/services/toolbox.asmx";
var URL_SOAP_SAVE = "/cms/model/services/save.asmx"

var trueStr = 'True'; /* Needs to be equal to .Net true.ToString() */
var falseStr = 'False';

var originalEdit, originalOnClick, originalClass, originalHtml;
var liveField, liveTable, liveKeyVal, liveCulture;

var COOKIE_DEFAULT_CULTURE = "CK_DEFAULT_CULTURE";

if (window.$)
{
	$(document).ready(function() {
		/*
		var shortCulture = getBrowserCulture().substr(0, 2);
		var defaultCulture = getCookie(COOKIE_DEFAULT_CULTURE);
		var confirmRedirect = false;
		if (!defaultCulture)
		{
			defaultCulture = shortCulture;
			confirmRedirect = true; // Never been asked.
		}

		var shortBoardCulture = board_culture.substr(0, 2);
		setCookie(COOKIE_DEFAULT_CULTURE, shortBoardCulture);
		if (defaultCulture != shortBoardCulture)
		{
			// Find the culture that matches the browser.
			var i = 0;
			while (SBCultures[i][0].substr(0, 2) != defaultCulture) 
			{
				i++;
			}
			var currentCulture = SBCultures[i][0].substr(0, 2);
			
			// Ask the user to redirect to it.
			var confirmed = true;
			if ((i < SBCultures.length) && (!confirmRedirect || (confirmed = confirm(SBCultures[i][1]))))
			{
				setCookie(COOKIE_DEFAULT_CULTURE, currentCulture);
				//document.location = getMirrorUrl(SBCultures[i][0]);
			}
		}
		*/
		bodyLoader();
	});
}

function getMirrorUrl(currentCulture)
{
	var redirectUrl = "/";
	if (window.mirrorUrls)
	{
		var i = 0;
		while ((i < mirrorUrls.length) && (mirrorUrls[i][0] != currentCulture.substr(0, 2)))
		{
			i++;
		}
		if (i < mirrorUrls.length)
		{
			redirectUrl = mirrorUrls[i][1];
		}
	}
	
	return redirectUrl;
}

function getBrowserCulture()
{
	return (navigator["language"])?navigator["language"]:navigator["userLanguage"];
}


function editLivePage(sender, field, table, keyVal, culture)
{
	liveField = field;
	liveTable = table;
	liveKeyVal = keyVal;
	liveCulture = culture;

	alert(SBPhrases["EDIT_MODE"]); 
	if(document.addEventListener)
	{
		document.addEventListener("keyup",keyCapt,false);
	}
	else
	{
		document.attachEvent("onkeyup",keyCapt);
	} 

	originalClass = sender.className;
	originalOnClick = sender.ondblclick;
	originalHtml = sender.innerHTML;
	originalEdit = sender;
	originalEdit.className = "sbLiveEdit";
	sender.contentEditable = true;
	document.designMode = 'on';
	originalEdit.focus();
}
function keyCapt(e)
{
	if (window.event)
	{
		e = window.event;
	}
	var codeS = 83;
	var codeQ = 81;
	var codeB = 66;
	var codeI = 73;
	var codeEscape = 27;

	if (e.ctrlKey && e.altKey)
	{
		if ((e.keyCode == codeS) || (e.keyCode == codeQ))
		{
			if (e.keyCode == codeS)
			{
				var pl = new SOAPClientParameters();
				pl.add("TableName", liveTable);
				pl.add("FieldName", liveField);
				pl.add("FieldValue", originalEdit.innerHTML);
				pl.add("KeyValue", liveKeyVal);
				pl.add("CultureKey", liveCulture);
				SOAPClient.invoke(URL_SOAP_SAVE, "SaveField", pl, true, SaveField_CallBack);
			}
			else
			{
				editLivePageStop();
			}
		}
/*
		else
		{
			if (e.keyCode == codeB)
			{
				format_sel("b")
			}
			else if (e.keyCode == codeI)
			{
				format_sel("i")
			}
			//alert(e.keyCode);
		}
*/
	}
	else if (e.keyCode == codeEscape)
	{
		editLivePageStop();
		originalEdit.innerHTML = originalHtml;
	}
}

function editLivePageStop()
{
	originalEdit.contentEditable = false;
	document.designMode = 'off';
	originalEdit.className = originalClass;
	originalEdit.ondblclick = originalOnClick;
	if(document.removeEventListener)
	{
		document.removeEventListener("keyup", keyCapt, false);
	}
	else
	{
		document.detachEvent("onkeyup", keyCapt);
	}
	
}

function SaveField_CallBack(data)
{
	if (isNaN(data))
	{
		alert(data.toSource());
	}
	else
	{
		alert(SBPhrases["SAVED"]);
		editLivePageStop();
	}
}

//http://www.oreillynet.com/pub/a/javascript/2001/12/21/js_toolbar.html
/*
just plan doesn't work and sick of trying
function format_sel(v) 
{
	var sel = document.selection;
	if (!sel)
	{
		sel = window.getSelection();
	}
	var range;
	if (sel.createRange)
	{
		range = sel.createRange();
	}
	else
	{
		range = sel.getRangeAt(0);
	}

childNodes.startContainer.textContent = "<" + v + ">" + range.startContainer.textContent + "</" + v + ">";

alert(typeof(range))
	var str = range.text;
	alert(str);
	range.text = "<" + v + ">" + str + "</" + v + ">";
//alert(sel);
  return;
}
*/
function shortCulture(Culture)
{
	if (!Culture)
	{
		Culture = board_culture;
	}
	return Culture.substr(0, 2);
}

function getMailFormFieldCaption(input)
{
	var genericName = "field_";
	var name = "";
	if (input.name.substring(0, genericName.length) == genericName)
	{
		var captionField = document.getElementById(input.id + "_caption");
		if (captionField)
		{
			name = captionField.innerHTML;
		}
	}
	
	if (name == "")
	{
		return input.name.replace(/_/g, ' ');
	}
	else
	{
		return name;
	}
}

var lastSender;
function ajaxMailTo(sender, recipientFunction)
{
	var form = sender;
	var msg = "", name, lastname;
	var cancelled = false;
	while ((msg == "") && (form.parentNode) && (!cancelled))
	{
		form = form.parentNode;
		var inputs = form.getElementsByTagName("INPUT");
		var selects = form.getElementsByTagName("SELECT");
		var textareas = form.getElementsByTagName("TEXTAREA");

		var requiredFields = "";
		for (var i = 0; i < inputs.length; i++)
		{
			if ((inputs[i].type != "button") && (inputs[i].name != "__VIEWSTATE") && (((inputs[i].type != "radio") && (inputs[i].type != "checkbox")) || (inputs[i].checked)))
			{
				lastname = name;
				name = getMailFormFieldCaption(inputs[i]);
				if (inputs[i].value)
				{
					if (lastname != name)
					{ 
						msg += "\n" + name + ": ";
					}
					else
					{
						msg += ", ";
					}
					msg += inputs[i].value;
				}
				if ((inputs[i].getAttribute("required")) && (inputs[i].getAttribute("required").toLowerCase() == "yes") && ((inputs[i].value == "") || (inputs[i].value == inputs[i].defaultValue)))
				{
					requiredFields += String.format(SBPhrases["REQUIRED_FIELD"], name) + "\n";
					inputs[i].focus();
					cancelled = true; /* breaks loop. */
				}
			} 
		}
		
		for (var i = 0; i < selects.length; i++)
		{
			var selections = "";
			var multipleSelections = false;
			for (j = 0; j < selects[i].options.length; j++)
			{
				if (selects[i].options[j].selected)
				{
					if (selections != "")
					{
						selections += "\n\t";
						multipleSelections = true;
					}
					selections += selects[i].options[j].text;
				}
			}
			var breaker = "";
			if (multipleSelections)
			{
				breaker = "\n\t";
			}
			name = getMailFormFieldCaption(selects[i]);
			if ((selects[i].getAttribute("required")) && (selects[i].getAttribute("required").toLowerCase() == "yes") && (selections == ""))
			{
				requiredFields += String.format(SBPhrases["REQUIRED_FIELD"], name) + "\n";
			}
			msg += "\n" + name + ": " + breaker + selections;
		}
		
		for (var i = 0; i < textareas.length; i++)
		{
			name = getMailFormFieldCaption(textareas[i]);
			msg += "\n" + name + ":\n" + textareas[i].value; 
			if ((textareas[i].getAttribute("required") == "yes") && (textareas[i].value == ""))
			{
				requiredFields += String.format(SBPhrases["REQUIRED_FIELD"], name) + "\n";
				textareas[i].focus();
			}
		}
	}

	if (requiredFields)
	{
		alert(requiredFields);
	}

	if (!cancelled)
	{
		if (!recipientFunction)
		{
			recipientFunction = "SendEmail";
		}

		var pl = new SOAPClientParameters();
		pl.add("message", msg);
		//alert(msg);
		lastSender = sender;
		SOAPClient.invoke(URL_SOAP_TOOLBOX, recipientFunction, pl, true, ajaxMailTo_CallBack);
		sender.disabled = true;
	}	
}

function ajaxMailTo_CallBack(data)
{
	if (data)
	{
		alert(data.toSource());
	}
	else
	{
		alert(SBPhrases["MAIL_SENT"]);
	}
	if (lastSender)
	{
		lastSender.disabled = false;
	}
}

var dropDowns;
function bodyLoader()
{
	dropDowns = document.getElementsByTagName("SELECT");
	for (var i = 0; i < dropDowns.length; i++)
	{
		var pl = new SOAPClientParameters();
		if (dropDowns[i].name.substring(0, 3) == "lst")
		{
			pl.add("dropName", dropDowns[i].name);
			pl.add("dropIndex", i);
			SOAPClient.invoke(URL_SOAP_TOOLBOX, "FillDrop", pl, true, fillDrop_CallBack);
		}
	}
}

function fillDrop_CallBack(data)
{
	if (data)
	{
		if (data.split)
		{
			var lines = data.split("\n");
			var drp = dropDowns[parseInt(lines[0])];
			drp.name = lines[1];
			if (drp.options.length == 0)
			{
				for (var i = 2; i < lines.length; i++)
				{
					if (lines[i] != "")
					{
						var item = lines[i].split("|");
						drp.options[drp.options.length] = new Option(item[1], item[0]);
					}
				}
			}
		}
		else
		{
			alert("Error: " + data.toSource());
		}
	}
}

function GetCreatedTimestamp()
{
	var pl = new SOAPClientParameters();
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "GetCreatedTimestamp", pl, true, GetCreatedTimestamp_CallBack);
}

function DumpSpringBoard()
{
	var pl = new SOAPClientParameters();
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "DumpSpringBoard", pl, true, GetCreatedTimestamp_CallBack);
}

function GetCreatedTimestamp_CallBack(data)
{
	document.getElementById('divStarted').innerHTML = data;
}
function ClearLog()
{
	var pl = new SOAPClientParameters();
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "ClearLog", pl, true, ClearLog_CallBack);
}
function ClearLog_CallBack(data)
{
	if (data)
	{
		jAlert(data.toSource());
	}
	else
	{
		ReloadLog();
	}
}

function ReloadLog()
{
	document.getElementById('frmLog').contentWindow.location.reload(true);
}

function setCookie(name, Value, Days)
{
	if (!Days) 
	{
		Days = 365;
	}
	var endDate = new Date();
	endDate.setTime(endDate.getTime() + Days * 24 * 60 * 60 * 1000);
	document.cookie = String.format("{0}={1}; expires={2}; path=/;", name, escape(Value), endDate.toGMTString());
}
function getCookie(Name, defaultValue)
{
	var returnValue = getCookieRaw(Name);
	if (!returnValue)
	{
		returnValue = defaultValue;
	}
	return returnValue
}
function getCookieRaw(Name)
{
	var cookieName = Name + "=";
	var cookieLength = document.cookie.length;
	var cookieStart = 0;
	while (cookieStart < cookieLength)
	{
		var variableStart = cookieStart + cookieName.length;

		if (document.cookie.substring(cookieStart, variableStart) == cookieName)
		{
			var variableEnd = document.cookie.indexOf (";", variableStart);
			if (variableEnd == -1)
			{
				variableEnd = cookieLength;
			}
			var returnValue = unescape(document.cookie.substring(variableStart, variableEnd));
			if (returnValue == "null")
			{
				returnValue = null;
			}
			return returnValue;
		}

		cookieStart = document.cookie.indexOf(" ", cookieStart) + 1;

		if (cookieStart == 0)
		{
			break;
		}
	}
}

function getBrowserCulture()
{
	return (navigator["language"])?navigator["language"]:navigator["userLanguage"];
}


SpringBoard = {};

SpringBoard.Security = function() { };

SpringBoard.Security.prototype.UserLogin = function (UserName, Password, UserLogin_CallBack) {
	var pl = new SOAPClientParameters();
	pl.add("UserName", UserName);
	pl.add("Password", Password);
	pl.add("SiteKey", board_site_key);
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "UserLogin", pl, true, UserLogin_CallBack);
}

SpringBoard.Security.prototype.UserLogout = function(UserLogout_CallBack)
{
	var pl = new SOAPClientParameters();
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "UserLogout", pl, true, UserLogout_CallBack);
}

SpringBoard.Security.prototype.UserLoginFacebook = function(CallBack)
{
	if (!CallBack)
	{
		CallBack = UserLoginFacebook_CallBack;
	}
	var pl = new SOAPClientParameters();
	//alert(SBPhrases["FACEBOOK_BUNDLEID"]);
	pl.add("bundleId", SBPhrases["FACEBOOK_BUNDLEID"])
	pl.add("SiteKey", board_site_key);
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "UserLoginFacebook", pl, true, CallBack);
}

SpringBoard.Security.prototype.UserLoginFacebook_CallBack = function(data)
{
	if (data.toString().toLowerCase() != trueStr.toLowerCase())
	{
		alert(SBPhrases["FACEBOOK_LOGINFAILED"] + "\r\n" + data.toSource());
	}
	else
	{
		window.location.reload();		
	}
}

SpringBoard.Security.prototype.SendPasswordReminder = function()
{
	var pl = new SOAPClientParameters();
	pl.add("CultureCode", board_culture);
	pl.add("Email", document.getElementById('txtEmail').value);
	SOAPClient.invoke(URL_SOAP_TOOLBOX, "SendPasswordReminder", pl, true, this.SendPasswordReminder_CallBack);
}

SpringBoard.Security.prototype.SendPasswordReminder_CallBack = function(data)
{
	var msg = SBPhrases["PWD_SENT"];
	if (data)
	{
		msg = data.toSource();
	}
	var divReminder = document.getElementById('divReminder');
	if (divReminder)
	{
		divReminder.innerHTML = msg;
	}
	else
	{
		alert(msg);
	}
}

SpringBoard.Security.prototype.ResetPassword = function()
{
	var newPassword = document.getElementById("txtPassword").value;
	if (newPassword != document.getElementById("txtPasswordConfirm").value)
	{
		alert(SBPhrases["PWD_NOMATCH"]);
	}
	else
	{
		var tokenParam = "token=";
		var token = document.location.toString().substr(document.location.toString().indexOf(tokenParam) + tokenParam.length);
		var pl = new SOAPClientParameters();
		pl.add("CultureCode", board_culture);
		pl.add("Token", token);
		pl.add("Password", newPassword);
		SOAPClient.invoke(URL_SOAP_TOOLBOX, "ResetPassword", pl, true, this.ResetPassword_CallBack);
	}
}

SpringBoard.Security.prototype.ResetPassword_CallBack = function(data)
{
	var msg = SBPhrases["PWD_CHANGED"];
	if (data)
	{
		msg = data.toSource();
	}
	alert(msg);
}

var Security = new SpringBoard.Security();

// FROM: http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml
function loadjscssfile(filename, filetype)
{
	var isJavascript = (filetype == "js");
	var isCss = (filetype == "css");
	var fileref = null;
	if (isJavascript) //if filename is a external JavaScript file
	{
		fileref = document.createElement('script')
		fileref.setAttribute("type","text/javascript")
		fileref.setAttribute("src", filename)
	}
	else if (isCss) //if filename is an external CSS file
	{ 
		fileref = document.createElement("link")
		fileref.setAttribute("rel", "stylesheet")
		fileref.setAttribute("type", "text/css")
		fileref.setAttribute("href", filename)
	}
	if (fileref)
	{
		var head = document.getElementsByTagName("head")[0];
		var duplicate = false;
		for (var i = 0; i < head.childNodes.length; i++)
		{
			if (head.childNodes[i].tagName == fileref.tagName)
			{
				var regexStr = filename + "$";
				var regex = new RegExp(regexStr);
				if (isJavascript && (head.childNodes[i].src.match(regex)))
				{
					duplicate = true;
				}
				else if (isCss && (head.childNodes[i].href == filename))
				{
					duplicate = true;
				}
			}
		}
		if (!duplicate)
		{
			head.appendChild(fileref);
		}
	}
}


// FROM: http://www.west-wind.com/weblog/posts/509108.aspx BASED ON:
// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
var _tmplCache = {}
this.parseTemplate = function(str, data) {
    /// <summary>
    /// Client side template parser that uses &lt;#= #&gt; and &lt;# code #&gt; expressions.
    /// and # # code blocks for template expansion.
    /// NOTE: chokes on single quotes in the document in some situations
    ///       use &amp;rsquo; for literals in text and avoid any single quote
    ///       attribute delimiters.
    /// </summary>    
    /// <param name="str" type="string">The text of the template to expand</param>    
    /// <param name="data" type="var">
    /// Any data that is to be merged. Pass an object and
    /// that object's properties are visible as variables.
    /// </param>    
    /// <returns type="string" />  
    var err = "";
    try {
        var func = _tmplCache[str];
        if (!func) {
            var strFunc =
            "var p=[],print=function(){p.push.apply(p,arguments);};" +
                        "with(obj){p.push('" +
            //                        str
            //                  .replace(/[\r\t\n]/g, " ")
            //                  .split("<#").join("\t")
            //                  .replace(/((^|#>)[^\t]*)'/g, "$1\r")
            //                  .replace(/\t=(.*?)#>/g, "',$1,'")
            //                  .split("\t").join("');")
            //                  .split("#>").join("p.push('")
            //                  .split("\r").join("\\'") + "');}return p.join('');";

            str.replace(/[\r\t\n]/g, " ")
               .replace(/'(?=[^#]*#>)/g, "\t")
               .split("'").join("\\'")
               .split("\t").join("'")
               .replace(/<#=(.+?)#>/g, "',$1,'")
               .split("<#").join("');")
               .split("#>").join("p.push('")
               + "');}return p.join('');";

            //alert(strFunc);
            func = new Function("obj", strFunc);
            _tmplCache[str] = func;
        }
        return func(data);
    } catch (e) { err = e.message; }
    return "< # ERROR: " + err + " # >";
}

