var DEBUG_MODE = false;


function IsIE()
{
    return navigator.appName.indexOf("Microsoft") != -1;
}

function IsSpaceChar(str)
{
    return str == " " || str == "\t";
}

function IsEmpty(value)
{
    return !value || value.length == 0;
}

function LTrim(str)
{
    for (var i = 0; i < str.length; ++i)
    {
        if (IsSpaceChar(str.charAt(i)))
        {
            str = str.substr(i + 1);
            --i;
        }
        else
        {
            break;
        }
    }
    return str;
}

function RTrim(str)
{
    for (var i = str.length - 1; i >= 0; --i)
    {
        if (IsSpaceChar(str.charAt(i)))
        {
            str = str.substr(0, str.length - 1);
        }
        else
        {
            break;
        }
    }

    return str;
}


function Trim(str)
{
    return RTrim(LTrim(str));
}

function Debug(text)
{
    if (DEBUG_MODE)
    {
        OutputStatus(text);
    }
}


function GetControlValue(controlObject)
{
    if (!controlObject)
    {
        return null;
    }

    return (controlObject.value !== null || controlObject.value !== undefined) ? controlObject.value : controlObject.text;
}

function GetElement(id)
{
    var element = document.getElementById(id);
    if (!element)
    {
        return null;
    }
    return element;
}

function GetElementValue(id)
{
    return GetControlValue(GetElement(id));
}

function UriSerialize(parameterNames, parameterValues)
{
    var serializedPairs = new Array();
    for (var iParameter = 0; iParameter < parameterNames.length; ++iParameter)
    {
        var parameterName   = parameterNames[iParameter];
        var parameterValue  = parameterValues[iParameter];
        var parameterStr    = parameterName + "=" + encodeURIComponent(parameterValue);
        serializedPairs.push(parameterStr);
    }
    return serializedPairs.join("&");
}

function DoAlert(str)
{
    alert(str);
}

function getTopPos(inputObj)
{
    var returnValue = inputObj.offsetTop + inputObj.offsetHeight;
    while((inputObj = inputObj.offsetParent) != null)
    {
        returnValue += inputObj.offsetTop;
    }
    return returnValue;
}

function getLeftPos(inputObj)
{
    var returnValue = inputObj.offsetLeft;
    while((inputObj = inputObj.offsetParent) != null)
    {
        returnValue += inputObj.offsetLeft;
    }
    return returnValue;
}

function ArraySearch(needle, array)
{
    for (var i = 0; i < array.length; ++i)
    {
        if (array[i] == needle)
        {
            return i;
        }
    }
    return -1;
}


function GetParametrizedString(str, vars, values)
{
    var newStr = str;
    for (var i = 0; i < vars.length; ++i)
    {
        var varName = vars[i];
        var varValue = values[i];

        newStr = newStr.replace("%" + varName + "%", varValue);
    }

    return newStr;
}

function ParseQueryString(queryString)
{
    var chunks = queryString.split("&");

    var keys = new Array();
    var values = new Array();
    var queryStringResultSet = [keys, values];
    for (var i = 0; i < chunks.length; ++i)
    {
        var keyValuePair = chunks[i].split("=");
        var key = decodeURIComponent(keyValuePair[0]);
        var value = decodeURIComponent(keyValuePair[1]);
        keys[i] = key;
        values[i] = value;
    }
    return queryStringResultSet;
}

function GetQueryStringParam(queryStringResultSet, key)
{
    var keys = queryStringResultSet[0];
    var values = queryStringResultSet[1];

    var iKey = ArraySearch(key, keys);
    return values[iKey];
}

function IsQueryStringParam(queryStringResultSet, key)
{
    var keys = queryStringResultSet[0];
    var values = queryStringResultSet[1];

    var iKey = ArraySearch(key, keys);

    return iKey !== -1;
}

function WritePersistentCookie(name, value)
{
    var cookieLifetimeUnits = COOKIE_LIFETIME_UNITS;
    var cookieLifetimeCount = COOKIE_LIFETIME_COUNT;
    writePersistentCookie(name, value, cookieLifetimeUnits, cookieLifetimeCount);
}

function IsVisible(element)
{
    if (typeof(element) == "string")
        element = GetElement(element);

    return element.style.display == '';
}

function IsVisibleRecursive(element, maxDepth)
{
    maxDepth = maxDepth || 10;
    if (typeof(element) == "string")
        element = GetElement(element);

    var currentDepth = 0;
    while (element && element != document && element != document.body && currentDepth < maxDepth)
    {
        if (!IsVisible(element))
        {
            return false;
        }

        element = element.parentNode;
        ++currentDepth;
    }
    return true;
}

function SetVisibility(element, visible)
{
    if (typeof(element) == "string")
        element = GetElement(element);
    if ( element != null )
    {
        element.style.display = (visible ? '' : 'none');
    }
}

function SwitchVisibility(element)
{
    SetVisibility(element, !IsVisible(element));
}

function SubmitForm(formId)
{
    GetElement(formId).submit();
}

function CopyToClipboard(txt)
{
    var clipboard = GetFlashApp("clipboard");
    clipboard.copyToClipboard(txt);
}

function IsEmailValid(email)
{
    var regexp = new RegExp("^[A-Za-z0-9\\.\\-_]+\\@[A-Za-z0-9\\.\\-_]+\\.[A-Za-z]+$");
    return regexp.test(email);
}

function ParseTemplate(template, vars)
{
    for (var i in vars)
    {
        var value = vars[i];
        value = EscapeTemplateChars(String(value));

        template = template.replace(new RegExp("\\{" + i + "\\}", "g"), value);
    }

    var index = 0;
    var exp = /\{if[^}]*\}[^{[]*\[if\]/;
    while((index = template.search(exp)) != -1)
    {
        var condBegin = index + 3;
        var condEnd   = template.indexOf("}", condBegin);
        var cond = template.substr(condBegin, condEnd - condBegin);
        if (eval(cond))
        {
            template = template.substr(0, condBegin - 3) +
                template.substr(condEnd + 1, template.indexOf("[if]", condEnd) - condEnd - 1) +
                template.substr(template.indexOf("[if]", condEnd) + 4);
        }
        else
        {
            template = template.replace(exp, "");
        }
    }

    return UnescapeTemplateChars(template);
}

function EscapeTemplateChars(str)
{
    var spaceChars   = new Array("{", "}", "[", "]");
    var escapedChars = new Array("%LF%", "%RF%", "%LQ%", "%RQ%");

    for (var i = 0; i < spaceChars.length; ++i)
        str = str.replace(new RegExp("\\" + spaceChars[i], "g"), escapedChars[i]);

    return str;
}

function UnescapeTemplateChars(str)
{
    var spaceChars   = new Array("%LF%", "%RF%", "%LQ%", "%RQ%");
    var escapedChars = new Array("{", "}", "[", "]");

    for (var i = 0; i < spaceChars.length; ++i)
        str = str.replace(new RegExp(spaceChars[i], "g"), escapedChars[i]);

    return str;
}


function IsFunctionDefined(func)
{
    return (typeof(window[func]) != 'undefined');
}

function GetMouseOnEventYPosition(event)
{
    var scrollTop = 0;

    var y;

    if (event.pageY)
        y = event.pageY;
    else
        y = window.event.clientY + ((document.body.scrollTop != 0) ? document.body.scrollTop : document.documentElement.scrollTop);

    return y;
}

function GetMouseOnEventXPosition(event)
{
    var x;
    if (event.pageX)
        x = event.pageX;
    else
        x = window.event.clientX + ((document.body.scrollLeft != 0) ? document.body.scrollLeft : document.documentElement.scrollLeft);
    return x;
}

function GetElementHeight(idElement)
{
    var height = 0;
    if (IsIE())
    {
        height = GetElement(idElement).offsetHeight;
    }
    else
    {
        var docObj = GetElement(idElement);
        height = document.defaultView.getComputedStyle(docObj, "").getPropertyValue("height");
        height = height.split('px');
        height = height[0];
    }
    return height;
}

function GotoUrl(url)
{
    location.href = url;
}

function GotoParentUrl(url)
{
    parent.location.href = url;
}

function AddWordWrap(element, longWordLength)
{
    if (typeof(element) == "string")
        element = GetElement(element);

	if (!element)
	{
		return;
	}
	
    if (IsIE())
    {
        element.style.wordWrap = "break-word";
        return;
    }

    var value = element.innerHTML;
    var re = new RegExp("(\\S{" + longWordLength + ",})", "g");

    var delimiter = String.fromCharCode('8203');

    var longWords = value.match(re);
    if (!longWords)
        return;

    for (var i = 0; i < longWords.length; ++i)
    {
        var word  = longWords[i];
        splitWord = word.split("").join(delimiter);
        value = value.replace(word, splitWord);
    }

    element.innerHTML = value;
}

function TruncateElementText(elementId, maxWidth, postfix /* = "..." */)
{
    if (postfix == undefined)
    {
        postfix = "...";
    }

    var element = GetElement(elementId);
    if (element.offsetWidth > maxWidth)
    {
        var origText = element.innerHTML;
        var textLength = origText.length;

        do
        {
            textLength -= 1;
            textLength = Math.max(0, textLength);

            element.innerHTML = origText.substr(0, textLength) + postfix;
        } while(element.offsetWidth > maxWidth);
    }
}

function GetObjectFromQuery(query)
{
    var responseObject = new Object();

    var responseArray = ParseQueryString(query);
    var names = responseArray[0];
    var values = responseArray[1];

    for (var i = 0; i < names.length; ++i)
    {
        responseObject[names[i]] = values[i];
    }

    return responseObject;
}

function GetSiteUrl()
{
    var siteUrl = document.location.href;
    var urlExpr = /^([a-z]+\:\/\/[^\/]+)/i;

    if (urlExpr.test(siteUrl))
    {
        var match = urlExpr.exec(siteUrl);
        return match[1];
    }
    return "";
}

function GetSecureSiteUrl()
{
    var siteUrl = GetSiteUrl();
    var urlExpr = /^http\:\/\//i;
    return siteUrl.replace(urlExpr, "https://");
}

function JsonDecode(jsonString)
{
    var decodedObject = {};
    if( jsonString != '')
        decodedObject = eval('(' + jsonString + ')');
    return decodedObject;
}

function GetSuffixNumericId( str )
{
    var pattern = /^[^\d]+([\d]+)$/;
    var matches = pattern.exec( str );
    var id = ( matches[1] ) ? parseInt( matches[1] ) : 0;
    return id;
}
