﻿$j = jQuery.noConflict();


/* TOL: the code below allows
jqueryObject.sort(function(a,b) { 
return a - b; 
}); 
*/
jQuery.fn.sort = function () {
  return this.pushStack(jQuery.makeArray([].sort.apply(this, arguments)));
};

if (typeof console == 'undefined') {
  var console = {
    log: function () { }
  };
}

var TB = (function ($) {
  var _urlPrefix = '';
  var _resourcesToPreload = ['/local/css/images/loader.gif'];
  var _resources = {};
  var _originalLoginBoxTop = 0;
  var DEFAULT_FANCYBOX_WIDTH = 640;
  var fancyboxOptions = { autoScale: false, autoDimensions: false, width: DEFAULT_FANCYBOX_WIDTH, height: 'auto', hideOnOverlayClick: false, changeFade: 0, transitionIn: 'none', transitionOut: 'none', changeSpeed: 10 };
  var newObjectCount = 0;

  return {
    fancyboxOptions: fancyboxOptions,
    resources: _resources,

    urlPrefix: function () {
      if (_urlPrefix == '') {
        _urlPrefix = TB.getUrlPrefix();
      }
      return _urlPrefix;
    },

    invoke: function (params, confirmation, callback) {
      if (typeof confirmation === 'string' && confirmation.length > 0) { if (!confirm(confirmation)) { return; } }
      if (typeof confirmation === 'function') { callback = confirmation; }
      $j.post(params.InvokeUrl ? params.InvokeUrl : window.location.pathname, params, callback);
    },

    loadContent: function (sender, params, confirmation, callback) {
      if (typeof confirmation === 'string' && confirmation.length > 0) { if (!confirm(confirmation)) { return; } }
      if (typeof confirmation === 'function') { callback = confirmation; }
      params[TB.generateRandomString(8)] = ''; // IE hack, so it doesn't cache the data
      if (typeof callback == 'undefined') { callback = TB.processLoadedContent; }
      $j(sender).closest('.content-container').load(params.InvokeUrl ? params.InvokeUrl : window.location.pathname, params, callback);
      $j(sender).replaceWith('<span><img src="/local/css/images/loader.gif" style="vertical-align: middle;"/>&nbsp;</span>');

    },

    processLoadedContent: function () { // Optimize?
      interactivityHandlers.bindInteractivity($j(this));
    },

    generateRandomString: function (stringLength) {
      var randomString = '';

      for (var i = 0; i < stringLength; i++) {
        randomString += Math.floor(Math.random() * 10);
      }

      return randomString;
    },

    showConfirmationBox: function (title, content) {
      TB.showQuickFancyBox(title, '<div class="pictured ico-24x24 ico-warning-24x24 no-padding-top"><p>' +
      content + '</p></div>', 400);
    },

    fitFancyBoxSize: function () {
      $j.fancybox.resize(false);
    },

    showSimpleBox: function (title, text, width, additionalFancyBoxOptions) {
      TB.showQuickFancyBox(title, text, width, additionalFancyBoxOptions);
    },

    showInformationBox: function (title, text) {
      TB.showQuickFancyBox(title, '<div class="pictured ico-24x24 ico-warning-24x24 no-padding-top"><p>' + text + '</p></div>', 400);
    },

    showQuickFancyBox: function (title, content, width, additionalFancyBoxOptions) { // And what if I want to show a sloooooow fancy box? :P TOL:add another parameter and call it directly Tim: Why so serious? :)
      var quickFancyboxOptions = { autoScale: false, autoDimensions: false, width: DEFAULT_FANCYBOX_WIDTH, height: 'auto', hideOnOverlayClick: true, changeFade: 0 };
      if (typeof width != 'undefined' && width != 0) {
        quickFancyboxOptions.width = width;
      }
      if (typeof additionalFancyBoxOptions != 'undefined') {
        $j.extend(quickFancyboxOptions, additionalFancyBoxOptions);
      }

      $j('#fancy-quick-alert-content').html('<h1 class="underlined">' + title + '</h1>' + content);
      $j('#fancy-quick-alert-button').fancybox(quickFancyboxOptions);
      $j('#fancy-quick-alert-button').click();
    },

    refreshFancyBox: function () {
      if (typeof $j.fn.fancybox == 'function') {
        $j('.fancyboxed').fancybox({ autoScale: false, hideOnOverlayClick: true });
        $j('#fancy-alert-button').fancybox(fancyboxOptions);
      }
    },

    resizeFancyBox: function (newWidth) {
      if (typeof newWidth != 'undefined') {
        fancyboxOptions.width = newWidth;
      }
      else {
        fancyboxOptions.width = DEFAULT_FANCYBOX_WIDTH;
      }
      $j('#fancy-alert-button').fancybox(fancyboxOptions);
    },

    preloadResources: function () {
      var imageLoader = null;

      for (var i = 0; i < _resourcesToPreload.length; i++) {
        imageLoader = new Image(100, 100);
        imageLoader.src = _resourcesToPreload[i];
      }
    },

    getUrlPrefix: function () {
      var currentUrl = window.location.pathname;
      if (currentUrl.charAt(3) == '/') {
        return currentUrl.substring(0, 3);
      }
      else {
        return '/en';
      }
    },

    showLoginBox: function () {
      TB.autoSizeLoginBox(true);
    },

    hideLoginBox: function () {
      $j('#login-box').animate({ top: -357 }, 300);
    },

    autoSizeLoginBox: function (focusUsernameField) {
      var BASE_HEIGHT = 327;
      var $loginBox = $j('#login-box');
      var $innerWrapper;
      var newHeight = 0;
      var bottomPadding = parseInt($loginBox.css('padding-bottom').replace('px', ''));
      var topPadding;

      $innerWrapper = $loginBox.wrapInner('<div style="overflow: visible;"></div>');
      newHeight = $innerWrapper.height();
      topPadding = BASE_HEIGHT - newHeight - bottomPadding;
      $innerWrapper.contents().contents().unwrap();
      $loginBox.css('padding-top', topPadding);
      if (focusUsernameField) {
        $loginBox.animate({ top: -topPadding }, 300, null, function () { $loginBox.find('input[name="Username"]').select(); });
      } else {
        $loginBox.animate({ top: -topPadding }, 300);
      }
    },

    cloneTemplate: function (templateSelector, targetContainerSelector, idPrefix) {
      var $clonedTemplate = $(templateSelector).clone().removeAttr('id').removeClass('template');
      var $targetContainer = $(targetContainerSelector);

      newObjectCount++;

      $clonedTemplate.find('.template').removeClass('template');
      $clonedTemplate.find('input[type="text"],input.text').val('');
      $clonedTemplate.find('input[type="checkbox"], input[type="radio"]').removeAttr('checked');
      $clonedTemplate.find('textarea').html('');
      $clonedTemplate.find('[name!=""]').each(function () {
        var $this = $(this);
        if (typeof $this.attr('name') != 'undefined') {
          $this.attr('name', $this.attr('name') + 'New' + newObjectCount);
        }
      });
      $clonedTemplate.attr('id', idPrefix + 'new-' + newObjectCount);

      $targetContainer.append($clonedTemplate);
      $clonedTemplate.find('input[type!="hidden"]:first').select();

      return $clonedTemplate;
    },

    addSlider: function (baseSelector, minValue, maxValue, delta) {
      var $sliderContainer = $j(baseSelector);
      $sliderContainer.find('.slider').each(function () {
        var $this = $j(this);
        if ($this.hasClass('percent')) {
          minValue = 0;
          maxValue = 100;
          delta = 5;
        }
        $this.slider({
          value: $this.next('input[type="hidden"]').val(),
          min: minValue,
          max: maxValue,
          step: delta,
          slide: function (event, ui) {
            var $closestRow = $j(this).closest('.slider-container');
            var $valueHolder = $closestRow.find('.slider-value > .value');
            if ($this.hasClass('percent')) {
              $valueHolder.html(ui.value + '%');
            }
            else {
              $valueHolder.html(ui.value);
            }
            $j(this).next('input[type="hidden"]').val(ui.value);
          }
        });
      });
    },

    setUpPairedDatePickers: function (dateFromId, dateToId) {

    },

    rebindDatepickers: function () {
      if (typeof $j.datepicker != 'undefined') {
        $j('input.date:not(.hasDatepicker):not(.template)').
          datepicker($j.extend($j.datepicker.regional[TB.resources['Core.LanguageCode']], { showOn: 'focus', dateFormat: TB.resources['Core.DateFormatStringJS'] })).
          each(function () {
            var $this = $j(this);
            $this.after('<input type="hidden" id="' + $this.attr('name') + '-id" name="' + $this.attr('name') + '"/>');
            $this.removeAttr('name');
            $this.datepicker('option', { 'altField': '#' + $this.next('input[type="hidden"]').attr('id'),
              'altFormat': TB.resources['Core.ShortDateFormatStringJS']
            });
          });
      }
    },

    switchLanguage: function (newLanguageCode) {
      var currentURL = window.location.pathname;
      var targetPath = currentURL.substring(3, currentURL.length);

      if (targetPath.length == 0) { targetPath = '/'; }

      currentURL = '/' + newLanguageCode + targetPath + window.location.search;

      window.location = currentURL;
    },

    switchCurrency: function (newCurrencyCode) {
      TB.invoke({ ActionType: 'Switch_Currency', InvokeUrl: TB.urlPrefix() + '/user-profile/', CurrencyCode: newCurrencyCode });
    },


    /*Utility Functions*/

    selectFirstFormInputIfEmpty: function ($form) {
      var firstField = $form.find('input:not([type="hidden"]):first');
      if (firstField.length > 0 && firstField.val() == '') {
        firstField.select();
      }
    },
    focusFirstFormInputIfEmpty: function ($form) {
      var firstField = $form.find('input:not([type="hidden"]):first');
      if (firstField.length > 0 && firstField.val() == '') {
        if (firstField.is(':visible')) {
          firstField.focus(); 
        }
      }
    },

    addOptionToSelect: function ($select, name, id) {
      $select.append('<option value="' + id + '">' + name + '</option>');
    },

    getParam: function (paramName, reqStr) {
      var res = '';
      var indOfQ;
      indOfQ = reqStr.indexOf('?');
      if (indOfQ != -1) {
        reqStr = reqStr.substring(indOfQ + 1);
      }
      var paramsAr = reqStr.split('&');
      var ind;
      for (var i = 0; i < paramsAr.length; i++) {
        ind = paramsAr[i].indexOf('=');
        if (paramsAr[i].substring(0, ind) == paramName) {
          res = paramsAr[i].substring(ind + 1);
          break;
        }
      }

      return res;
    },
    deepClone: function (srcObject) {
      return jQuery.extend(true, {}, srcObject);
    },
    shallowClone: function (srcObject) {
      return jQuery.extend({}, srcObject);
    },
    arrayContains: function (ar, value) {
      for (var i = 0; i < ar.length; i++) {
        if (ar[i] == value) return true;
      }
      return false;
    },

    switchVisibility: function (el) {
      var $el = $j(el);
      if ($el.is(':hidden')) {
        $el.show();
        return true;
      } else {
        $el.hide();
        return false;
      }
    },

    setupDefaultText: function (el) {
      var q = jQuery(el);
      var txt = q.attr('title');
      if (!txt) { return; }
      var onFocus = function () { if (q.val() == txt) { q.val('').removeClass('inactive'); } };
      var onBlur = function () {
        if (q.val() == '' || q.val() == txt) {
          q.val(txt).addClass('inactive');
        }
      };
      q.focus(onFocus).blur(onBlur);
      onBlur();
    },


    selectPerformIfChanged: function (select, obj, valueFieldName, realOnClick) {
      var selVal = $j(select).val();
      if (selVal != obj[valueFieldName]) {
        obj[valueFieldName] = selVal;
        realOnClick();
      } else {
        //do nothing
      }
      return false;
    },

    selectOnClick: function (select, prevVal, realOnClick) {
      if ($j(select).val() != prevVal) {
        realOnClick();
        return true;
      } else {
        return false;
      }
    },

    xorOp: function (a, b) {
      return !a && b || a && !b;
    },

    strCompareTo: function (strA, strB) {
      if (strA > strB) return 1;
      else if (strA < strB) return -1;
      else return 0;
    },

    compareTo: function (a, b) {
      if (a > b) return 1;
      else if (a < b) return -1;
      else return 0;
    },

    dictContainsIndex: function (dict, etalonInd) {
      var fnd = false;
      $j.each(dict, function (ind, el) {
        if (ind == etalonInd) {
          fnd = true;
          return false;
        }
      });
      return fnd;
    },

    intToStr: function (x) {
      return x + '';
    },

    //returns -555 instead of -555px for ex.:
    extractNumericPartOfValue: function (strVal) {
      return parseInt(strVal.replace(/[^-\d\.]/g, ''));
    },

    htmlEncode: function (value) {
      return $j('<div/>').text(value).html();
    },

    htmlDecode: function (value) {
      return $j('<div/>').html(value).text();
    }
    /***/



  }
})(jQuery);

$j(function () {
  TB.getUrlPrefix();
  TB.refreshFancyBox();
  TB.preloadResources();
});

