/*Default padding to add to IFRAME height, this helps with differences between browsers...*/
var $const_SizePadding = 10;
/*Default minimum level for breadcrumbs...*/
var $const_MinLevel = 3;
/*The default breadcrumb level sepperator character...*/
var $const_Sepperator = '»';
/*reference to open jq modal*/
var $openJqModal;
/*reference to open jq modal iframe*/
var $openJqModalIframe;
/*reference to open jq modal*/
var $previousIframeSrc;
/*loading page*/
var $loadingPageSrc = '/static/loading.html';
/* regex for undecorated div*/
var decoratedRegex = '^#decorated';


/*IFRAME interface initialization defaults...*/
var initDefaults = {iframeId:'iframeObj',iframeName:'iframeObj',breadcrumbId:'breadcrumb',ratingsId:'ratings',ratingsCallback:null,keepAliveCallback:null};
/*IFRAME resize defaults...*/
var iframeResizeDefaults = {height:-1};
/*Breadcrumb interface defaults...*/
var breadcrumbDefaults = {level:$const_MinLevel,newLevels:new Array()[{display:null,url:null}]};
/*Rate this page interface defaults...*/
var rateThisPageDefaults = {enabled:true,ratePage:null};
/*Show dialog defaults...*/
var showDialogDefaults = {dialogId:'dialog',modal:false,chromeless:false,title:'Dialog',src:'',width:450,height:250,hideClose:false,callback:''};


var $_closeOpenJqmDialog = function() {
    var modal = $openJqModal;
    // hide the open modal
    modal.jqmHide();
    modal.css({display:'none'});
    // set the modal iframe src attr back to the original
    if ($openJqModalIframe) {
        $openJqModalIframe.html('').attr('src', $loadingPageSrc);
    }
    // reset the handle to the open modal
    $openJqModal = '';
    return false;
};


/**
 * Private function. This Function helps with creating a breadcrumb entry object.
 * @param display The text to display for the breadcrumb entry.
 * @param href The href to link to for the breadcrumb entry.
 * @param target The IFRAME name to target for the link.
 */
var $_createBreadcrumbEntry = function(display, href, target) {
    var entry = $('<a></a>');
    if (href) entry.attr('href', href);
    entry.attr('target', target);
    entry.html(display);
    return entry;
};


/**
 * Private function that extends jqModal to load the modal contents in an iframe
 * @param opts
 */
var $_loadInIframeModal = function(opts)
{
    var divContainer = opts.target
    var iframeContainer = divContainer + 'Content';
    var modalTitleContainer = divContainer + 'Title';
    var modalTitleTextContainer = divContainer + 'TitleText';
    var holder = $(divContainer).jqm({overlay:30, modal:true, target: iframeContainer, toTop:true});
    var hash = $.jqm.hash[holder[0]._jqm];
    var scrolling = opts.scrolling;
    var autoResizeString = opts.autoResize;
    var autoResize = true;
    var frameStyle = {backgroundColor:'transparent', border:'0',width:'100%',height:'90%'};
    var trigger = $(opts.trigger);
    var modal = $(hash.w);
    var myUrl = trigger.attr('href');
    var myTitle = trigger.attr('title');
    var height = new Number(trigger.attr('height'));
    var width = new Number(trigger.attr('width'));
    //set default width and height if not specified
    if(isNaN(height)) height = new Number(400);
    if(isNaN(width)) width = new Number(800);
  
    if (scrolling == null || $.trim(scrolling).length <= 0) {
      if(divContainer.search(decoratedRegex) >= 0) {scrolling = 'auto';} else {scrolling = 'no';}
    } else if ($.trim(scrolling).toLowerCase() == 'auto') {
      scrolling = 'auto';
    } else if ($.trim(scrolling).toLowerCase() == 'yes') {
      scrolling = 'yes';
    } else if ($.trim(scrolling).toLowerCase() == 'no') {
      scrolling = 'no';
    } else {
      if(divContainer.search(decoratedRegex) >= 0) {scrolling = 'auto';} else {scrolling = 'no';}
    }
    modal.find(iframeContainer).attr('scrolling', scrolling);

    if (autoResizeString != null && $.trim(autoResizeString).toLowerCase() == 'false' ) {
      autoResize = false;
    }
    var modalContent = $("iframe", modal);
    $openJqModalIframe = modalContent;
    $previousIframeSrc = modalContent.html('').attr('src');
    modalContent.html('').attr('src', myUrl);
    //var alternateModal = $(iframeContainer);
    modalContent.css(frameStyle);
    //let's use the anchor "title" attribute as modal window title
    $(modalTitleTextContainer).text(myTitle);

    modal.jqmShow();
    modal.css({display:'block'});
    $openJqModal = modal;

    //set height/width
    var titleBarHeight = 0;
    if(divContainer.search(decoratedRegex) >= 0) {
      if ($.browser.msie && $.browser.version.substr(0,1)<8) modal.find(modalTitleTextContainer).width(width - 30);
      if (modal.find(modalTitleContainer).length > 0) titleBarHeight = modal.find(modalTitleContainer).outerHeight();
      modal.height(height);
      modal.find(iframeContainer).width(width);
      modal.find(iframeContainer).height(height - titleBarHeight);
    } else {
      modal.find(iframeContainer).width(width);
      modal.find(iframeContainer).height(height);
    }

    // add some sophistication in calculating the modal positioning
    var windowHeight = $(window).height();
    var windowWidth = $(window).width();
    var scrollHeight = $(window).scrollTop();
    var scrollLeft = $(window).scrollLeft();
    var modalHeight = modal.outerHeight();
    var modalWidth = modal.outerWidth();
    if ((modalWidth > windowWidth) && autoResize) {
      // modal to big for window. Resize
      modal.find(iframeContainer).width(windowWidth - 30);
      if ($.browser.msie && $.browser.version.substr(0,1)<8) modal.find(modalTitleTextContainer).width(windowWidth - 60);
    }
    if ((modalHeight > windowHeight) && autoResize) {
      // modal too big for window, re-size
      if(divContainer.search(decoratedRegex) >= 0) {
        modal.height(windowHeight - 30);
        modal.find(iframeContainer).height(windowHeight - 30 - titleBarHeight);
      } else {
        modal.find(iframeContainer).height(windowHeight - 30);
      }
    }
    // position modal
    modalHeight = modal.outerHeight();
    modalWidth = modal.outerWidth();
    var modalTop = 0;
    var modalLeft = 0;
    if ($.trim(modal.css('position')).toLowerCase() == 'fixed') {
      modalTop = Math.round((windowHeight - modalHeight) / 2);
      modalLeft = Math.round((windowWidth - modalWidth) / 2);
    } else {
      modalTop = Math.round((windowHeight - modalHeight) / 2) + scrollHeight;
      modalLeft = Math.round((windowWidth - modalWidth) / 2) + scrollLeft;
    }
    if (modalTop < 0) modalTop = 10;
    if (modalLeft < 0) modalLeft = 10;
    modal.css('top', modalTop + 'px');
    modal.css('left', modalLeft + 'px');
};

var $_showInModal = function(opts) {
    var content = $("#unDecoratedModalContent");
    content.html(opts.html);
    opts.setup(content);

    var modal = $("#unDecoratedModal");
    modal.width(opts.width);
    if (opts.height) {
        modal.height(opts.height);
    }

    /* positioning */
    var scrollHeight = $(window).scrollTop();
    var scrollLeft = $(window).scrollLeft();
    var windowHeight = $(window).height();
    var windowWidth = $(window).width();
    var modalHeight = modal.outerHeight();
    var modalWidth = modal.outerWidth();
    var modalTop = 0;
    var modalLeft = 0;
    if ($.trim(modal.css('position')).toLowerCase() == 'fixed') {
      modalTop = Math.round((windowHeight - modalHeight) / 2);
      modalLeft = Math.round((windowWidth - modalWidth) / 2);
    } else {
      modalTop = Math.round((windowHeight - modalHeight) / 2) + scrollHeight;
      modalLeft = Math.round((windowWidth - modalWidth) / 2) + scrollLeft;
    }
    if (modalTop < 0) modalTop = 10;
    if (modalLeft < 0) modalLeft = 10;
    modal.css('top', modalTop + 'px');
    modal.css('left', modalLeft + 'px');
    /* end positioning */

    modal.css("z-index", "2000"); // appear below session timeout dialog
    modal.jqm({modal: true, toTop: true});
    modal.jqmShow();
    $openJqModal = $("#unDecoratedModal");
};

var $_closeModal = function() {
    alert("in close modal");
    $("#unDecoratedModal").jqmHide();
};

/**
 * Private function that helps to create a JQuery ID from the DOM ID.
 * @param id The DOM ID to create the JQuery ID from.
 */
var $_jqId = function(id) {
    return '#'+$.trim(id);
};

var $_blockDivById = function(opts) {
    //$('#'+$.trim(opts.id)).block({message: opts.message});
    //$('#'+$.trim(opts.id)).block({ css: { backgroundColor: '#f00', color: '#fff', zIndex: '3' }, message: opts.message});
    //$('#darkLayer').visible();
    document.getElementById("darkLayer").style.display = "block";


//    var myCss = {display: 'none',
//           backgroundColor: 'black',
//           filter: 'alpha(opacity=30)',
//           opacity: '0.3'};
//    $('#'+$.trim(opts.id)).css(myCss);
};

var $_iframeId;
var $_iframeName;
var $_breadcrumbId;
var $_ratingsCallback;
var $_keepAliveCallback;
var $_dialogCallback;
/**
 * Public parent interface for the IFRAME interface. This interface is only required by the
 * parent container, clients should reference this directly or reference it via the
 * client interface (see <code>IFrameInterface</code> contained in the
 * <code>jquery.iframe.client.js</code> file).
 */
var IFrameParentInterface = jQuery.extend({
    /**
     * Initializes the interface with specified and defaul options.
     * Clients should NEVER call this function and is for use by the
     * parent container only.
     * @param options The options to use during initalization.
     */
    initInterface:function(options) {
        //alert('IFrameParentInterface.initInterface')
        var opts = $.extend(initDefaults, options || {});
        $_iframeId = opts.iframeId;
        $_iframeName = opts.iframeName;
        $_breadcrumbId = opts.breadcrumbId;
        $_ratingsCallback = opts.ratingsCallback;
        $_keepAliveCallback = opts.keepAliveCallback;
    },
    /**
     * Resizes an IFRAME found on the parental DOM tree. The ID of the IFRAME
     * is specified during interface initialization.
     * @param options The options the send by caller/client interface.
     */
    resizeContainingIframe:function(options) {
        var opts = $.extend(iframeResizeDefaults, options || {});

        // Check for special code set if the client side script failed...
        if ($_iframeId != undefined) {
            if (opts.height == -1) {
                $($_jqId($_iframeId)).height(1200);
            } else {
                $($_jqId($_iframeId)).height(opts.height + $const_SizePadding);
            }
        }
    },
    /**
     * Keeps the current session alive. This function calls back to the
     * specified callback function, specified during initialization.
     */
    keepSessionAlive:function() {
        if ($_keepAliveCallback) {
            $_keepAliveCallback.call();
        }
    },
    /**
     * Update/modify the breadcrumb using the options specified by the caller/client interface.
     * @param options The options send by the caller/client interface.
     */
    breadcrumb:function(options) {
        var opts = $.extend(breadcrumbDefaults, options || {});
        var crumbs = $($_jqId($_breadcrumbId)).html().split($const_Sepperator);
        if (opts.level < $const_MinLevel) {opts.level = $const_MinLevel;}
        if (crumbs.length >= opts.level && opts.level != 0) {
            for (var i = 0; i < opts.level; i++) {
                if (i > 0) {
                    $($_jqId($_breadcrumbId)).html($($_jqId($_breadcrumbId)).html() + ' &raquo; ' + crumbs[i]);
                } else {
                    $($_jqId($_breadcrumbId)).html(crumbs[i]);
                }
            }
        }
        for (var j = 0; j < opts.newLevels.length; j++) {
            if (j == opts.newLevels.length-1) {opts.newLevels[j].url = null;}
            var newEntry = $_createBreadcrumbEntry(opts.newLevels[j].display, opts.newLevels[j].url, $_iframeName);
            $($_jqId($_breadcrumbId)).html($($_jqId($_breadcrumbId)).html());
            var tmpObj = $(crumbs[$const_MinLevel-1]);
            if (tmpObj == null || (tmpObj.html() != newEntry.html() && tmpObj.attr('href') != newEntry.attr('href'))) {
                $($_jqId($_breadcrumbId)).html($($_jqId($_breadcrumbId)).html() + ' &raquo; ');
                $($_jqId($_breadcrumbId)).append(newEntry);
            }
        }
    },
    /**
     * Returns the current size of the breadcrumb levels count.
     */
    breadcrumbSize:function() {
        var crumbs = $($_jqId($_breadcrumbId)).html().split($const_Sepperator);
        return crumbs.length;
    },
    /**
     * Send information to the rate this page functionality via the specified
     * callback method.
     * @param options The options that needs to be send to the callback method.
     */
    rateThisPage:function(options) {
        var opts = $.extend(rateThisPageDefaults, options || {enabled:true});
        if (opts.enabled) {
            var pageToRate = $($_jqId($_iframeId)).contents().get(0).location.pathname;
            if (opts.ratePage) {pageToRate = opts.ratePage;}
            $_ratingsCallback.call(this, pageToRate);
        }
    },
    showDialog:function(options) {
        var opts = $.extend(showDialogDefaults, options || {});
        try {
            $('html').css({height:'100%'}); /* Hack to calculate the vertical center correctly */
            var top = ($('html').outerHeight()/2) - (opts.height/2);
            var left = ($('html').outerWidth()/2) - (opts.width/2);
            var modalStyle = {
                margin:             'auto',
                width:              opts.width,
                top:                top,
                left:               left,
                textAlign:          'left',
                border:             opts.chromeless?'none':'1px solid #aaa',
                'background-color': opts.chromeless?'transparent':'#fff',
                fadeIn:             100,
                cursor:             'default'
            };
            $_dialogCallback = opts.callback;
            var dialog = $('#dialog');
            var dialogFrame = $('#dialogFrame');
            var frameStyle = {border:'none',scrolling:'auto'};
            var overlayStyle = {backgroundColor: '#000',opacity:0.3 };
            if (opts.hideClose) { dialog.find('#dialogCloseBtn').hide(0); }
            dialogFrame.attr('src', opts.src);
            dialogFrame.css(frameStyle);
            dialogFrame.attr('width', opts.width);
            dialogFrame.attr('height', opts.height);
            $.blockUI({message:dialog.html(), iframeSrc:opts.src, forceIframe: true, css:modalStyle, overlayCSS:overlayStyle});
        } catch(e) {
            return false;
        }
    },
    blockParent:function(options) {

        try {
            $.blockUI();
        } catch(e) {
            return false;
        }
    },
    blockDivById:function(opts) {

        $_blockDivById(opts);
    },
    loadInIframeModal:function(opts) {

        $_loadInIframeModal(opts);
    },
    showInModal:function(opts) {
        $_showInModal(opts);
    },
    closeModal:function() {
        $_closeModal();
    },
    loadInModal:function(opts) {
        $_loadInModal(opts);
    },
    closeOpenDialog:function(args) {
        $.unblockUI({ fadeOut: 200 });
        if ($_dialogCallback) {
            $_dialogCallback(args);
        }
        return false;
    },
    closeOpenJqmDialog:function(args) {
        var modal = $openJqModal
        // hide the open modal
        modal.jqmHide();
        modal.css({display:'none'});
        // set the modal iframe src attr back to the original
        if ($openJqModalIframe) {
            $openJqModalIframe.html('').attr('src', $loadingPageSrc);
        }
        // reset the handle to the open modal
        $openJqModal = '';
        return false;
    },
   /**
     * Register the trigger element (<a>) and target (<div>) for the modal
     * where options contains:
     * {trigger: <string - jq selector for trigger>, target: <string - jq selector for target div>, isIframe: <the string 'true' or 'false'>}
     *
     * @param opts
     */
    initModalDialog:function(opts) {
        var isIframe = $.trim(opts.isIframe);

        // get all the triggers that matched
        var $allTriggers = $(opts.trigger);

        if(isIframe == 'true')
        {
            $allTriggers.each(function ()
            {
                var $trigger = $(this);
                $trigger.click(function(){
                    //build options to pass to loadInIframeModal
                    var childOpts = {trigger: $trigger, target: opts.target, isIframe: opts.isIframe, scrolling: opts.scrolling, autoResize: opts.autoResize};
                    $_loadInIframeModal(childOpts);
                    return false;
                });
            });
        }else
        {
            $allTriggers.each(function ()
            {
                var $trigger = $(this);
                $trigger.click(function(){
                    //build options to pass to loadInIframeModal
                    var childOpts = {trigger: $trigger, target: opts.target, isIframe: opts.isIframe};
                    //todo replace with non iframe impl if possible
                    $_loadInIframeModal(childOpts);
                    return false;
                });
            });
        }

        // register the close buttons click handler 
        $('.jqmClose').click(function() {$_closeOpenJqmDialog();return false;});

    },
    analyticsTrackPageview:function(opts) {
      var url = opts.url;
      if ((url != null) && ($.trim(url).length > 0) && (url.substr(0,1) == '/')) {
        try {
          _gaq.push(['_trackPageview', url]);
        } catch (err) {
        }
      }
    }
});

