﻿
var NoImagePath = "Images/common/NoImage.png";
var DefaultProfileThumbnail = "images/common/DefaultProfileThumb.png";

function Error(message)
{
	alert(message);
	//throw message;
}

function GetQueryString(url)
{
    if (url == null)
    {
        url = location.href;
    }

    var queryString = new Array();
    var urlTokens = url.split("?");

    if (urlTokens.length > 1)
    {
        var query = urlTokens[1];

        var queryParams = query.split("&");

        for (var i = 0; i < queryParams.length; i++)
        {
            var key = queryParams[i].split("=")[0];
            var value = queryParams[i].split("=")[1];

            queryString[key] = value.replace("#", "");
        }
    }

    return queryString;
}

var QueryString = GetQueryString(location.href);

window.QueryString = QueryString;

CommonServiceResults = new Object();
CommonServiceResults.GeneralError = "GeneralError";
CommonServiceResults.ApiError = "ApiError";
CommonServiceResults.Success = "Success";
CommonServiceResults.InsufficientPrivileges = "InsufficientPrivileges";

function HandleCommonResults(response)
{
    if (response == null)
    {
        Error("Got a null response.");
    }

    if (response.Result == CommonServiceResults.GeneralError)
    {
    	Error("A general error has occured.");
    	Error(response.ErrorMessage);

        return true;
    }
    else if (response.Result == CommonServiceResults.ApiError)
    {
    	if (response.ApiError == "This service requires an authenticated client session to be used.")
    	{
    		ExpireSession();
    		top.location.href = "login.htm";
    	}
    	else
    	{
    		Error("An API error has occured.");
    		Error(response.ApiError);
    	}

        return true;
    }
    else if (response.Result == CommonServiceResults.InsufficientPrivileges)
    {
    	Error("You do not have sufficient priveleges to call this service.");

        return true;
    }
    else
    {
        return false;
    }
}

function IsSuccessResult(response)
{
    return response.Result == CommonServiceResults.Success;
}

function IsAccessDenied(response)
{
	return response.Result == "AccessDenied";
}

function UnknownResult(response)
{
	Error("Received an unhandled result from server: " + response.Result);
}

var SigningOut = false;

function SignOut()
{
    if (!SigningOut)
    {
        SigningOut = true;

        AccountServices.SignOut(EndSignOut, null);
    }
}

function EndSignOut(response, state)
{
    if (!HandleCommonResults(response))
    {
        if (!IsSuccessResult(response))
        {
            UnknownResult(response);
        }
    }

    ExpireSession();

    location.href = "login.htm?reason=signout";

    SigningOut = false;
}

function LoginRedirect()
{
    location.href = "login.htm?redirect=" + location.pathname;
}

function ShowElement(elementName)
{
    document.getElementById(elementName).style.display = "block";
}

function HideElement(elementName)
{
    document.getElementById(elementName).style.display = "none";
}

function DisableElement(elementName)
{
    document.getElementById(elementName).disabled = true;
}

function EnableElement(elementName)
{
    document.getElementById(elementName).disabled = false;
}

function SetClass(element, className)
{
    element.setAttribute("class", className);
    element.setAttribute("className", className);
}

function AppendClass(element, className)
{
    element.setAttribute("class", GetClass(element) + " " + className);
    element.setAttribute("className", GetClass(element) + " " + className);
}

function GetClass(element)
{
    var className = element.getAttribute("className");

    if (className == null)
    {
        className = element.getAttribute("class");
    }

    return className;
}

function ClearContainer(containerElement)
{
    while (containerElement.childNodes.length > 0)
    {
        containerElement.removeChild(containerElement.childNodes[0]);
    }
}

var PageLoad = new Event();
PageLoad.OneTimeFire = true;

var PageSubmit = new Event();
var PageCancel = new Event();

window.onload = function()
{
    PageLoad.Invoke();
}

document.onkeydown = function(e)
{
    if (e == null)
    {
        e = window.event;
    }

    var keyCode = e.keyCode;

    if (keyCode == null)
    {
        keyCode = e.which;
    }

    if (keyCode == 13)//enter key
    {
        PageSubmit.Invoke();
    }
    else if (keyCode == 27)//escape key
    {
        PageCancel.Invoke();
    }
}

function Event()
{
    this.EventHandlers = new Array();
    this.OneTimeFire = false;
    this.HasFired = false;
}

Event.prototype.AddHandler = function(eventHandler, eventArgs)
{
    if (this.OneTimeFire && this.HasFired)
    {
        eventHandler(eventArgs);
    }
    else
    {
        var handlerObj = new Object();
        handlerObj.EventHandler = eventHandler;
        handlerObj.EventArgs = eventArgs;

        this.EventHandlers.push(handlerObj);
    }
}

Event.prototype.RemoveHandler = function(eventHandler)
{
    var deleteIndex = -1;

    for (var i = 0; i < this.EventHandlers.length; i++)
    {
        if (this.EventHandlers[i] == eventHandler)
        {
            deleteIndex = i;
            break;
        }
    }

    if (deleteIndex >= 0)
    {
        this.EventHandlers.splice(deleteIndex, 1);
    }
}

Event.prototype.Invoke = function()
{
    for (var i = 0; i < this.EventHandlers.length; i++)
    {
        var handlerObj = this.EventHandlers[i];
        handlerObj.EventHandler(handlerObj.EventArgs);
    }

    this.HasFired = true;
}


// Add left trim, right trim, and trim functions
if (!String.prototype.trimStart)
{
    String.prototype.trimStart = function() { return this.replace(/^\s*/, ''); }
}

if (!String.prototype.trimEnd)
{
    String.prototype.trimEnd = function() { return this.replace(/\s*$/, ''); }
}

if (!String.prototype.trim)
{
    String.prototype.trim = function() { return this.trimStart().trimEnd(); }
}

function GetMessageSenderName(message)
{
    if (message.SenderTypeName == "Player")
    {
        return message.PlayerSenderName;
    }
    else if (message.SenderTypeName == "Character")
    {
        return message.CharacterSenderName;
    }
    else
    {
        return "unknown";
    }
}

function GetMessageRecipientName(message)
{
    if (message.RecipientTypeName == "Player")
    {
        return message.PlayerRecipientName;
    }
    else if (message.RecipientTypeName == "Character")
    {
        return message.CharacterSenderName;
    }
    else
    {
        return "unknown";
    }
}

function GetEventSource(e)
{
    if (e.target != null)
    {
        return e.target;
    }
    else
    {
        return e.srcElement;
    }
}

function GetDate(dateString)
{
    return eval("new Date(Date.UTC(" + dateString + "))");
}

/* this is super hacked and will not work under many conditions, but will be good enough for beta 1 demo purposes ~J*/
function GetRelativeDate(dateString)
{
    var result = "";
    var timeframe = "";

    var now = new Date();
    then = GetDate(dateString);

    var daysLater = ((now.getMonth() + 1) * 30 + now.getDate()) - ((then.getMonth() + 1) * 30 + then.getDate());
    var hoursLater = parseInt(now.getHours()) - parseInt(then.getHours());
    var minutesLater = now.getMinutes() - then.getMinutes();
    
    //alert(daysLater + " " + hoursLater + " " + minutesLater); // this is not right. the hours later is messed up somehow
    
    if (daysLater > 0)
    {
        result = daysLater;
        timeframe = "days";
        if (daysLater == 1)
        {
            timeframe = "day";
        }
    } else
    {
        if (hoursLater > 0)
        {
            result = hoursLater;
            timeframe = "hours";
            if (hoursLater == 1)
            {
                timeframe = "hour";
            }
        } else
        {
            if (minutesLater > 0)
            {
                result = minutesLater;
                timeframe = "minutes";
                if (minutesLater == 1)
                {
                    timeframe = "minute";
                }
            } else
            {
                result = "";
                timeframe = "seconds";
            }
        }
    }

    return result + " " + timeframe + " ago"; 
}

SetInnerText = function(element, text)
{
    if (document.all)
    {
        element.innerText = text;
    }
    else
    {
        element.textContent = text;
    }
}

function IsNullOrEmpty(string)
{
	return string == null || string.length < 1;
}

function ConstrainString(text, maxLength, endCharacters)
{
	if(endCharacters == null)
	{
		endCharacters = "...";
	}
	
	if(text != null && text.length > maxLength)
	{
		return text.substr(0, maxLength) + endCharacters;
	}
	else
	{
		return text;
	}
}

function GetAchievementImageName(achievement, size)
{
	return achievement.AchievementName.replace(/ /g, "-").replace("!", "").replace("?", "") + "-" + size + ".png";
}

function GetScrollLeft()
{
	return FilterScrollResults(
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}

function GetScrollTop()
{
	return FilterScrollResults(
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function FilterScrollResults(n_win, n_docel, n_body)
{
    var n_result = n_win ? n_win : 0;
    if (n_docel && (!n_result || (n_result > n_docel)))
        n_result = n_docel;
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
