/***************************************************************/

(function($) {
  var methods = {
    init : function(options) {
      var options = $.extend({
        prev: '#',
        next: '#',
        prev_title: 'Previous',
        next_title: 'Next'
      }, options);

      return this.each(function() {
        var photo = $(this).find('img:first'),
          poffset = photo.position();

        $('<div></div>')
          .addClass('pnav pleft')
          .css({marginTop : '-' + photo.height() + 'px', marginLeft : poffset.left + 'px'})
          .appendTo($(this))
          .wrapInner($('<a></a>').attr({href: options.prev, title: options.prev_title}).height(photo.height()));

        $('<div></div>')
          .addClass('pnav pright')
          .css({marginTop : '-' + photo.height() + 'px', marginLeft : poffset.left + photo.width() - 30 + 'px'})
          .appendTo($(this))
          .wrapInner($('<a></a>').attr({href: options.next, title: options.next_title}).height(photo.height()));

      })
    }
  }

  $.fn.sn_photo_nav = function(method) {
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.tooltip');
    }
  }
})(jQuery);

/***************************************************************/

(function($) {
  var methods = {
    init : function(options) {
      var options = $.extend({
        title : 'Slider',
        container : '#slider',
      }, options);

      return this
          .each(function() {
            var list = $(this), slider = $(options.container), photo = slider.find('.photo_s:first'), description_cnt = slider.find('.slider_bc:first'), navigation = $(
                '<ul></ul>').addClass('navigation_s').appendTo(description_cnt);
            list.find('li').each(function() {
              $('<li></li>').appendTo(navigation);
            });

            navigation.find('li').bind({
              mouseenter : function() {
                var selected = $(this);
                if (!selected.hasClass('selected')) {
                  navigation.find('li').removeClass('selected');
                  $(this).addClass('selected');
                  var row = list.find('li').eq(selected.index());
                  photo.html(row.find('.photo_s').html());
                  //console.log(options.title);
                  var title = $('<h3></h3>').html(options.title);
                  description_cnt.find('.description_s').html(row.find('.description_s').html()).prepend(title);
                }
              }
            });

            navigation.find('li:last').trigger('mouseenter');
          })
    }
  };

  $.fn.sn_slider = function(method) {
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.tooltip');
    }
  }
})(jQuery);

/** ****************************************************** */

(function($) {
  var methods = {
    init: function(options) {
      var options = $.extend({
        choices : {},
        paddingLeft: 6,
        paddingRight: 8
      }, options);
      
      return this.each(function() {
        var select = $(this),
        select_widget = $('#'+select.attr('sn_opt_sw')),
        list = $('<ul class="cm2_wt_st_lt"></ul>').attr({id: 'list_'+select.attr('id')}).hide();
        $.each(options.choices, function(i, val) {
          if (val.length > 0) {
            list.append($('<li></li>').attr({sn_opt_item_val: i}).text(val));
          } else {
            list.append($('<li></li>').attr({sn_opt_item_val: i}).html('&nbsp;'));
          }
          if (select.val() == i) {
            select_widget.find('span').text(val);
          }
        });
      
        select_widget.bind('click', function() {
          if (list.is(':hidden')) {
            ShowList(list, $(this), select);
          } else {
            HideList(list, $(this));
          }
        });
      
        list.bind({
          clickoutside: function(event){
            var target = $(event.target);
            if (!target.parents().is(select_widget) && !target.is(select_widget)) {
              if (list.is(':visible')) {
                HideList($(this), select_widget);
              };
            };
          }
        }).find('li').bind({
          click: function(){
            var item = $(this);
            select.val(item.attr('sn_opt_item_val')).trigger('change');
            select_widget.find('span').text(item.text());
            HideList(list, select_widget);
          },
          mouseenter: function(){
            list.find('li').removeClass('selected');
            $(this).addClass('selected');
          }
        });

        $('body').append(list);
      });
      
      function ShowList(obj, select_widget_obj, select) {
        var offset = select_widget_obj.offset(),
        width = select_widget_obj.outerWidth() - options.paddingLeft - options.paddingRight;
        obj.css({left: offset.left + options.paddingLeft + 'px',
          top: offset.top + select_widget_obj.outerHeight() + 'px' })
        .width(width)
        .show().find('li[sn_opt_item_val=' + select.val() + ']').addClass('selected');
      }
    
      function HideList(obj, select_widget_obj) {
        obj.css({left: 0, top: 0}).hide().find('li').removeClass('selected');
      }
    }
  };
      
  $.fn.sn_select = function(method) {
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }
  }

})(jQuery);

/** *************************************** */

(function($) {
  var methods = {
    init: function(options) {
      var options = $.extend({
        paddingLeft: 6,
        paddingRight: 8,
        params: {}
      }, options);
    
      return this.each(function() {
        var select = $(this),
        select_widget = $('#'+select.attr('sn_opt_sw')),
        button = select_widget.find('li.button'),
        input = select_widget.find('li.input :text'),
        list = $('<ul class="cm2_wt_st_lt"></ul>').attr({id: 'list_'+select.attr('id')}).hide();
        
        $.getJSON(options.url, {id: select.val()}, function(mdata) {
          input.val(mdata.name);
        });
        
        select.data('sn_select_filter', { options: options, data: [] });
        
        input.attr({autocomplete: 'off'});
      
        button.bind('click', function() {// click on button
          if (list.is(':hidden')) {
            data = select.data('sn_select_filter');
            
            if (data.data.length > 0) {
              list.html('');
              $.each(data.data, function(key, val) {
                list.append($('<li></li>').attr({sn_opt_item_val: val.id}).text(val.name));
              });
              ShowList(list, select_widget, select);
            } else {
              list.html('');
              select_widget.find('li.input').addClass('loading');
              $.getJSON(options.url, options.params, function(mdata) {
                $.each(mdata, function(key, val) {
                  list.append($('<li></li>').attr({sn_opt_item_val: val.id}).text(val.name));
                });
                select.data('sn_select_filter', { options: options, data: mdata });
                ShowList(list, select_widget, select);
                select_widget.find('li.input').removeClass('loading');
              }).error(function(){
                select_widget.find('li.input').removeClass('loading');
              });
            }
          } else {
            HideList(list, $(this));
          }
        });
      
        list.bind({
          clickoutside: function(event) {
            var target = $(event.target);
            if (!target.parents().is(select_widget) && !target.is(select_widget)) {
              if (list.is(':visible')) {
                HideList($(this), select_widget);
                if (select.val().length == 0) {
                  input.val('');
                }
              };
            };
          }
        });
      
        input.bind({
          keyup: function(key){
            data = select.data('sn_select_filter');
            var find = this.value;
            if (data.data.length > 0) {
              HideList(list, select_widget);
              FilterList(select, list, input, find, data.data);
              ShowList(list, select_widget, select);
            } else {
              select_widget.find('li.input').addClass('loading');
              $.getJSON(data.options.url, data.options.params, function(mdata) {
                select.data('sn_select_filter', { options: options, data: mdata });
                FilterList(select, list, input, find, mdata);
                ShowList(list, select_widget, select);
                select_widget.find('li.input').removeClass('loading');
              }).error(function(){
                select_widget.find('li.input').removeClass('loading');
              });
            };
            if (this.value == '') {
              select.val('');
            }
          }
        });
      
        list.delegate('li', {
          click: function(){
            var item = $(this);
            select.val(item.attr('sn_opt_item_val')).trigger('change');
            input.val(item.text()).focus();
            HideList(list, select_widget);
          },
          mouseenter: function(){
            list.find('li').removeClass('selected');
            $(this).addClass('selected');
          }
        });

        $('body').append(list);
      });
      
      function FilterList(select, list, input, find, load_data) {
        list.html('');
        select.val('');
        list.find('li').removeClass('selected');
        var reg = new RegExp(RegExp.quote(find), 'i');
        $.each(load_data, function(key, val) {
          var text = val.name;
          if (reg.test(text)) {
            var item = $('<li></li>').attr({sn_opt_item_val: val.id}).text(text);
            if (text.toLowerCase() == find.toLowerCase()) {
              input.val(text);
              select.val(val.id);
              item.addClass('selected');
            };
            item.html(text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+ find + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"));
            list.append(item);
          };
        });
        select.trigger('change');
      }
    
      function ShowList(obj, select_widget_obj, select) {
        var offset = select_widget_obj.offset(),
        width = select_widget_obj.outerWidth() - options.paddingLeft - options.paddingRight;
        obj.css({left: offset.left + options.paddingLeft + 'px',
          top: offset.top + select_widget_obj.outerHeight() + 'px'})
        .width(width)
        .show().find('li[sn_opt_item_val=' + select.val() + ']').addClass('selected');
      }
    
      function HideList(obj, select_widget_obj) {
        obj.css({left: 0, top: 0}).hide().find('li').removeClass('selected');
      }
    },
    options: function(options) {
      if (options === undefined) {
        return $(this).data('sn_select_filter');
      } else {
        var options = $.extend({
          paddingLeft: 6,
          paddingRight: 8,
          params: {},
          data: []
        }, options);

        return this.each(function() {
          var select = $(this);
          select.data('sn_select_filter', options);
        });
      }
    },
    clear: function() {
      return this.each(function() {
        var select = $(this),
        select_widget = $('#'+select.attr('sn_opt_sw')),
        input = select_widget.find('li.input :text'),
        list = $('#list_'+select.attr('id'));
        select.val('');
        input.val('');
        list.html('').hide();
      });
    }
  };
  
  $.fn.sn_select_filter = function( method ) {
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }
  };
})(jQuery);

RegExp.quote = function(str) {
  return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
};

