﻿/// <reference path="~/Scripts/ByteStorm/_BSC_Interface.js" />
(function()
{
    BSC.D = function()
    {
        var pingtimer = null;
        var pingcheck = null;
        var lastping = new Date();
        var lastrsesponse = new Date();
        var pinginterval = 60000;  //120000; //1000*60*2 == 2 minutes;
        var servicecheckinterval = 60000; //1000*30 = 30 seconds;
        var errorwaittime = 80000; //1000*30 = 30 seconds;

        var servicecheck = null;
        var slastping = new Date();
        var slastrsesponse = new Date();
        var servicecheckinterval = 110000; //1000*110 = 110 seconds;
        var serverDatetime = null;

        var ajaxflashcallback = {};

        var ajaxXhr = {};

        var websync_client_initialize = false;

        var NotificationTypes = {
            ChatInvitation: 201
        };

        var channels = {};


        var ServerPingCallback = function(r)
        {
            //            if (pingcheck) clearTimeout(pingcheck);
            //            if (r && r.success)
            //            {


            //            }

            //            var dd = r.success;
        };



        var NoPingServerResponse = function()
        {
            setTimeout(BSC.D.Ping, errorwaittime);
        };

        /// <summary>Javascript data cache 1</summary>
        return {
            DateDelta: function()
            {
                if (!serverDatetime) return 0;
                var datetime = serverDatetime.replace(/[a-zA-Z\/\()]/g, "");
                var serverdate = parseInt(datetime);
                var date1 = new Date(serverdate);
                var date2 = new Date();
                var time_diff = date2 - date1;
                return time_diff;
            },


            Ping: function()
            {
                try
                {
                    // Send Ping to Server
                    if (BSC.D.P.IsLoggedIn())
                    {
                        setInterval(function()
                        {
                            var data =
                            {
                                chats: BSC.UI.Ws.Chat.Room.GetActiveChats()
                            };
                            BSC.D.AjaxPost("/ping", data, ServerPingCallback, "json");
                        }, pinginterval);
                        return;
                    }
                }
                catch (e)
                {
                    BSC.L.Add({ error: e.message, sender: 'BSC.D.Ping' });
                    BSC.L.Save();
                }
            },

            Init: function(name)
            {
                // Send Ping to Server

                if (BSC.D.P.IsLoggedIn())
                {
                    BSC.D.Ping();
                    fm.websync.client.getClientId()
                    fm.websync.client.initialize({
                        frameUrl: BSC.BASE_SERVICE_PATH + 'client.ashx?frame=1',
                        streamUrl: BSC.BASE_SERVICE_PATH + 'request.ashx',
                        handlerUrl: BSC.BASE_SERVICE_PATH + 'request.ashx'
                    });
                    websync_client_initialize = true;

                    fm.websync.client.connect({
                        onSuccess: function(args) { /*alert('Connected!');*/ },
                        onFailure: function(args) { alert('Connect failed: ' + args.error); }
                    });

                    fm.websync.client.subscribe({
                        channel: '/n/global',
                        ext: { ticketid: BSC.D.P.GetData("TicketID") },
                        onSuccess: function(args) { channels['/n/global'] = true; /*alert('Subscribed to global notification!');*/ },
                        onFailure: function(args) { alert('Error connecting to global notification!'); },
                        onReceive: function(args) { BSC.D.ParseSocketData(args); }
                    });

                    fm.websync.client.subscribe({
                        channel: '/n/' + BSC.D.P.GetData("TicketID"),
                        ext: { ticketid: BSC.D.P.GetData("TicketID") },
                        onSuccess: function(args)
                        {
                            channels['/n/' + BSC.D.P.GetData("TicketID")] = true;
                            setInterval(function()
                            {
                                fm.websync.client.publish({
                                    channel: "/ping",
                                    data: { ticketid: BSC.D.P.GetData("TicketID") },
                                    onSuccess: function(args) { /*alert('Published!');*/ },
                                    onFailure: function(args) { /*alert('Publish failed: ' + args.error);*/ }
                                });
                            }, servicecheckinterval);
                        },
                        onFailure: function(args) { alert('Error connecting to private notification!'); },
                        onReceive: function(args) { BSC.D.ParseSocketData(args); }
                    });
                }


                //                var client = fm.websync.client; // shortcut
                //                var util = fm.websync.utilities; // shortcut
                //                var json = fm.websync.utilities.json; // shortcut



                return name;
                /// <summary>Javascript data cache 4</summary>
                /// <param name="name">Person's name</param>
                /// <return>Ninja</return>
            },

            ParseSocketData: function(args)
            {
                var channel = args.channel;
                var data = args.data;

                if (channel == "/n/global")
                {
                    // Public Profile Count update
                    if (data.event == "pcc")
                    {
                        // badge_chat  {"event":"pcc","pcc":2}
                        BSC.UI.Ws.Chat.UpdateProfileCount(data.pcc);
                    }
                }
                else if (channel == "/n/" + BSC.D.P.GetData("TicketID"))
                {
                    // Private chat invitation
                    if (data.event == "chatinvatation")
                    {
                        //                [{ "channel": "/n/ed253ee3-dc58-47c8-945f-6fe5fcc3a77c", "successful": true, "data": { "event": "chatinvatation", "chatid": "3a4caaa4-b805-43c5-a387-a54ad941650d", "profile": { "ID": "48bc3969-bdf4-4cc3-9c6d-e839d4421347", "Name": "Camilla Jakobsen", "Country": "Denmark", "CC": "DK", "Gender": 0}}}]
                        //alert(data.profile.name + " invited you to private chat");
                        BSC.UI.Ws.Chat.Room.IncommingChatInvitation(data.chatid);
                        //GO("/chat/room/" + data.chatid);
                        return;
                    }
                }



                //  alert(fm.websync.utilities.json.stringify(args.data));

                // BSC.D.P.SetData(channel, data.clientId);

                //alert(BSC.D.P.GetData(channel));
                // [{"channel":"/global/notification","successful":true,"data":{"event":"subscribe", "clientId":"5"}}] //{"event":"subscribe","clientId":"5"}
            },

            UnsubscribeChannels: function(args)
            {
                //                for (channel in channels)
                //                {
                //                    fm.websync.client.unsubscribe({
                //                        channel: channel, ext: { ticketid: BSC.D.P.GetData("TicketID") }
                //                    });
                //                }
                if (websync_client_initialize)
                {
                    fm.websync.client.disconnect({
                        ext: { ticketid: BSC.D.P.GetData("TicketID") }
                    });
                }
            },

            SendSync: function(d, o, m, e, p)
            {
                /// http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/
                /// http://blogs.msdn.com/kaevans/archive/2008/04/03/calling-webservices-via-ajax-part-1.aspx
                /// http://www.dennydotnet.com/post/2008/03/Passing-a-JSON-object-to-a-WCF-service-with-jQuery.aspx
                /// http://geekswithblogs.net/JuanDoNeblo/archive/2007/10/24/json_in_aspnetajax_part2.aspx
                /// <summary>Javascript data cache 4</summary>
                /// <param name="d">Data for the server</param>
                /// <param name="o">Object</param>
                /// <param name="m">Method</param>
                /// <param name="e">Error callback</param>
                /// <param name="p">Data to parse to the success callback</param>
                /// <return>Ninja</return>
                if (!e) e = BSC.D.OnError;
                if (!d) d = {}; d = BSC.D.JSON.ToString(d);
                // o = Windows.Rating ==> Windows/Rating
                o = o.replace(/\./g, "/"); var u = "/WebServices/" + o + ".asmx/" + m
                var r = null;
                var sr = $.ajax({
                    type: "POST",
                    async: false,
                    url: u,
                    data: d,
                    d: p,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    error: e // function (XMLHttpRequest, textStatus, errorThrown)
                }).responseText;
                r = BSC.D.JSON.Parse(sr);
                return (r) ? r.d : null;
            },

            SendJSON: function(d, u, s, e, p)
            {
                /// http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/
                /// http://blogs.msdn.com/kaevans/archive/2008/04/03/calling-webservices-via-ajax-part-1.aspx
                /// http://www.dennydotnet.com/post/2008/03/Passing-a-JSON-object-to-a-WCF-service-with-jQuery.aspx
                /// http://geekswithblogs.net/JuanDoNeblo/archive/2007/10/24/json_in_aspnetajax_part2.aspx
                /// <summary>Javascript data cache 4</summary>
                /// <param name="d">Data for the server</param>
                /// <param name="o">Object</param>
                /// <param name="m">Method</param>
                /// <param name="s">Success callback</param>
                /// <param name="e">Error callback</param>
                /// <param name="p">Data to parse to the success callback</param>
                /// <return>Ninja</return>
                if (!e) e = BSC.D.OnError;
                if (!d) d = {}; d = BSC.D.JSON.ToString(d);
                $.ajax({
                    type: "POST",
                    url: u,
                    data: d,
                    d: p,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    beforeSend: (function(xml) { xml.setRequestHeader("X-IsJson", "true"); }),
                    success: s, // function (data, textStatus)
                    error: e // function (XMLHttpRequest, textStatus, errorThrown)
                });
            },

            Send: function(d, o, m, s, e, p)
            {
                /// http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/
                /// http://blogs.msdn.com/kaevans/archive/2008/04/03/calling-webservices-via-ajax-part-1.aspx
                /// http://www.dennydotnet.com/post/2008/03/Passing-a-JSON-object-to-a-WCF-service-with-jQuery.aspx
                /// http://geekswithblogs.net/JuanDoNeblo/archive/2007/10/24/json_in_aspnetajax_part2.aspx
                /// <summary>Javascript data cache 4</summary>
                /// <param name="d">Data for the server</param>
                /// <param name="o">Object</param>
                /// <param name="m">Method</param>
                /// <param name="s">Success callback</param>
                /// <param name="e">Error callback</param>
                /// <param name="p">Data to parse to the success callback</param>
                /// <return>Ninja</return>
                if (!e) e = BSC.D.OnError;
                if (!d) d = {}; d = BSC.D.JSON.ToString(d);
                // o = Windows.Rating ==> Windows/Rating
                o = o.replace(/\./g, "/"); var u = "/WebServices/" + o + ".asmx/" + m
                $.ajax({
                    type: "POST",
                    url: u,
                    data: d,
                    d: p,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    success: s, // function (data, textStatus)
                    error: e // function (XMLHttpRequest, textStatus, errorThrown)
                });
            },

            Ajax: function(p1, p2, p3, p4, p5, p6, p7)
            {
                var uri = p1;
                if (!uri || uri.length == 0) return false;

                var method = p2; if (!method) method = "GET";
                var data = p3; if (!data) data = {};
                var successCallback = p4;
                var contentOnly = p5;
                var jsonResponse = p6;
                var contentType = (p7 && p7 == "json") ? "application/json" : "text/html; charset=utf-8";
                var dataType = (jsonResponse) ? "html" : "html";


                if (!data) d = {};
                var beforeSendF = function(xml)
                {
                    if (contentOnly) xml.setRequestHeader("X-OnlyContent", "true");
                    if (jsonResponse) xml.setRequestHeader("X-IsJson", "true");
                };
                $.ajax({
                    type: method,
                    url: uri,
                    data: data,
                    processData: false,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    timeout: 10000,
                    beforeSend: beforeSendF,
                    success: successCallback
                });
            },

            GetByFlash: function(p1, p2, p3)
            {
                var uri = p1;
                var data = p2;
                var callback = p3;

                if (uri.toLowerCase().indexOf("/ajax") == -1)
                    uri = "/ajax" + uri;

                uri = uri.substr(1, uri.length);

                var tID = BSC.U.NewGUID();

                ajaxflashcallback[tID] =
				{
				    uri: uri,
				    data: data,
				    callback: callback
				};

                BSC.UI.GetFlash("ServiceFlash").GetHtml(BSC.BASE_UPLOAD_PATH + uri, tID);
            },

            FlashServerCallback: function(p1, p2)
            {
                if (!p1.s) return;

                var res = p1.d;
                var tID = p2;

                var uri = ajaxflashcallback[tID].uri;
                var data = ajaxflashcallback[tID].data;
                var callback = ajaxflashcallback[tID].callback;

                delete ajaxflashcallback[tID];

                var result =
				{
				    d: res,
				    data: data
				};

                if (callback)
                    callback.apply(null, [result]);
            },


            AjaxGet: function(url, data, success, type, guid)
            {
                //setTimeout(function()  {
                if (!ajaxXhr[guid]) ajaxXhr[guid] = {};
                //if (url.toLowerCase().indexOf("/ajax") == -1) url = "/ajax" + url;
                if (url.toLowerCase().indexOf("/ajax") > -1) url = url.toLowerCase().replace(/\/ajax/, i); // +url;

                var threadGuid = url + guid;

                if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid])
                {
                    //debugger;
                    ajaxXhr[guid][threadGuid].abort();
                    delete ajaxXhr[guid][threadGuid];
                }

                //if (typeof (data) == "string") data = BSC.U.ParseQuery(data);
                var d = (data) ? data : {};
                d.__guid = guid;
                //if (BSC.D.P.IsLoggedIn() && BSC.D.P.GetData().TicketID != "00000000-0000-0000-0000-000000000000")
                d.__ticketid = BSC.D.P.GetData().TicketID;
                d.__nocache = new Date();
                
                //else
                //    data.__ticketid = "00000000-0000-0000-0000-000000000000";

                url = url.toLowerCase();

                ajaxXhr[guid][threadGuid] = $.get(url, d, function(res)
                {
                    success.apply(null, [res]);
                    if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid]) delete ajaxXhr[guid][threadGuid];
                }, type);
                //}, 0);
            },

            AjaxPost: function(url, data, success, type, guid)
            {
                setTimeout(function()
                {
                    if (!ajaxXhr[guid]) ajaxXhr[guid] = {};
                    //if (url.toLowerCase().indexOf("/ajax") == -1) url = "/ajax" + url;
                    if (url.toLowerCase().indexOf("/ajax") > -1) url = url.toLowerCase().replace(/\/ajax/, i); // +url;

                    var threadGuid = url + guid;

                    if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid])
                    {
                        //debugger;
                        ajaxXhr[guid][threadGuid].abort();
                        delete ajaxXhr[guid][threadGuid];
                    }

                    //if (typeof (data) == "string") data = BSC.U.ParseQuery(data);
                    var d = (data) ? data : {};
                    d.__guid = guid;
                    //if (BSC.D.P.IsLoggedIn() && BSC.D.P.GetData().TicketID != "00000000-0000-0000-0000-000000000000")
                    d.__ticketid = BSC.D.P.GetData().TicketID;
                    d.__nocache = new Date();
                    //else
                    //    data.__ticketid = "00000000-0000-0000-0000-000000000000";

                    url = url.toLowerCase();

                    ajaxXhr[guid][threadGuid] = $.post(url, d, function(res)
                    {
                        if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid]) delete ajaxXhr[guid][threadGuid];

                        if (res.InvalidTicket)
                        {
                            alert("Invalid Ticket");
                            return;
                        }

                        success.apply(null, [res]);
                    }, type);
                }, 0);
            },

            AjaxGetSync: function(url, data, success, type, guid)
            {
                if (!guid) guid = BSC.U.NewGUID();
                if (!ajaxXhr[guid]) ajaxXhr[guid] = {};
                //if (url.toLowerCase().indexOf("/ajax") == -1) url = "/ajax" + url;
                if (url.toLowerCase().indexOf("/ajax") > -1) url = url.toLowerCase().replace(/\/ajax/, i); // +url;

                var threadGuid = url + guid;

                if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid])
                {
                    //debugger;
                    ajaxXhr[guid][threadGuid].abort();
                    delete ajaxXhr[guid][threadGuid];
                }

                //if (typeof (data) == "string") data = BSC.U.ParseQuery(data);
                var d = (data) ? data : {};
                d.__guid = guid;
                //if (BSC.D.P.IsLoggedIn() && BSC.D.P.GetData().TicketID != "00000000-0000-0000-0000-000000000000")
                d.__ticketid = BSC.D.P.GetData().TicketID;
                //else
                //    data.__ticketid = "00000000-0000-0000-0000-000000000000";

                url = url.toLowerCase();

                var sr = $.ajax({
                    type: "GET",
                    async: false,
                    url: url,
                    data: data,
                    contentType: 'text/html; charset=utf-8',
                    dataType: "html"
                });

                if (type == "html") return sr.responseText;
                var r = BSC.D.JSON.Parse(sr);
                return (r) ? r.d : null;
            },

            AjaxPostSync: function(url, data, success, type, guid)
            {
                if (!guid) guid = BSC.U.NewGUID();
                if (!ajaxXhr[guid]) ajaxXhr[guid] = {};
                //if (url.toLowerCase().indexOf("/ajax") == -1) url = "/ajax" + url;
                if (url.toLowerCase().indexOf("/ajax") > -1) url = url.toLowerCase().replace(/\/ajax/, i); // +url;

                var threadGuid = url + guid;

                if (ajaxXhr && ajaxXhr[guid] && ajaxXhr[guid][threadGuid])
                {
                    //debugger;
                    ajaxXhr[guid][threadGuid].abort();
                    delete ajaxXhr[guid][threadGuid];
                }

                //if (typeof (data) == "string") data = BSC.U.ParseQuery(data);
                var d = (data) ? data : {};
                d.__guid = guid;
                //if (BSC.D.P.IsLoggedIn() && BSC.D.P.GetData().TicketID != "00000000-0000-0000-0000-000000000000")
                d.__ticketid = BSC.D.P.GetData().TicketID;
                //else
                //    data.__ticketid = "00000000-0000-0000-0000-000000000000";

                url = url.toLowerCase();

                var sr = $.ajax({
                    type: "POST",
                    async: false,
                    url: url,
                    data: data,
                    contentType: 'text/html; charset=utf-8',
                    dataType: "html"
                });

                //var sr = $.post(url, d, null, type);
                if (type == "html") return sr.responseText;
                var r = BSC.D.JSON.Parse(sr.responseText);
                return (r) ? r.d : null;
            },

            AjaxAbort: function(guid)
            {
                return;
                //                if (!ajaxXhr[guid]) return;

                //                //debugger;

                //                for (k in ajaxXhr[guid])
                //                {
                //                    ajaxXhr[guid][k].abort();
                //                    delete ajaxXhr[guid][k];
                //                }
                //                delete ajaxXhr[guid];
            },

            Get: function(u, d, s, co, json)
            {
                if (!u || u.length == 0) return false;
                if (!d) d = {};

                var beforeSendF = function(xml)
                {
                    if (co) xml.setRequestHeader("X-OnlyContent", "true");
                    if (json) xml.setRequestHeader("X-IsJson", "true");
                };
                if (u.toLowerCase().indexOf("/ajax") == -1)
                    u = "/ajax" + u;
                $.ajax({
                    type: "Post",
                    url: u,
                    data: d,
                    contentType: 'text/html; charset=utf-8',
                    dataType: "html",
                    beforeSend: beforeSendF,
                    success: s
                });
            },

            Post: function(u, d, s, t)
            {
                if (d)
                {
                    d.TicketID = (BSC.D.P.GetData()).TicketID;
                }
                if (u.toLowerCase().indexOf("/ajax") == -1)
                    u = "/ajax" + u;
                $.post(u, d, s, t);
            },
            //			Post: function(u, d, s, co, json)
            //			{
            //				if (!u || u.length == 0) return false;
            //				if (!d) d = {};

            //				var beforeSendF = function(xml)
            //				{
            //					if (co) xml.setRequestHeader("X-OnlyContent", "true");
            //					if (json) xml.setRequestHeader("X-IsJson", "true");
            //				};
            //				if (u.toLowerCase().indexOf("/ajax") == -1)
            //					u = "/ajax" + u;
            //				$.ajax({
            //					type: "Post",
            //					url: u,
            //					data: d,
            //					contentType: 'text/html; charset=utf-8',
            //					dataType: "html",
            //					beforeSend: beforeSendF,
            //					success: s
            //				});
            //			},

            Param: function(type)
            {
                this.data = { __type: type };
                this.Add = function(name, value) { this.data[name] = value; };
            },

            OnError: function(XMLHttpRequest, textStatus, errorThrown)
            {
                alert("OnError: " + errorThrown);
            },

            OnServiceCallback: function(data)
            {
                if (!data) return;

                for (key in data)
                {
                    if (key == "chat")
                        BSC.UI.Ws.Chat.ParseData(data[key]);
                    //			        else if(key=="newmailcount")
                    //			            BSC.UI.Chat.ParseData(data[key]);
                    //			        else if(key=="profileonline")
                    //			            BSC.UI.Chat.ParseData(data[key]);
                }
                /*
                var data =
                {
                "chat" : {guid:'', [{tabid:'', messages:[]}]},
                "newmailcount" : 0,
                "profileonline" : []
                }
                */
            }
        };
    } ();
})();
