﻿fliptoJsData = (typeof fliptoJsData == 'undefined') ? {} : fliptoJsData;

Flipto = (typeof Flipto == 'undefined') ? {} : Flipto;

Flipto.signup = new function () {
    var _hostName = 'flip.to';
    var _domain = document.location.protocol + '//' + _hostName;
    var _isPostMessageScriptAdded = false, _isJqueryUIScriptAdded = false;
    var _settings = null;

    var _params = {
        autoInit: 'autoinit',
        debug: 'debug'
    };

    var _pageTypes = {
        none: 0,
        promoter: 1,
        magnet: 2
    };

    var _configs = {
        pageType: _pageTypes.none,
        parentId: '',
        code: '',
        campaign: '',
        language: '',
        isDebug: false,
        isManualInit: false
    };

    var _css = {
        promoterPage: 3,
        magnetPage: 11
    };

    var _urls = {
        jquery: '//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
        jqueryUI: '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js',
        promoterPage: _domain + '/external/signup.aspx',
        magnetPage: _domain + '/external/dialog.aspx',
        postMessage: _domain + '/media/js/jquery.postmessage.min.js',
        stylesheet: _domain + '/external/stylesheet.aspx'
    };

    var _scriptParamKeys = {
        code: 'flipto',
        location: 'loc',
        campaign: 'c',
        language: 'lang'
    };

    var _urlParamKeys = {
        url: 'url',
        code: 'flipto',
        campaign: 'cid',
        language: 'lang',
        type: 'type'
    };

    var _ids = {
        landing: 'ft-landing',
        quote: 'ft-quote',
        action: 'ft-action',
        dialog: 'ft-dialog',
        dialogShow: 'ft-dialog-show',
        dialogHide: 'ft-dialog-hide',
        iframe: 'fliptoFrame'
    };

    var _postMessageIds = {
        pageLoaded: '1',
        pageRedirect: '2',
        saveCookie: '3',
        actionComplete: '4'
    };

    this.init = function () {
        getParams();

        if (_configs.isManualInit) {
            setup();
            return;
        }

        addLoadEvent(setup);
    };

    var getParams = function () {
        try {
            var ftScripts = document.getElementsByTagName('script');
            var ftScript = ftScripts[ftScripts.length - 1];
            var qs = ftScript.src.replace(/^[^\?]+\??/, '');

            var ftParams = parseQuery(qs);

            _configs.code = getUrlParameterValue(_scriptParamKeys.code);
            _configs.parentId = ftParams[_scriptParamKeys.location];
            _configs.campaign = ftParams[_scriptParamKeys.campaign];
            _configs.language = ftParams[_scriptParamKeys.language];
            _configs.isDebug = ftParams[_params.debug] == '1';
            _configs.isManualInit = ftParams[_params.autoInit] == '0';
            _configs.pageType = getPageType();
        }
        catch (e) { }
    };

    var getSettings = function () {
        if (!isFliptoJsDataValid() || isEmptyString(fliptoJsData.Settings))
            return new Object();

        try {
            var settingsData = decodeFliptoJsData(fliptoJsData.Settings);
            var settings = eval('(' + settingsData + ')');
            return settings;
        }
        catch (e) { return new Object(); }
    };

    var addLoadEvent = function (func) {
        var oldonload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = func;
        }
        else {
            window.onload = function () {
                if (oldonload) {
                    oldonload();
                }
                func();
            }
        }
    };

    var getPageType = function () {
        if (isEmptyString(_configs.parentId))
            return _pageTypes.none;

        if (!isEmptyString(_configs.code))
            return _pageTypes.promoter;

        if (!isEmptyString(_configs.campaign) && !isEmptyString(_configs.language))
            return _pageTypes.magnet;

        return _pageTypes.none;
    };

    var setup = function () {

        if (!isJQueryLoaded()) {
            addScriptFile(_urls.jquery);
        }

        configurePageStyleSheet();

        load();
    };

    var load = function () {
        if (!isJQueryLoaded()) {
            setTimeout(function () { load(); }, 20);
            return;
        }

        if (_settings == null) {
            _settings = getSettings();
            if (!isEmptyString(_settings.parentId))
                _configs.parentId = _settings.parentId;
        }

        if (isJQueryUIRequired() && !isJQueryUILoaded()) {
            if (!_isJqueryUIScriptAdded) {
                addScriptFile(_urls.jqueryUI);
                _isJqueryUIScriptAdded = true;
            }

            setTimeout(function () { load(); }, 20);
            return;
        }


        if (!isJQueryPostMessageLoaded()) {
            if (!_isPostMessageScriptAdded) {
                addScriptFile(_urls.postMessage);
                _isPostMessageScriptAdded = true;
            }

            setTimeout(function () { load(); }, 20);
            return;
        }

        switch (_configs.pageType) {
            case _pageTypes.promoter:
                configurePromoterPage();
                break;

            case _pageTypes.magnet:
                configureMagnetPage();
                break;

            default:
                return;
        }
    };

    var configurePromoterPage = function () {

        var isQuickLoad = isFliptoJsDataValid() && !isEmptyString(fliptoJsData.Html);

        if (!isQuickLoad)
            addPromoterIFrame(true);
        else
            addQuickLoadData();

        hookPostMessage();
    };

    var addQuickLoadData = function () {

        try {
            var html = decodeFliptoJsData(fliptoJsData.Html);
            var position = _settings.position;
            var animation = _settings.animation;

            if (isEmptyString(html))
                return;

            jQuery(document.createElement('div'))
            .attr('id', _ids.landing)
            .addClass(!isEmptyString(position) ? 'ft-' + position : '')
            .addClass(!isEmptyString(animation) ? 'ft-animated' : '')
            .html(html)
            .appendTo('#' + _configs.parentId);


            jQuery('#' + _ids.dialogShow + ',#' + _ids.dialogHide).click(function (e) {
                toggleDialog(e, _ids.dialog);
            });

            if (!isEmptyString(animation))
                animate(animation);
        }
        catch (e) { }
    }

    var addPromoterIFrame = function (isLoadHidden) {
        var iframeSrc = _urls.promoterPage + '?' + _urlParamKeys.code + '=' + _configs.code;
        if (!isEmptyString(_configs.campaign))
            iframeSrc += '&' + _urlParamKeys.campaign + '=' + _configs.campaign;

        if (_configs.isDebug)
            iframeSrc += '&' + _params.debug + '=1';

        //adds current url for postback operations
        iframeSrc += '&' + _urlParamKeys.url + '=' + encodeURIComponent(document.location.href);

        var iframe = jQuery(document.createElement('iframe'))
            .attr('id', _ids.iframe)
            .attr('src', iframeSrc)
            .attr('scrolling', 'no')
            .attr('border', '0')
            .attr('frameBorder', '0')
            .attr('allowTransparency', 'true');

        if (isLoadHidden && window.postMessage)
            iframe.hide();

        iframe.appendTo('#' + _configs.parentId);
    }

    var configureMagnetPage = function () {
        if (!isFliptoJsDataValid())
            return;

        addQuickLoadData();

        hookPostMessage();
    };

    var addMagnetIFrame = function () {
        var iframeSrc = _urls.magnetPage + '?' + _urlParamKeys.campaign + '=' + _configs.campaign + '&' + _urlParamKeys.language + '=' + _configs.language;

        if (_configs.isDebug)
            iframeSrc += '&' + _params.debug + '=1';

        //adds current url for postback operations
        iframeSrc += '&' + _urlParamKeys.url + '=' + encodeURIComponent(document.location.href);

        var iframe = jQuery(document.createElement('iframe'))
            .attr('id', _ids.iframe)
            .attr('src', iframeSrc)
            .attr('scrolling', 'no')
            .attr('border', '0')
            .attr('frameBorder', '0')
            .attr('allowTransparency', 'true');

        iframe.appendTo('#' + _ids.dialog);
    };

    var hookPostMessage = function () {
        if (window.postMessage) {
            jQuery.receiveMessage(function (e) { onPageReceiveJQueryMessage(e) }, _domain);
        }
    };

    var animate = function (animation) {
        if (animation.length > 0) {
            var a = animation[0];
            jQuery('#' + a[0]).show(a[1], a[2], a[3], function () {
                animation.shift();
                animate(animation);
            });
        }
    };

    var toggleDialog = function (e, id) {
        if (e != null)
            e.preventDefault();

        var dialog = jQuery('#' + id);

        if (dialog.is(':visible')) {
            dialog.hide();
        }
        else {
            if (jQuery('#' + _ids.iframe).length == 0) {
                switch (_configs.pageType) {
                    case _pageTypes.promoter:
                        addPromoterIFrame(false);
                        break;

                    case _pageTypes.magnet:
                        addMagnetIFrame();
                        break;
                }
            }

            if (isJQueryUILoaded()) {
                dialog.show('fade', null, 200);
            }
            else {
                dialog.show();
            }
        }
    };

    var onPageReceiveJQueryMessage = function (e) {
        try {
            var data = e.data;
            var params = parseQuery(data);

            var msgId = params['id'];
            if (isEmptyString(msgId))
                return;

            switch (msgId) {
                case _postMessageIds.pageLoaded:
                    jQuery('#' + _ids.iframe).show();
                    break;

                case _postMessageIds.pageRedirect:
                    var url = params['info'];
                    if (!isEmptyString(url))
                        window.location = url;
                    break;

                case _postMessageIds.saveCookie:
                    var cookieString = params['info'];
                    if (!isEmptyString(cookieString))
                        document.cookie = cookieString;
                    break;

                case _postMessageIds.actionComplete:
                    try {
                        jQuery('#' + _ids.dialog).hide();
                        jQuery('#' + _ids.dialogShow).hide();
                    }
                    catch (edialog) { }
                    break;
            }
        }
        catch (err) { }
    };

    var isJQueryLoaded = function () {
        return (typeof jQuery != 'undefined');
    };

    var isJQueryUILoaded = function () {
        return (isJQueryLoaded()) ? (typeof jQuery.ui != 'undefined') : false;
    };

    var isJQueryUIRequired = function () {
        return (!isEmptyString(_settings.animation));
    };

    var isJQueryPostMessageLoaded = function () {
        return (typeof jQuery.receiveMessage != 'undefined');
    };

    var addScriptFile = function (url) {
        var script = document.createElement("script");
        script.setAttribute('src', url);
        script.setAttribute('type', "text/javascript");
        document.body.appendChild(script);
    };

    var parseQuery = function (query) {
        var params = {};
        if (!query) return params;
        var pairs = query.split(/[;&]/);
        for (var i = 0; i < pairs.length; i++) {
            var keyVal = pairs[i].split('=');
            if (!keyVal || keyVal.length != 2) continue;
            var key = unescape(keyVal[0]);
            var val = unescape(keyVal[1]);
            val = val.replace(/\+/g, ' ');
            params[key] = val;
        }
        return params;
    };

    var getUrlParameterValue = function (name) {
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = '[\\?&]' + name + '=([^&#]*)';
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);

        if (results == null)
            return '';
        else
            return encodeURIComponent(results[1]);
    };

    var configurePageStyleSheet = function () {
        if (!document.styleSheets)
            return;

        if (isFliptoJsDataValid()) {
            try {

                if (!isJQueryLoaded()) {
                    setTimeout(function () { configurePageStyleSheet(); }, 20);
                    return;
                }

                var css = decodeFliptoJsData(fliptoJsData.Css);
                addDomCssData(css);
                return;
            }
            catch (e) { }
        }

        var code = '', cssType = 0;
        switch (_configs.pageType) {
            case _pageTypes.promoter:
                code = _configs.code;
                cssType = _css.promoterPage;
                break;

            case _pageTypes.magnet:
                code = _configs.campaign;
                cssType = _css.magnetPage;
                break;

            default:
                return;
        }

        var cssUrl = _urls.stylesheet + '?' + _urlParamKeys.code + '=' + code + '&' + _urlParamKeys.type + '=' + cssType + '&' + new Date().getTime().toString();
        addDomCssFile(cssUrl);
    };

    var isFliptoJsDataValid = function () {
        return (typeof fliptoJsData == 'object' && typeof fliptoJsData.Css == 'string' && typeof fliptoJsData.Settings == 'string');
    };

    var decodeFliptoJsData = function (data) {
        if (typeof data != 'string' || data == null || data == '')
            return '';

        var decoded = jQuery('<div/>').html(data).text();
        return decoded;
    };

    var addDomCssData = function (css) {
        var head = document.getElementsByTagName('head')[0];
        var style = document.createElement('style');
        var rules = document.createTextNode(css);
        style.type = 'text/css';

        if (style.styleSheet)
            style.styleSheet.cssText = rules.nodeValue;
        else
            style.appendChild(rules);

        head.appendChild(style);
    };

    var addDomCssFile = function (cssUrl) {
        var head = document.getElementsByTagName("head")[0];
        var cssNode = document.createElement('link');
        cssNode.type = 'text/css';
        cssNode.rel = 'stylesheet';
        cssNode.href = cssUrl;
        cssNode.media = 'screen';
        head.appendChild(cssNode);
    };

    var isEmptyString = function (str) {
        return (typeof str == 'undefined' || str == null || str == '');
    };

    var setCookieValue = function (name, value, expirationDate) {
        try {
            var expires = '';
            try {
                var d = new Date(expirationDate);
                expires = ';expires=' + d.toUTCString();
            }
            catch (ed) { }

            document.cookie = name + "=" + value + expires + "; path=/";
        }
        catch (e) { }
    };
};

Flipto.signup.init();
