/***********************************************
APACHE OPEN FOR BUSINESS
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
***********************************************/

//GLOBAL NAMESPACE
var OFBIZ = window.OFBIZ || {};

/**************************************************
LAYOUT AND NAVIGATION
builds main-nav/preferences dropdowns and 
adds functionality to style layout elements
**************************************************/
//ADD CLEARFIX STYLING TO MAIN CONTENT AREA
OFBIZ.clearFix = function(){
    if(jQuery('.contentarea')){
        jQuery('.contentarea').each(function(elm) {
            jQuery(this).addClass('clearfix');
        });
    }
}

//GLOBAL FUNCTION FOR APP DROP-DROWN SECTIONS
OFBIZ.initExpansion = function() {
    if(jQuery('.contracted')){
        jQuery('.contracted').each(function(elm) {
            jQuery(this).next().css({'display': 'none'});
        });    
    }
    if(jQuery('.expanded, .contracted')) {
        jQuery('.expanded, .contracted').each(function(elm) {
            var menu = jQuery(this);
            menu.click( function() {
                menu.next().toggle( function () {
                       if(menu.next().is(':visible')) {
                            menu.removeClass('contracted');
                            menu.addClass('expanded');
                        } else {
                            menu.removeClass('expanded');
                            menu.addClass('contracted');
                        }
                    });
                });
            });
    };
}

OFBIZ.hideExpanded = function() {
    if(jQuery('.expanded').length) {
        jQuery('.expanded').each(function(elm) {
               var menu = jQuery(this);
               if(menu.next().is(':visible')) {
                   menu.removeClass('expanded');
                   menu.addClass('contracted');
                   menu.next().fadeOut('fast');
               }
            });
    };
}

/*****************************************************
FORM FOCUS AND BLUR
javascript solution to make form focus style
consistent cross browser form platforms that
don't support input:focus (cough, cough, IE, cough)
*****************************************************/
jQuery('document').ready(function () {
    var fields = jQuery("input, textarea");
    for (var i = 0; i < fields.length; i++) {
     if (!fields[i].style.visibility == 'hidden') {
      fields[i].focus (function() {this.className += ' focused';});
      fields[i].blur (function() {this.className = this.className.replace('focused', '');});
     }
    }
});


/********************************************************
HUMANIZED MESSAGES
displays success and error messages in modal window.
message automatically fades on keypress, click mousemove
(ala growl/system tray notices)
********************************************************/
//SUCCESS AND ERROR MESSAGE NOTIFICATIONS
var humanMsg = {
    setup: function(appendTo, msgOpacity) {
      humanMsg.msgID = 'humanMsg';
      appendTo = appendTo || jQuery('body')[0];
      humanMsg.msgOpacity = 0.5;
      if (msgOpacity !== undefined) {
        humanMsg.msgOpacity = parseFloat(msgOpacity);
      }
      /*var myTemplate = new Template(
        '<div id="#{msgID}" class="humanMsg" style="display:none;">'+
          '<div></div>'+
         '</div> ');
      var show = {msgID: humanMsg.msgID};*/
      jQuery('<div id="' + humanMsg.msgID + '" class="humanMsg" style="display:none;"><div></div></div>').appendTo(appendTo);
    },
    displayMsg: function(msg) {
      if (msg === '') {
        return;
      }
      clearTimeout(humanMsg.t2);
      // Inject message
      var msgElement = jQuery("#" + humanMsg.msgID);;
      msgElement.find('div:first').html(msg);
      msgElement.fadeIn('slow');
      msgElement.click(humanMsg.removeMsg);
    },
    // Remove message if mouse is moved or key is pressed
    bindEvents: function() {
      jQuery(document).mousemove(humanMsg.removeMsg)
              .click(humanMsg.removeMsg)
              .keypress(humanMsg.removeMsg);
    },
    // Unbind mouse & keyboard
    removeMsg: function() {
      jQuery(document).unbind('mousemove', humanMsg.removeMsg)
              .unbind('click', humanMsg.removeMsg)
              .unbind('keypress', humanMsg.removeMsg);
      jQuery("#" + humanMsg.msgID).fadeOut('slow');
    }
};

/**************************************************
MODAL WINDOWS
displays preferences (language, theme, timezone)
in modal window instead of popup/new window
**************************************************/
ModalWindow = function(){};

ModalWindow.openModalWindow = function(url, dialogId, width, height) {
    
    // if element doesn't exists create otherwise just open
    if (!document.getElementById('dialog-container_' + dialogId)) {
        var modalContainer = jQuery("<div id='dialog-container_" + dialogId + "' style='display:none'></div>");
        jQuery('body').append(modalContainer);
        modalContainer = jQuery('#dialog-container_' + dialogId)
        modalContainer.dialog({
            modal: true,
            zIndex: 10000,
            height: height,
            width: width,
            open: function() {
                    modalContainer.append(jQuery("<img id='dialog-ajax-spinner' src='/bizznesstime/images/ajax-loader.gif'/>"));
                    modalContainer.load(url, function () {jQuery("#dialog-ajax-spinner").remove();});
                    // make sure the other possible opened dialogs will be closed
                    ModalWindow.closeOtherModalWindows(dialogId);
                    // close the open menu
                    OFBIZ.hideExpanded();
                }
        });
    } else {
        jQuery('#dialog-container_' + dialogId).dialog('open');
    }
}

ModalWindow.closeOtherModalWindows = function(currentOpen) {
    if (currentOpen == 'listLanguage') {
        jQuery('#dialog-container_listTheme').dialog('close');
        jQuery('#dialog-container_listTimezone').dialog('close');
    } else if (currentOpen == 'listTheme') {
        jQuery('#dialog-container_listTimezone').dialog('close');
        jQuery('#dialog-container_listLanguage').dialog('close');
    } else if (currentOpen == 'listTimezone') {
        jQuery('#dialog-container_listTheme').dialog('close');
        jQuery('#dialog-container_listLanguage').dialog('close');
    }
}

//LOAD MODAL PREFERENCE WINDOWS
jQuery('document').ready (function () {
    jQuery("#language").click (function(e) {
        var url = this.href;
        this.href = "javascript:void(0);"
        ModalWindow.openModalWindow(url, 'listLanguage', 340, 400);    
    });
    jQuery("#theme").click (function(e) {
        var url = this.href;
        this.href = "javascript:void(0);"
            ModalWindow.openModalWindow(url, 'listTheme', 600, 400);  
    });
    jQuery("#timezone").click (function(e) {
        var url = this.href;
        this.href = "javascript:void(0);"
            ModalWindow.openModalWindow(url, 'listTimezone', 430, 400);  
    });
});

/**************************************************
LOAD 'EM UP
**************************************************/
//LOAD GLOBAL APP FUNCTIONS
jQuery('document').ready(function () {
    OFBIZ.clearFix();
    OFBIZ.initExpansion();
    humanMsg.setup();
});



