var GremlnEvent = function() {
    
    var _listeners = [];
    
    this.subscribe = function(fn) {
        _listeners.push(fn);
    }
    
    this.hasListeners = function() {
        return _listeners.length > 0;
    }
    
    this.fire = function(sender, eventArgs) {
        $.each(_listeners, function(i, obj) {
            obj(sender, eventArgs);
        });
    }
};

var SessionTimer = (function() {

    var _timer;
    var _interval;
    var _fn;
    
    function _start() {
        _timer = setTimeout(_fn, _interval);
    }
    
    return {
    
        start: function(fn, interval) {
            _interval = interval;
            _fn = fn;
            
            _start();
        },
    
        reset: function() {
            clearTimeout(_timer);
            _start();
        },
        
        stop: function() {
            clearTimeout(_timer);
        }
    };
})();

var Gremln = (function() {

    var _console;
    var _self = this;
    var _linkRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

    if (typeof console === "undefined" || typeof console.log === "undefined") {
        _console = {};
        _console.log = function() {};
    }
    else {
        _console = console;
        _console.log = console.log;
    }

    return {
        parseBool : function(str) {
            return str.toLowerCase() === 'true';
        },
        
        exists: function(obj) {
            return (typeof obj !== 'undefined' && obj != null);
        },
        
        isTrue: function(obj) {
            return this.exists(obj) && obj;
        },
        
        ajaxPOST: function(params) {
            var jsonData = $.toJSON(params.data);

            $.ajax({
                type: "POST",
                async: true,
                contentType: "application/json; charset=utf-8",
                data: jsonData,
                dataType: "json",
                url: params.url,
                success: function (json, status) {
                    if (params.success) {
                        params.success(json);
                    }
                    
                    if (params.always) {
                        params.always();
                    }
                },
                error: function(xhr, status, error) {
                    Gremln.log('[ajax error] xhr:', xhr, ' status:', status, ' error:', error);
                    
                    if (params.error) {
                        params.error(xhr, status, error);
                    }
                    
                    if (params.always) {
                        params.always();
                    }
                }
            });   
        },
        
        log: function() {
            _console.log(arguments);
        },
        
        addLinks: function(str) {
            if (str !== null && typeof str === 'string') {
                return result = str.replace(_linkRegex, "<a target='_blank' href='$1'>$1</a>");
            }
        },
        
        buildComposite: function() {
            return [].slice.call(arguments).join('_');
        },
        
        buildCompositeSelector: function() {
            return $('#' + [].slice.call(arguments).join('_'));
        },
        
        extend: function(base, constructor) {
            var obj = new Function();
            obj.prototype = base.prototype;
            constructor.prototype = new obj();
            constructor.prototype.constructor = constructor;
        }
    }
})();

var Assign = (function () {
    Gremln.log('init assign');
    var _messages = [];

    return {
        set: function (args) {
            Gremln.log('popup assign', args);
            _messages = args.dataItems;
            Gremln.log('messages', _messages);
        },

        assign: function (id) {
            Gremln.log(id, _messages);

			Gremln.ajaxPOST({
                url: '/Services/AssignService.asmx/Assign',
                data: {
                    p_intUserId: id,
                    p_arrDataItems: $.toJSON(_messages)
                },
                success: function (data) {
                    Gremln.log('success');
                }
            });
        }
    }
})();

var Translate = (function () {

    var _text = null;
    var _callback = null;

    return {

        setDelayed: function (text, callback) {
            _text = text;
            _callback = callback;
        },

        translateDelayed: function (from, to) {
            this.translate(_text, from, to, _callback);
        },
        
        translate: function(text, from, to, callback) {
            Gremln.ajaxPOST({
                url: '/Services/TranslationService.asmx/Translate',
                data: {
                    p_strText: text,
                    p_strLanguageFrom: from,
                    p_strLanguageTo: to
                },
                success: function (data) {
                    var result = $.parseJSON(data.d).text;
                    
                    if (Gremln.exists(callback)) {
                        callback(result);
                    }
                }
            });
        }
    }
})();


function PreloadImages()
{
    //preload loading image:
    var imgLoading = new Image();
    imgLoading.src = "http://content.gremln.com/loading2.gif";
}

// Performs an AJAX POST request.

function openOAuthWin(loginFrom, network, chkRememberme) {

    var strUrl = "http://" + window.location.host + "/" + loginFrom + "?initial=true&oauth=" + network;

    if (typeof chkRememberMe === 'undefined' || chkRememberme === null) {
        chkRememberme = false;
    }

    strUrl += "&remember_me=" + chkRememberme;

    window.open(strUrl, "twcWindow", 'width=800,height=400,left=100,top=100,scrollbars=1,resizable=1');

    return false;
}

function ChangeImg(id, action) 
{
    if(document.images)
    {
        var strLoading = "http://content.gremln.com/loading2.gif";
        
        if (action=="loading") {
            document.getElementById(id).src = strLoading;
        } 
        else {
            document.getElementById(id).style.display = "block";
        }
    }
}

function resizeFancyBox() {

    var window = document.parentWindow || document.defaultView;
    var iframe = $((document.parentWindow || document.defaultView).frameElement);

    iframe.height(5);
    iframe.width(5);

    var height = document.documentElement.scrollHeight > 768 ? 768 : document.documentElement.scrollHeight;
    var width = document.documentElement.scrollWidth > 768 ? 768 : document.documentElement.scrollWidth;

    iframe.height(height);
    iframe.width(width);

    var wrap = iframe.parents('#fancybox-wrap');
    var inner = iframe.parents('#fancybox-inner');
    var content = iframe.parents('#fancybox-content');

    wrap.height(height + 20);
    wrap.width(width + 20);
    inner.height(height);
    inner.width(width);
    content.height(height);
    content.width(width);

    parent.$.fancybox.center();
}

function resizeFancyBox2(maxHeight, maxWidth) {

    var window = document.parentWindow || document.defaultView;
    var iframe = $((document.parentWindow || document.defaultView).frameElement);

    iframe.height(5);
    iframe.width(5);

    var height = document.documentElement.scrollHeight > maxHeight ? maxHeight : document.documentElement.scrollHeight;
    var width = document.documentElement.scrollWidth > maxWidth ? maxWidth : document.documentElement.scrollWidth;

    iframe.height(height);
    iframe.width(width);

    var wrap = iframe.parents('#fancybox-wrap');
    var inner = iframe.parents('#fancybox-inner');
    var content = iframe.parents('#fancybox-content');

    wrap.height(height + 20);
    wrap.width(width + 20);
    inner.height(height);
    inner.width(width);
    content.height(height);
    content.width(width);

    parent.$.fancybox.center();
}


function closeform() { parent.$.fancybox.close(); }

function CloseFormAndParentReload() {
    parent.$.fancybox.close();
    parent.location.reload(true); 
}
//    
