/// <reference path="jQuery/1.3.2/jquery-vsdoc.js" />
/// <reference path="jQuery/plugins/blockUI.2.10.min.js" />
/// <reference path="jQuery/plugins/jqModal.js" />

/*
* Team-Integra common javascript library
* @requires jQuery v1.3.2 or later
* Copyright (c) 2009 Team-Integra
*/

/*********************************************/
/* Namespace for all code in here            */
/*********************************************/
var AA = {};


/*********************************************/
/*  User Details                             */
/*********************************************/
AA.User = {};
$(document).ready(function() {
    AA.User.Mask = (document.getElementById("U_Mask")) ? Number($("#U_Mask").val()) : 0;
    AA.User.Name = $("#U_Name").val();
});


/*********************************************/
/*  Enumerations                             */
/*********************************************/
AA.TriState = {};
AA.TriState.False = 0;
AA.TriState.True = -1;
AA.TriState.Default = -2;


/*********************************************/
/*  Formatting                               */
/*********************************************/
AA.Format = {};
AA.Format.Currency = function(amount) {
    ///<summary>Formats a currency value</summary>
    var i = parseFloat(amount);
    if (isNaN(i)) { i = 0.00; }
    var minus = '';
    if (i < 0) { minus = '-'; }
    i = Math.abs(i);
    i = parseInt((i + 0.005) * 100, 10);
    i = i / 100;
    var s = '' + i;
    if (s.indexOf('.') < 0) { s += '.00'; }
    if (s.indexOf('.') == (s.length - 2)) { s += '0'; }
    s = minus + s;
    return s;
};
AA.Format.Comma = function(amount) {
    ///<summary>Comma formatted value</summary>
    var delimiter = ",";
    var a, d, i;
    amount = '' + amount;
    a = amount.split('.', 2);
    d = a[1];
    i = parseInt(a[0], 10);
    if (isNaN(i)) { return ''; }
    var minus = '';
    if (i < 0) { minus = '-'; }
    i = Math.abs(i);
    var n = '' + i;
    a = [];
    while (n.length > 3) {
        var nn = n.substr(n.length - 3);
        a.unshift(nn);
        n = n.substr(0, n.length - 3);
    }
    if (n.length > 0) { a.unshift(n); }
    n = a.join(delimiter);
    if (d.length < 1) { amount = n; }
    else { amount = n + '.' + d; }
    amount = minus + amount;
    return amount;
};


/*********************************************/
/*  Date based stuff                         */
/*********************************************/
AA.Date = {};
AA.Date.AddDays = function(thisDate, days) {
    ///<summary>Add Days to a Date</summary>
    return new Date(thisDate.getTime() + days * 24 * 60 * 60 * 1000);
};
AA.Date.DaysInMonth = function(month, year) {
    ///<summary>Gets the # of days in a month</summary>
    ///<param name="month" type="Object" optional="false">Month of Date</param>
    ///<param name="year" type="Object" optional="false">Year of Date</param>
    var x = new Array(31, ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    return x[month];
};
AA.Date.IsValid = function(input) {
    ///<summary>Checks a Date for Validity</summary>
    ///<param name="input" type="String" optional="false">Value to Check</param>
    var validformat = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    if (!validformat.test(input)) {
        return false;
    }
    else {
        var monthfield = input.split("/")[0]; var dayfield = input.split("/")[1]; var yearfield = input.split("/")[2];
        var dayobj = new Date(yearfield, monthfield - 1, dayfield);
        return (((dayobj.getMonth() + 1 != monthfield) || (dayobj.getDate() != dayfield) || (dayobj.getFullYear() != yearfield)) == false);
    }
};
AA.Date.SetPreset = function(drp, StartBox, EndBox) {
    ///<summary>Set a date range</summary>
    ///<param name="drp" type="Object" optional="false">jQuery object that is the dropdown</param>
    ///<param name="StartBox" type="Object" optional="false">jQuery object that is the start date</param>
    ///<param name="EndBox" type="Object" optional="false">jQuery object that is the end date</param>
    var start = '', end = '';
    var opt = $(drp).val();
    switch (opt) {
        case "TDY":
            start = new Date();
            end = start;
            break;
        case "YSD":
            start = new Date();
            start = addDays(start, -1);
            end = start;
            break;
        case "WTD":
            end = new Date();
            start = (end.getDay() == 1) ? start = end : addDays(end, (-1 * (end.getDay() - 1)));
            break;
        case "LW":
            end = new Date();
            start = (end.getDay() == 1) ? start = end : addDays(end, (-1 * (end.getDay() - 1)));
            start = addDays(start, -7);
            end = addDays(start, 6);
            break;
        case "TM":
            start = new Date();
            start = new Date(start.getFullYear(), start.getMonth(), 1);
            end = getDaysInMonth(start.getMonth(), start.getFullYear());
            end = new Date(start.getFullYear(), start.getMonth(), end);
            break;
        case "LM":
            start = new Date();
            start = new Date(start.getFullYear(), (start.getMonth() - 1), 1);
            end = getDaysInMonth(start.getMonth(), start.getFullYear());
            end = new Date(start.getFullYear(), start.getMonth(), end);
            break;
        case "LTD":
            end = new Date();
            start = addDays(end, -30);
            break;
        case "LSD":
            end = new Date();
            start = addDays(end, -60);
            break;
        case "LND":
            end = new Date();
            start = addDays(end, -90);
            break;
        default:
            start = new Date();
            end = start;
    }
    $(StartBox).val(AA.Date.Format(start));
    $(EndBox).val(AA.Date.Format(end));
};
AA.Date.Format = function(dt) {
    ///<summary>Formats as MM/DD/YYYY</summary>
    var Today = new Date();
    if (dt > Today) dt = Today;
    return AA.Text.Pad(dt.getMonth() + 1, "00") + "/" + AA.Text.Pad(dt.getDate(), "00") + "/" + dt.getFullYear();
};

/*********************************************/
/*  Text Utilities                           */
/*********************************************/
AA.Text = {};
AA.Text.Inner = function(cntrl) {
    ///<summary>Gets the inner text of a DOM node</summary>
    if (typeof cntrl.textContent != 'undefined') { return cntrl.textContent; } else { return cntrl.innerText; };
};
AA.Text.Left = function(str, n){
    ///<summary>Left characters of a string</summary>
    if (n <= 0) { return ''; } else if (n > String(str).length) { return str; } else { return String(str).substring(0, n); };
};
AA.Text.Right = function(str, n) {
    ///<summary>Right characters of a string</summary>
    if (n <= 0) { return ''; } else if (n > String(str).length) { return str; } else { var iLen = String(str).length; return String(str).substring(iLen, iLen - n); };
};
AA.Text.EscapeHtml = function(txt) {
    ///<summary>Escapes the HTML of a given string</summary>
    var div = document.createElement("div");
    var text = document.createTextNode(txt);
    div.appendChild(text);
    return div.innerHTML;
};
AA.Text.Pad = function(str, pad) {
    ///<summary>Pads a given string</summary>
    if (pad == undefined) { pad = "00"; }
    str = "" + pad + str;
    return AA.Text.Right(str, pad.length);
};
AA.Text.Clipboard = function(inElement) {
    if (inElement.createTextRange) {
        var range = inElement.createTextRange();
        if (range && BodyLoaded == 1) { range.execCommand('Copy'); }
    } 
    else {
        var flashcopier = 'flashcopier';
        if(!document.getElementById(flashcopier)) {
            var divholder = document.createElement('div');
            divholder.id = flashcopier;
            document.body.appendChild(divholder);
        }
        document.getElementById(flashcopier).innerHTML = '';
        var divinfo = '<embed src="/common/java/jq/_clipboard.swf" FlashVars="clipboard=' + 
            encodeURIComponent(inElement.value) + 
            '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
        document.getElementById(flashcopier).innerHTML = divinfo;
    }
}



/*********************************************/
/*  General Utilities                        */
/*********************************************/
AA.Utils = {};
AA.Utils.Message = function(obj, txt, icon) {
    ///<summary>Decorates a div tag for user output</summary>
    ///<param name="obj" type="Object" optional="false">Element to generate</param>
    ///<param name="txt" type="String" optional="true">Message Text</param>
    ///<param name="icon" type="String" optional="true">Icon to use</param>
    $(obj).each(function() {
        txt = txt || '';
        icon = icon || '';
        if (txt == '') {
            $(this).empty().hide();
            return;
        }
        if (icon == '') {
            $(this).css("background-image", "").css("padding-left", "4px");
        }
        else {
            var ext = (icon.beginsWith("indicator")) ? "gif" : "png";
            $(this).css("background-image", "url(/images/icons/" + icon + "." + ext +")").css("background-repeat", "no-repeat").css("background-position", "left center").css("padding-left", "20px");
        }
        $(this).html(txt).show();
    });
};
AA.Utils.GetQueryVariable = function(key, val) {
    ///<summary>Retrieves a value from the Query String</summary>
    var query = window.location.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        if (pair[0] == key) {
            return pair[1];
        }
    }
    return (val) ? val : "";
};
AA.Utils.ButtonHover = function() {
    ///<summary>Wires up all buttons for UI theming</summary>
    $(".ui-state-default").hover(
        function() {
            $(this).addClass("ui-state-hover");
        }, 
        function() {
            $(this).removeClass("ui-state-hover");
        }
    );
};
AA.Utils.SelectAll = function(obj) {
    obj = $(obj)[0];
    obj.focus();
    obj.select();
}
$(document).ready(function() {
    AA.Utils.ButtonHover();
});

/*********************************************/
/*  Table Striping                           */
/*********************************************/
AA.Table = {};
AA.Table.StripeMouseOver = function(tbl, remove) {
    ///<summary>Stripes and applies mouseover class</summary>
    AA.Table.MouseOver(tbl, remove);
    AA.Table.Stripe(tbl, remove);
};
AA.Table.MouseOver = function(tbl, remove) {
    if (remove) {
        tbl.find("tbody tr").unbind("mouseover");
    }
    else {
        tbl.find("tbody tr").mouseover(
            function() {
                $(this).addClass("Over");
            }
        )
        .mouseout(
            function() {
                $(this).removeClass("Over");
            }
        );
    }
};
AA.Table.Stripe = function(tbl, remove) {
    tbl.find("tbody tr").css("background-color", "#ffffff");
    tbl.find("tbody tr:odd").css("background-color", "#eeeeee");
};


/*********************************************/
/*  Ajax Calls and Utilities                 */
/*********************************************/
AA.Ajax = {};
AA.Ajax.Get = function(url, params, success, error) {
	///<summary>Make a JSON call</summary>
	///<param name="url" type="String" optional="false">Url of handler to call</param>
	///<param name="params" type="Object" optional="false">params to pass to handler, this event looks for ".Method" (GET/POST) as well</param>
	///<param name="success" type="Object" optional="false">Event to call when complete</param>
	///<param name="error" type="Object" optional="true">Event to call when an error is encountered</param>
    var CallParams = {};
    CallParams.type = params.Method || "POST";
    CallParams.url = url;
    CallParams.processData = true; 
    CallParams.data = params;
    CallParams.dataType = "json"; 
    CallParams.success = success;
    if (error) { 
        CallParams.error = error;
    }
    $.ajax(CallParams);
}
AA.Ajax.Error = function(x) {
    ///<summary>Shows .NET error message</summary>
    var msg = 'Unknown Error Encountered';
    try {
        AA.Console.Log("Checking Permissions: " + AA.User.Mask + "/32");
        if ((AA.User.Mask & 32) > 0) {
            AA.Console.Log("Show actual error");
            var s = x.responseText.indexOf("<title>") + 7;
            var t = x.responseText.indexOf("</title>");
            msg = x.responseText.substr(s, t - s);
        }
        else {
            AA.Console.Log("Show generic");
        }
    }
    catch (e) {
        //Leave it alone
    }
    return msg;
}

/*********************************************/
/*  Prototypes that work against primitives  */
/*********************************************/
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
String.prototype.contains = function(t) { return this.indexOf(t) >= 0 ? true : false; };
String.prototype.beginsWith = function(t, i) { if (i == false) { return (t == this.substring(0, t.length)); } else { return (t.toLowerCase() == this.substring(0, t.length).toLowerCase()); } };
String.prototype.endsWith = function(t, i) { if (i == false) { return (t == this.substring(this.length - t.length)); } else { return (t.toLowerCase() == this.substring(this.length - t.length).toLowerCase()); } }


/*********************************************/
/*  Console based stuff                      */
/*********************************************/
AA.Console = {};
AA.Console.Enabled = false;
$(document).ready(function() {
    AA.Console.Enabled = (document.getElementById("U_ConsoleEnabled")) ? true : false;
    try {
        if (window['loadFirebugConsole']) {
            window.loadFirebugConsole();
        } else if (!window['console']) {
            window.console = {}; window.console.info = {}; window.console.log = {}; window.console.warn = {}; window.console.error = {}; window.console.debug = {};
        }
    }
    catch (e) {
        //ignore
    }
});
AA.Console.Log = function(txt) {
    ///<summary>Logs a string to console</summary>
    if (AA.Console.Enabled == false) { return; }
    try {
        console.log(txt);
    }
    catch (e) {
    }
};
AA.Console.Debug = function(txt) {
    ///<summary>Logs a debug message to console</summary>
    if (AA.Console.Enabled == false) { return; }
    try {
        console.debug(txt);
    }
    catch (e) {
    }
};
AA.Console.Info = function(txt) { 
    ///<summary>Logs an informative message to console</summary>
    if (AA.Console.Enabled == false) { return; }
    try {
        console.info(txt);
    }
    catch (e) {
    }
};
AA.Console.Warn = function(txt) { 
    ///<summary>Logs a warning to console</summary>
    if (AA.Console.Enabled == false) { return; }
    try {
        console.warn(txt);
    }
    catch (e) {
    }
};
AA.Console.Error = function(txt) { 
    ///<summary>Logs an Error to console</summary>
    if (AA.Console.Enabled == false) { return; }
    try {
        console.error(txt);
    }
    catch (e) {
    }
};
