(function($){

/* formToArray */
$.fn.alert = function(text, time){
  if (!time) time = 10000;
  if ($('#alerts').length) $('#alerts').show();
  else $('<div id=alerts></div>').appendTo("body");
  var $alerts = $("#alerts");

  return this.each(function(){
    var el = $(this);
    el.focus();

    // find similar
    var find = false;
    $alerts.find("div").each(function(){
      if ($(this).text() == text)
        find = true;
    });
    if (find) return false;

    $('<div style="display: none; position: absolute; z-index: 10000; padding: 5px 20px; background: #F36A5F; color: white; cursor: default; border-radius: 3px; -moz-border-radius: 3px; box-shadow: 1px 1px 3px rgba(0,0,0,0.5); -moz-box-shadow: 1px 1px 3px rgba(0,0,0,0.5); -webkit-box-shadow: 1px 1px 3px rgba(0,0,0,0.5);">'+text+'</div>').appendTo($alerts);
       var height = el.height();
       var offs = el.offset();
       var top = offs.top + height + 4;

       $alerts.find(">div:last").css({top: top+'px', left: offs.left})
         .mousedown(function(){$(this).stop(true).fadeOut('fast', function(){$(this).remove()}); return false})
         .fadeIn('fast', function(){$(this).animate({a: 0}, time, function(){$(this).mousedown()})});
  });
};


/* formToArray */
$.fn.formToArray = function() {
  var a = {};
  if (this.length == 0) return a;

  var form = this[0];
  var els = form.elements;
  if (!els) return a;
  for(var i=0, max=els.length; i < max; i++) {
    var el = els[i];
    if ($(el).attr("type") == "radio" && !$(el).attr("checked")) continue;
    var n = el.name;
    if (el.nodeName.toLowerCase() == "select" && $(el).attr("multiple")) n = el.name + '[]';
    if (!n) continue;
    var v = $(el).val();
    if ($(el).attr("type") == "checkbox") v = (el.checked ? v : 0);
    a[n] = v;
  }
  return a;
};

/* window */
$.fn.window = function(options){
  var $el = $(this);
  var ie6 = ($.browser.msie && $.browser.version < 8);

  if (options == "close"){
    $el.stop(1,1).fadeOut();
    $("#overlay").stop(1,1).fadeOut(function(){
      if (ie6) $("select").css("visibility" ,"visible");
      $(this).remove();
    });
    $("#alerts").stop(1,1).fadeOut();

    $(document).unbind("keydown.window keypress.window");
    if (ie6) $(window).unbind("scroll.window_ie6 resize.window_ie6");
    else $(window).unbind("resize.window");
    return this;
  }

  options = $.fn.extend({
    init: function(){},
    shadow: "1px 1px 8px rgba(0,0,0,0.5)"
  }, options);

  //$("body").prepend($el);

  if ($el.parent().get(0).nodeName != "BODY")
    $el.remove().prependTo("body");

  if (!$("#overlay").length){
    $("body").prepend("<div id=overlay></div>");
    $("#overlay").css({position: "absolute", left: 0, top: 0, width: "100%", display: "none", zIndex: 99, background: "black"}).fadeTo(0,0)
  }
  var $overlay = $("#overlay").stop(true).unbind("mousedown").mousedown(function(){
      $el.window("close");
      return false;
    });;


  $el.find(".close_window, .window_close").css({position: "absolute", right: 10, top: 5, fontSize: 22, textDecoration: "none"}).unbind("click.window").bind("click.window", function(){
    $el.window("close");
    return false;
  });
  $el.css({position: "absolute", left: -10000, top: -10000}).show()
  $el.css({zIndex:100, marginLeft: -1*$el.get(0).scrollWidth/2, marginTop: -1*$el.get(0).scrollHeight/2, boxShadow: options.shadow, MozBoxShadow: options.shadow, WebkitBoxShadow: options.shadow}).hide();

  $(document).unbind("keydown.window keypress.window").bind("keydown.window keypress.window", function(e){
    var key = (window.event) ? event.keyCode : e.keyCode;
    if (key==27) $el.window("close");
  });
  if (ie6){
    $("select").css("visibility" ,"hidden");
    $(window).unbind("scroll.window_ie6 resize.window_ie6")
             .bind("scroll.window_ie6 resize.window_ie6", function(){
      $overlay.css({left: $(this).scrollLeft(), height: $(document).height()});
      var left = $(this).scrollLeft()+$(this).width()/2;
      var top = $(this).scrollTop()+$(this).height()/2;
      $el.css({position: "absolute", left: left, top: top, zoom: 1}).fadeIn("normal", options.init);
    });
    $(window).trigger("resize.window_ie6");
  }
  else {
    $(window).unbind("resize.window").bind("resize.window", function(){
      $overlay.hide();
      var width = $(document).width();
      var height = $(document).height();
      $overlay.show().width(width).height(height);
    });
    $overlay.show().width($(document).width()).height($(document).height());
    $el.css({position: "fixed", left: "50%", top: "50%"}).fadeIn("normal", options.init);
  }
  $overlay.fadeTo("fast", 0.5);
}



/* image viewer */
$.fn.viewer = function(options){
  var $el = this;
  if (typeof(options) == "number"){
    var i = options;
    if (!$("#viewer").length) $("body").append("<div id=viewer></div>");
    $viewer = $("#viewer");

    $viewer.html("<div style='padding: 8px 20px;'>Loading...</div>").window();

    var url = $el.eq(i).attr("href");
    if (!url) url = $el.eq(i).attr("src");
    $("body").append("<img style='position:absolute;left:-10000;top:-10000;' alt='' src='"+url+"'>");
    $preload_img = $("body img:last");
    var timeout_k=0;
    var int = setInterval(function(){
      if ($preload_img.width()>30 && $preload_img.height()>30){
        clearInterval(int);

        var img_width = "";
        var img_height = "";
        var window_ratio = ($(window).width()-100)/($(window).height()-50);
        var img_ratio = $preload_img.width()/$preload_img.height();
        if (window_ratio<img_ratio && $preload_img.width() > $(window).width()-100)
          img_width = " width="+($(window).width()-100)+" ";
        if (window_ratio>=img_ratio && $preload_img.height() > $(window).height()-50)
          img_height = " height="+($(window).height()-50)+" ";

        $viewer.html('<img src="'+url+'" '+img_width+img_height+' alt="">');
        var style = "position: absolute; top: 0; outline: none; display: block; background: url(/images/blank.gif);";
        if (i>=1)
          $viewer.append('<a style="'+style+'" title="" class=viewer_left href=#> </a>');
        if (i<$el.length-1)
          $viewer.append('<a style="'+style+'" title="" class=viewer_right href=#> </a>');

        $viewer.window({init: function(){
          $viewer.find(".viewer_left, .viewer_right").width($viewer.width()/3).height($viewer.height());
          $viewer.find(".viewer_left").css({left:0}).click(function(){
            $el.viewer(i-1);
            return false;
          });
          $viewer.find(".viewer_right").css({right:0}).click(function(){
            $el.viewer(i+1);
            return false;
          });
          $preload_img.remove();
        }});
      }
      // timeout 30 sec
      if (timeout_k>300){
        clearInterval(int);
        $viewer.window("close");
      }

      timeout_k++;
    }, 100);
    return this;
  }

  $el.css({position: "relative"}).each(function(){
    $(this).unbind("click").click(function(){
      $el.viewer($el.index(this));
      return false;
    });
  });

};


$.fn.photoSlider = function(options){
  options = $.extend({    images: []  }, options);
  $el = $(this).css({position: "relative"});
  var interval = $el.eq(0).data("interval");
  if (!$el.find(">.controls").length)
    $el.append("<div class=controls style='position: absolute; right: 20px; bottom: 20px; z-index: 999'></div>");
  $controls = $el.find(".controls").html("");
  var max_height = 0;
  var showed_img = 0;
  var img_count = 0;
  var zIndex = 1;
  var hand = false;
  var width = $el.width();
  var height = $el.height();

  var start = false;
  $el.find(".photoSlider_img:hidden").remove();
  $el.find(".photoSlider_img:visible").clearQueue().fadeOut(500, function(){    $(this).remove();
    start = true;
  });
  if (!$el.find(".photoSlider_img").length)
    start = true;

  for (var i in options.images){    var src = options.images[i];
    $("body").append("<img src='"+src+"' alt='' style='position:absolute; left:-10000; top:-10000'>");
    var $img = $("body img:last");
    $img.load(function(){$img.remove()});
    setTimeout(function(){$img.remove()}, 10000);
    img_count++;
    $el.append("<div class=photoSlider_img style='position:absolute; left:0; top:0; background:url("+src+") no-repeat; display: none; width:"+width+"px; height:"+height+"px; '></div>");
    $controls.append("<a href=# style='display: hide; float: left; margin: 3px; background: gray; width: 15px; height: 15px; border-radius: 15px; -moz-border-radius: 15px;'></a>");
  };
  $controls.clearQueue().fadeIn();
  $controls.find("a").click(function(){
    showed_img = $controls.find("a").index($(this));
    show_img();
    hand = true;
    return false;
  });

  var show_img = function(){
    var eq = showed_img;
    setTimeout(function(){
      $controls.find("a").css({backgroundColor: "gray"}).eq(eq).css({backgroundColor: "#333"});
    }, 500);
    $el.find(".photoSlider_img").eq(eq).css({zIndex: zIndex}).show(1000, function(){
      $el.find(".photoSlider_img").not(this).hide();
    });
    zIndex++;
  }

  clearInterval(interval);
  interval = setInterval(function(){
    if (start){
      show_img();
      showed_img++;
      clearInterval(interval);
      interval = setInterval(function(){
        if (hand) return false;
        if (showed_img > img_count-1)
          showed_img = 0;
        show_img();
        showed_img++;
      }, 5000);
      $el.eq(0).data("interval", interval);
    }
  }, 50);
  $el.eq(0).data("interval", interval);

}


   $.fn.extend({
      scrollable: function (arg1, arg2, arg3) {
         return this.each(function () {
            if (typeof arg1 == "string") {
               var el = $.data(this, "scrollable");
               el[arg1].apply(el, [arg2, arg3]);
            } else {
               new $.scrollable(this, arg1, arg2);
            }
         });
      }
   });

   // constructor
   $.scrollable = function (el, opts) {
      // store this instance
      $.data(el, "scrollable", this);
      this.init(el, opts);
   };

   // methods
   $.extend($.scrollable.prototype, {
      init: function (el, config) {
         el = $(el); // current instance
         this.el = el;
         var td = el.find("td:first");
         var step = td.width()+parseInt(td.css('padding-left'))+parseInt(td.css('padding-right'));
         var opts = {
            step: (step ? step : 100),
            horizontal: true,
            duration: 500,
            stop: false,
            left: ".scrollable_left",
            right: ".scrollable_right",
            onmove: function () {},
            dp: 0, // delta path for per time
            ddp: 1, // delta delta path
            maxdp: 40, // max delta path
            interval: 0 // setInterval
         };

         this.opts = $.extend(opts, config);
         var root = this;
         if (this.opts.left) {
            var l = $(this.opts.left);
            l.mousedown(function () {
               root.left();
               return false;
            });
            l.mouseup(function () {
               root.stop();
               return false;
            });
            l.click(function () {
               root.stop();
               return false;
            });
            l.dblclick(function () {
               root.stop();
               return false;
            });
         }
         if (this.opts.right) {
            var r = $(this.opts.right);
            r.mousedown(function () {
               root.right();
               return false;
            });
            r.mouseup(function () {
               root.stop();
               return false;
            });
            r.click(function () {
               root.stop();
               return false;
            });
            r.dblclick(function () {
               root.stop();
               return false;
            });
         }
         el.css({
            overflow: 'hidden'
         }).each(function(){this.scrollLeft = 0});
         // mousewheel
         if ($.isFunction($.fn.mousewheel)) {
            el.mousewheel(function (event, delta) {
               root.move(-1 * delta, 100);
               return false;
            });
         }
      },
      move: function (dir, time, moveTo) {
         /*
         this.el.each(function () {
            left = this.scrollLeft;
            width = this.scrollWidth;
         });
         if (parseInt(offset)) left += this.opts.step * offset;
         if (offset == 'begin') left = 0;
         if (offset == 'end') left = width;
         if (offset == 0) {
            if (moveTo < 0) moveTo = 1;
            left = this.opts.step * (moveTo-1);
         }
         */
         root = this;


         if (this.opts.step) {
           var left = this.el.get(0).scrollLeft + this.opts.step*dir;
           this.el.stop(true).animate({scrollLeft: left}, this.opts.duration, 'swing', function () {
              var page = 1;
              var real_left = $(this).get(0).scrollLeft;
              if (root.opts.step) page = Math.ceil(real_left / root.opts.step) + 1;
              if (page > 0) root.opts.onmove(page);
           });
         }
         else {
           if (root.opts.dp<1) root.opts.dp = 0;
           var max_left = root.el.get(0).scrollWidth-root.el.width();
           clearInterval(root.opts.interval);
           root.opts.interval = setInterval(function(){
             left = root.el.get(0).scrollLeft;

             if (dir>0) var diff = max_left-left;
             else var diff = root.el.get(0).scrollLeft;
             var dp = root.opts.dp;
             var ac_width = 0;
             while (dp>0){dp-=root.opts.ddp; ac_width+=dp;}

             if (ac_width <= diff && !root.opts.stop){
               if (root.opts.dp<root.opts.maxdp) root.opts.dp+=root.opts.ddp;
             } else root.opts.dp-=root.opts.ddp;

             if (root.opts.dp<1){
               root.opts.dp = 0;
               clearInterval(root.opts.interval);
             }
             //console.log(root.opts.dp+" "+ac_width+"<"+diff);
             left += dir*root.opts.dp;

             root.el.get(0).scrollLeft = left;
             //else clearInterval(root.opts.interval);
           }, 40)
         }
      },
      moveTo: function (pos, time) {
         this.opts.stop = false;
         this.move(0, time, pos);
      },
      left: function (time) {
         this.opts.stop = false;
         this.move(-1, time);
      },
      right: function (time) {
         this.opts.stop = false;
         this.move(1, time);
      },
      stop: function () {
         this.opts.stop = true;
      },
      begin: function (time) {
         this.opts.stop = false;
         this.move('begin', time);
      },
      end: function (time) {
         this.opts.stop = false;
         this.move('end', time);
      }
   });
})(jQuery);

