﻿// JSLint Config:
/*jslint browser: true */
/*global cc, jQuery, cc_resx_CDN_URL, cc_resx_TR_Loading, cc_resx_TR_Error_Refresh_Page
*/

//  
//  Author: Kevin Burkitt
//  Date:   2010-02-25
//
cc.ajax = function() {

    var cc_class = '.cc-ajaxload';

    return {
        displayErrorTimer: null,

        init: function(container) {

            // SET  
            jQuery('a.' + cc_class, container).each(function() {
                var target = jQuery(this).attr('cc:target');
                var url = jQuery(this).attr('cc:href');
                if (typeof url === 'undefined' || url === '') {
                    url = jQuery(this).attr('href');
                }

                jQuery(this).click(function() {
                    cc.ajax.load(target, url);
                    return false;
                });
            });
        },

        load: function(target, url, callback, backgroundLoad, suppressTracking) {
            var t = target;
            // Adds random Querystring value to prevent Ajax caching in IE
            var u = cc.helpers.addAjaxNoCacheParam(url);
            var c = callback;
            var sT = suppressTracking;
            var bg = false;
            // if backgroundLoad true, don't display any animation/loading effects
            if (typeof backgroundLoad !== 'undefined' && backgroundLoad === true) {
                bg = true;
            }

            if (bg !== true) {
                try {
                    // LOADING ANIMATION:

                    var offset = jQuery(t).offset();

                    jQuery('<div />').addClass('loading-clear').css(
                            'width', jQuery(t).width() + 'px').css(
                              'height', jQuery(t).height() + 'px').css(
                                'line-height', jQuery(t).height() + 'px').css(
                                    'top', offset.top + 'px').css(
                                        'left', offset.left + 'px').html(
                                            '<img alt="' + cc_resx_TR_Loading + '" src="' + cc_resx_CDN_URL + 'images/ajax-loading.gif">').prependTo(
                                                'body').show().removeAttr("filter");

                    jQuery('[cc\\:target=\'' + t + '\']').each(function() {
                        var offset = jQuery(this).offset();
                        jQuery('<div />').addClass('loading-clear').css(
                                'width', jQuery(this).width() + 'px').css(
                                    'height', jQuery(this).height() + 'px').css(
                                        'top', offset.top + 'px').css(
                                            'left', offset.left + 'px').css(
                                                'line-height', jQuery(this).height() + 'px').prependTo(
                                                    jQuery(this)).show().removeAttr("filter");
                    });

                    if (jQuery.browser.msie) {
                        // jQuery(t).stop(true, true).animate({ 'opacity': "0.50" }, 1000, function() { jQuery(t).removeAttr("style"); });
                    } else {
                        jQuery(t).stop(true, true).animate({ 'opacity': "0.50" }, 1000, function() { jQuery(t).removeAttr("style"); });
                    }

                } catch (e) { }
            }


            jQuery(t).load(
                u,
                function(responseText, textStatus, XMLHttpRequest) {

                    // redirect if server says so
                    if (cc.ajax.checkRedirectHeader(XMLHttpRequest) === true) {
                        return;
                    }

                    // Init loaded content
                    cc.init(t);

                    // Track Page View
                    if (sT !== true) {
                        cc.tracking.trackPageView(u);
                    }


                    // Remove loading animations
                    jQuery('.loading,.loading-clear').remove();

                    if (jQuery.browser.msie) {
                        jQuery(t).css('display', 'block');
                    } else {
                        jQuery(t).stop(true, true).animate({ 'opacity': "1" }, 200, function() { jQuery(t).removeAttr("style"); });
                    }

                    // Remove loading animations
                    if (typeof c === 'function') {
                        c();
                    }
                });

        },

        formSubmit: function(f, p, c, c_complete) {
            var defaults = {};

            var target = '';
            if (typeof p !== 'undefined' && typeof p.target !== 'undefined') {
                target = p.target;
            }

            var cb = {
                success: function(responseText, statusText, xhr, jQueryform) {
                    // todo: loading animation & disable button here:

                    if (typeof c === 'function') {
                        c(responseText, statusText, xhr, jQueryform);
                    }
                },
                complete: function() {
                    // redirect if server says so
                    if (cc.ajax.checkRedirectHeader(XMLHttpRequest) === true) {
                        return;
                    }

                    // Init loaded content
                    if (target !== '') {
                        cc.init(target);
                    }

                    // todo: loading animation & disable button - here?

                    if (typeof c_complete === 'function') {
                        c_complete();
                    }
                }
            };

            var options = jQuery.extend(
                defaults,
                p || {},
                cb);

            jQuery(f).ajaxSubmit(options);
        },


        formAjaxSubmit: function(form) {
            var target = jQuery(form).attr('cc:target');

            jQuery(form).ajaxSubmit({
                target: target,
                complete: function() {
                    cc.init(target);
                }
            });
            return false;
        },

        getJSON: function(url, data, callback, completeCallback) {
            // Adds random Querystring value to prevent Ajax caching in IE
            var u = cc.helpers.addAjaxNoCacheParam(url);
            var d = data || {};
            var c = callback;
            var cComplete = completeCallback;
 
            jQuery.ajax({
                type: 'POST',
                url: u,
                dataType: 'json',
                cache: false,
                data: d,
                success: c,
                complete: function() {
                    // redirect if server says so
                    if (cc.ajax.checkRedirectHeader(XMLHttpRequest) === true) {
                        return;
                    }

                    if (typeof cComplete === 'function') {
                        cComplete();
                    }
                }
            });

        },

        execJSONP: function(url, data, strJsonPCallback, jsonPCallback) {
            // Adds random Querystring value to prevent Ajax caching in IE
            var u = cc.helpers.addAjaxNoCacheParam(url);
            var d = data || {};
            var strCb = strJsonPCallback;
            var fncCb = jsonPCallback;

            jQuery.ajax({
                type: 'GET',
                url: u,
                dataType: 'jsonp',
                cache: false,
                data: d,
                jsonpCallback: strCb,
                success: fncCb
            });

        },

        checkRedirectHeader: function(xmlReq) {

            try {
                if (typeof xmlReq !== 'undefined') {
                    var header = '';
                    if (typeof xmlReq === 'function') {
                        if (typeof xmlReq().getResponseHeader === 'function') {
                            header = xmlReq().getResponseHeader("CC-Redirect");
                        }
                    } else {
                        if (typeof xmlReq === 'Object') {
                            if (typeof xmlReq.getResponseHeader === 'function') {
                                header = xmlReq.getResponseHeader("CC-Redirect");
                            }
                        }
                    }

                    if (typeof header !== 'undefined' && header !== '') {
                        // cc.log('CC-Redirect Header Recevied: ' + header);
                        // cc.ui.showModalErrorMessage('Redirecting...');
                        location.href = xmlReq.getResponseHeader("CC-Redirect");
                        return true;
                    }
                }
            } catch (e) {
                // cc.log('Error looking up ajax response headers');
            }
            return false;
        },

        displayAjaxError: function(msg) {
            if (jQuery('#ajax-error').size() > 0) {
                jQuery('#ajax-error').remove();
            }

            if (typeof msg === 'undefined' || msg === '') {
                msg = cc_resx_TR_Error_Refresh_Page;
            }

            jQuery('<div />').attr('id', 'ajax-error').html('<div class="page-center"><p>' + msg + '</p></div>').appendTo('body');

            if (typeof cc.ajax.displayErrorTimer !== 'undefined') {
                clearTimeout(cc.ajax.displayErrorTimer);
            }

            cc.ajax.displayErrorTimer = setTimeout(function() {
                jQuery('#ajax-error').fadeOut(3000);
            }, 4000);
        }
    };

} ();


