/***************************************************
 |      ___           ___         ___          ___           ___         ___         ___    
 |     /__/\         /  /\       /  /\        /  /\         /  /\       /  /\       /  /\   
 |    |  |::\       /  /::\     /  /:/       /  /:/_       /  /::\     /  /::\     /  /:/   
 |    |  |:|:\     /  /:/\:\   /__/::\      /  /:/ /\     /  /:/\:\   /  /:/\:\   /__/::\   
 |  __|__|:|\:\   /  /:/  \:\  \__\/\:\    /  /:/ /::\   /  /:/~/:/  /  /:/  \:\  \__\/\:\  
 | /__/::::| \:\ /__/:/ \__\:\    \  \:\  /__/:/ /:/\:\ /__/:/ /:/  /__/:/ \__\:\    \  \:\ 
 | \  \:\~~\__\/ \  \:\ /  /:/     \__\:\ \  \:\/:/~/:/ \  \:\/:/   \  \:\ /  /:/     \__\:\
 |  \  \:\        \  \:\  /:/      /  /:/  \  \::/ /:/   \  \::/     \  \:\  /:/      /  /:/
 |   \  \:\        \  \:\/:/      /__/:/    \__\/ /:/     \  \:\      \  \:\/:/      /__/:/ 
 |    \  \:\        \  \::/       \__\/       /__/:/       \  \:\      \  \::/       \__\/  
 |     \__\/         \__\/                    \__\/         \__\/       \__\/
 |
 | JavaScript main file
 | --------------------
 | Moj spoj by Cosmopolitan
 |
 | Contents:
 |  =general
 |  =page-specifics
 |  =functions
***************************************************/

/** IE Flash bug - removecallback **/
$(window).bind('beforeunload', function() {
	window.__flash__removeCallback =
	(function() {
		return function(instance, name) {
			if (instance) instance[name] = null;
		}; // IE 6 dangling semicolon needed
	})(); // force another closure to prevent IE memory leaks
});



/***************************************************
 | =general
***************************************************/
$(function() {
  
  /**
   * Sve podstranice
   */
  if (1 == 1) {
    if($.browser.msie && $.browser.version=="6.0") {
      $('h1, span#delimiter, div.big_avatar, div#suggestion_content, span.delimiter_half, span#delimiter, span#mydata_delimiter, span#interestedin_delimiter, span#bottom_delimiter').each( function() { if ($(this).length > 0) $(this).ifixpng(); });
    }				
		enableStyleSwitching();			 
    if ($('form#login_box').length != 0) {
      validateLogin();
    }
    if($.browser.safari) { // Safari fix (preveliki selectovi)
      $('form#search_box p').css('padding','40px 0 0 40px');
      $('form#search_box p.first').css('padding-left','14px');
    }
    enableActions();
    if ($('div#chat_box').length != 0) {
      enableChatting();
    }
    hoverEffects();
  }
  
  /**
   * Samo registracija
   * Stranica: /registracija
   */
  if ($('form#register').length != 0) {
    validateRegistration();
  }

  /**
   * Samo početna stranica
   * Stranica: /
   */
  if ($('div#content_front').length != 0) {
    loadFrontFlash();
    preloadImages('home');
  }

  /**
   * Samo javni profil
   * Stranica: /pogledaj-profil/:id
   */
  if ($('a#messaging').length != 0) {
    inviteToDate();
    enableInstructions();
  }
  
  /**
   * Javni ili osobni profil
   * Stranica: /moj-profil i /pogledaj-profil/:id
  */
  if ($('a#edit_status').length != 0 || $('a#messaging').length != 0) {
    addNewProfileMessage();
    enableGallery();
    showPublicMessages();
    addPersonalFlash();
  }
  
  /**
   * Samo osobni profil
   * Stranica: /moj-profil
   */
  if ($('a#edit_status').length != 0) {
    editUserStatus();
    editVideo();
    editVideoDesc();
    inviteToDatePersonal();
    hideOrShowProfileDetails();
    enablePhotoUpload();
    enablePhotoRemoval();
    enableDateAnswers();
    enableDateRemoval();
    enableMessagingAcceptDeny();
    enableWallpaperChange();
    //addPersonalFlash();
  }
  
  /**
   * Samo uređivanje profila
   * Stranica: /moj-profil/uredi
   */ 
  if ($('form#profile_edit').length != 0) {
    enableAvatarUpload();
  }
  
  /**
   * Samo rezultati pretraživanja
   * Stranica: /trazi
   */
  if ($('div#search_results').length != 0) {
    enableSearchActions();
    enableSearchDates();
  }
  
  /**
   * Samo spojevi
   * Stranica: /spoj/:id
   */
  if ($('div#dates_list').length != 0) {
    enableDateCommunication();
    enableDateRemoval();
  }
});


   
/***************************************************
 | =page-specifics
***************************************************/

/**
 * Postavlja početne boje i omogućava mijenjanje boja
 * Stranica: sve
 */
function enableStyleSwitching() {
  if($.cookie('cd_color') == null){
    $.cookie('cd_color','pink');
  }
  initialSwitchStyleSheet();

  $('ul#color_picker li a').click( function() {
    switchStyleSheet($(this).attr('id'));
    colorFlash($(this).attr('id'));
    return false;
  });
}

/**
 * Učitava flash na naslovnici
 * Stranica: /
 */
function loadFrontFlash() {
  $('div#flash1').flash({
    src: 'http://mojspoj.cosmopolitan.hr/video/mojspoj-video.swf',
    width: 660,
    height: 230,
    wmode: 'transparent',
    flashvars: {color: $.cookie('cd_color')}
  });
  $('div#flash2').flash({
    src: 'http://mojspoj.cosmopolitan.hr/flash/smartPicker.swf',
    width: 620,
    height: 390,
    wmode: 'transparent',
    flashvars: {color: $.cookie('cd_color'), uid: 1}
  });
}
/**
 * Učitava flash na osobnom profilu
 * Stranica: /moj-profil
 */
function addPersonalFlash() {
  var uid = $('div#flash3').attr('class');
  uid = uid.split('-');
  uid = uid[1];
      
  $('div#flash3').flash({
    src: 'http://mojspoj.cosmopolitan.hr/flash/smartPicker.swf',
    width: 620,
    height: 390,
    wmode: 'transparent',
    flashvars: {color: $.cookie('cd_color'), uid: 1}
  });
}

/**
 * Omogućava otvaranje javnih poruka na javnom i osobnom profilu
 * Stranica: /moj-profil i /pogledaj-profil/:id
 */
function showPublicMessages() {
  if ($('div.message').length > 1) {
    $('div.message:gt(0)').hide();
    $('a#more_messages').click(
      function() {
        $('div.message:gt(0)').slideDown('slow');
        $('a#more_messages').hide();
        $('a#less_messages').show();
        return false;
      }
    );
    $('a#less_messages').click(
      function() {
        $('div.message:gt(0)').slideUp('slow');
        $('a#less_messages').hide();
        $('a#more_messages').show();
        return false;
      }
    );
  }
}

/**
 * Omogućava klik na namig i pusu na nečijem profilu
 * Stranica: /pogledaj-profil/:id
 */
function enableActions() {
  if ($('a#wink').length > 0) {
    $('a#wink, a#kiss').click(function() {
      $(this).unbind().css('cursor','default').click(function(){return false;}).children('img').unbind();
      var clicked = $(this);
      var type = $(this).attr('id');
      var tid = $(this).attr('rel');
      $.post(
        '/ajax/action',
        {
          type: type,
          tid: tid
        },
        function(data) {
          if (data == 1) {
            $(clicked).children('img').fadeTo('slow', 0.33);
          } else if (data == -1) {
            window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
          }
        }
      )
      return false;
    });
  }
}
/**
 * Omogućava pozivanje na spoj kod preporuke dana
 * Stranica: /moj-profil
 */
function inviteToDatePersonal() {
  
  $('form#quick_message textarea').focus(function(){
    if ($(this).val() == 'Upiši svoju poruku...') {
      $(this).val('')
    }
  });
  
  $('form#quick_message p#send button').click(function() {
    var message = $(this).parent().parent().children('textarea').val();
    var clicked = $(this);
    
    if (message != '' && message != 'Upiši svoju poruku...') {
      $(clicked).unbind().css('cursor','default').click(function(){return false;}).children('img').unbind();
      var type = 'date';
      var tid = $('form#quick_message').attr('action');
      $.post(
        '/ajax/action',
        {
          type: type,
          tid: tid,
          message: message
        },
        function(data) {
          if (data == 1) {
            $('form#quick_message').fadeTo('slow',0.33);
          } else if (data == -1) {
            window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
          } else {
            $('form#quick_message textarea').val('Došlo je do greške prilikom poziva. Provjeri imaš li već spoj s ovom osobom.');
          }
        }
      );
    }
    return false; 
  });
    
}
/**
 * Omogućava pozivanje na spoj na nečijem profilu i kod preporuke dana
 * Stranica: /pogledaj-profil/:id i /moj-profil
 */
function inviteToDate() {
  if ($('a#messaging').hasClass('disabled')) {
    $('a#messaging').fadeTo('fast', 0.33).click(function() {
      return false;  
    });
  } else {
    $('a#messaging').click(function(){
      var clicked = $(this);
      if (!($('html').hasClass('user'))) { // Nelogirani na registraciju
        window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
      }
      if ($('form#new_date').length == 0) {
        var html = '<form id="new_date" action="post_message.php" method="post"><div id="new_date_text"><textarea name="new_date_text">Upiši svoju poruku...</textarea><p class="send"><button type="submit">Pošalji</button></p></div></form>';
        
        $('div#user_action').after(html);
        $('form#new_date').slideDown('slow');
        
        $('form#new_date textarea').focus(function(){
          if ($(this).val() == 'Upiši svoju poruku...') {
            $(this).val('');  
          }
        });
      
        $('form#new_date p.send button').click(function() {
          var message = $('form#new_date textarea').val();
          
          if ((message != '') && (message != 'Upiši svoju poruku...')) {
            $(clicked).unbind().css('cursor','default').click(function(){return false;});
            var type = 'date';
            var tid = $('a#messaging').attr('rel');
            $.post(
              '/ajax/action',
              {
                type: type,
                tid: tid,
                message: message
              },
              function(data) {
                if (data == 1) {
                  $('form#new_date').slideUp('slow',function(){$(this).remove()});
                  $(clicked).children('img').fadeTo('slow', 0.33);
                } else if (data == -1) {
                  window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
                } else {
                  $('form#new_date textarea').val('Došlo je do greške prilikom poziva. Provjeri imaš li već spoj s ovom osobom.');
                }
              }
            );
          }
          return false;
        });
      }
      return false;
    });
  }
}

/**
 * Omogućava puse i namige kod rezultata pretraga
 * Stranica: /trazi
 */
function enableSearchActions() {
  $('a.search_wink, a.search_kiss').click(function() {
    var clicked = $(this);
    $(clicked).unbind().css('cursor','default').click(function(){return false;});
    var type = $(this).attr('class');
    type = type.split('_');
    type = type[1];
    var tid = $(this).attr('rel');
    $.post(
      '/ajax/action',
      {
        type: type,
        tid: tid
      },
      function(data) {
        if (data == 1) {
          $(clicked).children('img').fadeTo('slow', 0.33);
        } else if (data == -1) {
          window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
        }
      }
    )
    
    return false;
  });
}
/**
 * Omogućava pozivanje na spoj kod rezultata pretraga
 * Stranica: /trazi
 */
function enableSearchDates() {
   
  $('a.search_messaging').each(function() {
    
    if ($(this).hasClass('disabled')) {
      $(this).fadeTo('fast', 0.33).click(function() {
        return false;  
      });
    } else { 
      $(this).click(function(){
        if (!($('html').hasClass('user'))) { // Nelogirani na registraciju
          window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
        }
        if ($(this).next('.new_search_date').length == 0) {
          var html = '<form class="new_search_date" action="#" method="post"><div class="new_search_date_text"><textarea name="new_search_date_text">Upiši svoju poruku...</textarea><p class="send"><button type="submit">Pošalji</button></p></div></form>';
          var tid = $(this).attr('rel');
          var msg_button = $(this);
          
          $(this).after(html);
          var search_form = $(this).next('.new_search_date')
          search_form.slideDown('slow');
          
          search_form.children('div').children('textarea').focus(function(){
            if (search_form.children('div').children('textarea').val() == 'Upiši svoju poruku...') {
              search_form.children('div').children('textarea').val(''); 
            }
          });
        
          search_form.children('div').children('p.send').children('button').click(function() {
            var message = $(this).parent().prev('textarea').val();
            var clicked = $(this);
            
            if ((message != '') && (message != 'Upiši svoju poruku...')) {
              $(msg_button).unbind().css('cursor','default').click(function(){return false;});
              var type = 'date';
              $.post(
                '/ajax/action',
                {
                  type: type,
                  tid: tid,
                  message: message
                },
                function(data) {
                  if (data == 1) {
                    $(search_form).slideUp('slow',function(){$(this).remove()});
                    $(msg_button).children('img').fadeTo('slow', 0.33);;
                  } else if (data == -1) {
                    window.location.replace("http://mojspoj.cosmopolitan.hr/registracija");
                  } else {
                    $(search_form).find('textarea').val('Došlo je do greške prilikom poziva. Provjeri imaš li već spoj s ovom osobom.');
                  }
                }
              );
            }
            return false;
          });
        }
        return false;
      
      });
    } 
  });
  
}

/**
 * Omogućava direktno odgovaranje na spoju (osobni profil)
 * Stranica: /moj-profil
 */
function enableDateAnswers() {
  $('a.reply_date').click(function(){
      if ($(this).next('form.reply_date').length == 0) {
        var html = '<form class="reply_date" action="#" method="post"><div class="new_date_reply"><textarea name="new_date_reply">Upiši svoju poruku...</textarea><p class="send"><button type="submit">Pošalji</button></p></div></form>'; // Dodat hidden field za target id
        
        $(this).parent().append(html);        
        //$(this).next('form.reply_date').slideDown('slow');
        $(this).next('form.reply_date').show();
        
        $(this).next('form.reply_date').children('div.new_date_reply').children('textarea').focus(function(){
          if ($(this).val() == 'Upiši svoju poruku...') {
            $(this).val('');  
          }
        });
        
        var did = $(this).attr('rel');
        did = did.split('-');
        var tid = did[1];
        did = did[0];
        
        var form_element = $(this).next('form.reply_date');
        
        $(this).next('form.reply_date').children('div.new_date_reply').children('p.send').children('button').click(function() {
          var message = form_element.children('div.new_date_reply').children('textarea').val();
          
          if ((message != '') && (message != 'Upiši svoju poruku...')) {
            var type = 'reply';
            $.post(
              '/ajax/date',
              {
                type: type,
                tid: tid,
                did: did,
                message: message
              },
              function(data) {
                if (data == 0) {
                } else {
                  form_element.slideUp('slow',function(){$(this).remove()});
                }
              }
            );
            
          }
          return false;
        });
      }
      
      return false;
    });
}


/**
 * Odgovaranje na prikazu pojedinog spoja
 * Stranica: /spoj/:id
 */
function enableDateCommunication() {
  $('div#date_answer textarea').focus(function(){
    if ($('div#date_answer textarea').val() == 'Upiši svoj odgovor...') {
      $('div#date_answer textarea').val('');
    }
  });
  
  $('div#date_answer a').click(function(){
    var message = $(this).prev('textarea').val();
    var tid = $(this).parent().prev('a.remove_contact').attr('rel');
    var did = $(this).attr('rel');
    var button = $(this);
    if ((message != '') && (message != 'Upiši svoj odgovor...')) {
      //button.unbind().click(function(){return false});
      var type = 'write';
      $.post(
        '/ajax/date',
        {
          type: type,
          tid: tid,
          did: did,
          message: message
        },
        function(data) {
          if (data == 0) {
          } else {
            //button.fadeTo('slow',0.33);
            $('div#date_answer').after(data).next().hide().slideDown('slow');
          }
        }
      );
    }
    return false;
  });
}


  
/**
 * Omogućava širenje i skupljanje uputa na javnom profilu
 * Stranica: /pogledaj-profil/:id
 */
function enableInstructions() {
  if ($('div#instructions').length != 0) {
    $('a#open_instructions').click(
      function() {
        $('div#instructions').slideDown('normal');
        $('a#open_instructions').hide();
        $('a#close_instructions').show();
        return false;
      }
    );
    $('a#close_instructions').click(
      function() {
        $('div#instructions').slideUp('normal');
        $('a#close_instructions').hide();
        $('a#open_instructions').show();
        return false;
      }
    );
  }
}
  
/**
 * Omogućava dodavanje nove javne poruke na osobnom ili tuđem profilu
 * Stranica: /moj-profil i /pogledaj-profil/:id
 */
function addNewProfileMessage() {
  $('div#new_message_text textarea').focus(function(){
    if ($(this).val() == 'Upiši svoju poruku...') {
      $(this).val('');  
    }
  });

  $('p#publish button').click(function() {
    var message = $('div#new_message_text textarea').val();
        
    if ((message != '') && (message != 'Upiši svoju poruku...')) {
      var tid = $('form#new_message').attr('action');
      $.post(
        '/ajax/message',
        {
          tid: tid,
          message: message
        },
        function(data) {
          addToMessages(data);
        }
      );
    }
    return false;
  });
}

/**
 * Postavlja galeriju za korisnike (zoomimage i scrollable)
 * Stranica: /moj-profil i /pogledaj-profil/:id
 */
function enableGallery() {
  if ($("a.user_photo_gallery").length != 0) {
    $("a.user_photo_gallery").zoomimage({
      border: 10,
      controls: false,
      duration: 200
    });
    $("div.scrollable").scrollable({
      size: 3
    });
  } else {
    if ($('form#quick_message').length == 0) { // Osobni profil ima drukčiji string
      $('div.items').prepend('<p class="no_photos">Korisnik trenutno nema fotografija u galeriji.</p>');
    }
  }
}

/**
 * Omogućava izmjenu pozadine profila
 * Stranica: /moj-profil
 */
function enableWallpaperChange() {
  $('a#edit_wallpaper').click(function(){
    var wallpaper_list = '<ul style="display: none" id="wallpaper_list"><span style="font-size: 12px; line-height: 16px; color: #000; margin-left: 12px;">Odaberi temu pozadine:</span><br /><li class="back_blank">Prazno</li><li class="back_kisses">Poljupci</li><li class="back_splatter">Mrlje</li><li class="back_grass">Linije</li></ul>';
    $(this).attr('id','save_wallpaper');
    
    $(this).before(wallpaper_list);
    $('ul#wallpaper_list').slideDown('slow');
    
    var current = $('div#general').attr('class');
    $('ul#wallpaper_list li.' + current).attr('id','selected');
    
    $('ul#wallpaper_list li').click(function() {
      $('ul#wallpaper_list li').attr('id',null);
      $(this).attr('id','selected');
      $('div#general').attr('class',$(this).attr('class'));
    });
    
    $('a#edit_wallpaper, a#save_wallpaper').unbind();
    $('a#save_wallpaper').click(function(){
      var new_wallpaper = $('ul#wallpaper_list li#selected').attr('class');
      
      $.post(
        '/ajax/wallpaper',
        {
          wallpaper: new_wallpaper
        },
        function(data) {
          if (data == 1) {
            $('ul#wallpaper_list').slideUp('fast', function(){$(this).remove();});
            $('a#save_wallpaper').attr('id','edit_wallpaper');
            $('a#edit_wallpaper, a#save_wallpaper').unbind();
            enableWallpaperChange();
          }
        }
      );
      return false;
    });
    
    return false;
  });
}

/**
 * Omogućava izmjenu statusa
 * Stranica: /moj-profil
 */
function editUserStatus() {
  $('a#edit_status, div#user_status p.personal').click(function(){
    if ($(this).attr('id') == 'edit_status') {
      $(this).attr('id','save_status');
    } else {
      $(this).next('a#edit_status').attr('id','save_status');
    }
    
    var user_text = $('div#user_status p.personal').html();
    user_text = user_text.replace(/<br>|<BR>/g, "\n");
    var text_width = $('div#user_status p').width();
    var text_height = $('div#user_status p').height();
    if (text_height == 0) {
      text_height = 30;
    }
    $('div#user_status p').replaceWith("<textarea style=\"width: " + text_width + "px; height: " + text_height + "px;\"id=\"user_status_edit\">" + user_text + "</textarea>");
    $('div#user_status textarea').TextAreaExpander();
    //$('div#user_status textarea#user_status_edit').autoResize();
    
    $('a#edit_status, a#save_status, div#user_status p.personal').unbind();
    $('a#save_status').click(function(){
      var status = $('div#user_status textarea').val();
      status = status.replace(/\n/g,"<br/>");
      
      $.post(
        '/ajax/status',
        {
          status: status
        },
        function(data) {
          setNewStatus(data); 
        }
      );
      return false;
    });
    
    return false;
  });
}

/**
 * Omogućava izmjenu videa
 * Stranica: /moj-profil
 */
function editVideo() {
  $('a#edit_video').click(function() {
    $(this).attr('id','save_video');
    $('div#youtube object').replaceWith('<textarea style="width: 269px; height: 212px;">Ovdje unesite link na Youtube filmić kojeg želite prikazati.</textarea>');
    
    $('a#edit_video, a#save_video').unbind();
    $('a#save_video').click(function(){
      var type = 'new';
      var url = $('div#youtube textarea').val();
      
      if (url != '') {
        $.post(
          '/ajax/video',
          {
            type: type,
            url: url
          },
          function(data) {
            if (data == '-1') {
              $('div#youtube textarea').val('Izgleda kako je došlo do pogreške prilikom unosa. Pokušajte ponovno.');
            } else {
              $('div#youtube textarea').replaceWith(data);
              $('a#save_video').attr('id','edit_video');
              $('a#edit_video, a#save_video').unbind();
              editVideo();
            }
          }
        );
      }
      
      return false;
    });
    
    return false;
  });
}

/**
 * Omogućava izmjenu opisa videa
 * Stranica: /moj-profil
 */
function editVideoDesc() {
  $('a#edit_video_desc, div#youtube_description p.personal').click(function() {
    if ($(this).attr('id') == 'edit_video_desc') {
      $(this).attr('id','save_video_desc');
    } else {
      $(this).next('a#edit_video_desc').attr('id','save_video_desc');
    }
    
    
    var video_desc = $('div#youtube_description p').html();
    video_desc = video_desc.replace(/<br>|<BR>/g, "\n");
    var text_width = $('div#youtube_description p').width();
    var text_height = $('div#youtube_description p').height();
    if (text_height == 0) {
      text_height = 30;
    }
    $('div#youtube_description p').replaceWith("<textarea style=\"width: " + text_width + "px; height: " + text_height + "px;\"id=\"video_desc_edit\">" + video_desc + "</textarea>");
    $('div#youtube_description textarea').TextAreaExpander();
    
    $('a#edit_video_desc, a#save_video_desc, div#youtube_description p.personal').unbind();
    $('a#save_video_desc').click(function(){
      var desc = $('div#youtube_description textarea').val();
      desc = desc.replace(/\n/g,"<br>");
      
      var type = 'desc';
      $.post(
        '/ajax/video',
        {
          type: type,
          desc: desc
        },
        function(data) {
          $('a#save_video_desc').attr('id','edit_video_desc');
          $('div#youtube_description textarea').replaceWith(data);
          $('a#edit_video_desc, a#save_video_desc, div#youtube_description p.personal').unbind();
          editVideoDesc();
        }
      );
      return false;
    });
    
    return false;
  });
  
}

/**
 * Širenje i skupljanje elemenata (puse, namizi, pozivi na spoj itd.) na osobnom profilu
 * Stranica: /moj-profil
 */
function hideOrShowProfileDetails() {
  $('div.hidden[id$=_content]').hide();
  
  $('span.h4_details, span.h4_details_short').click(function(){
    var link = $(this).children('span#[id$=_toggle]');
    var this_ID = $(link).attr('id');
    var this_ID_array = this_ID.split('_');
    var box = this_ID_array[0];
    var content_selector = 'div#' + box + '_content';
    var content_class = $(content_selector).attr('class');
    var toggle_selector = 'span#' + box + '_toggle';
    
    if (content_class == 'hidden') {
      $(content_selector).slideDown('fast').removeClass('hidden');
      $(toggle_selector).removeClass('hidden');
    }
    else {
      $(content_selector).slideUp('fast').addClass('hidden');
      $(toggle_selector).addClass('hidden');
    }
    
    return false;
  });
}

/**
 * Omogućava upload fotki
 * Stranica: /moj-profil
 */
function enablePhotoUpload() {
  if ($('a.user_photo_gallery').length == 0) {
    $('div.items').prepend('<p class="no_photos">Trenutno nemaš fotografija u galeriji.</p>');
  }
  var color = $.cookie('cd_color');
  var short_color = color.substr(0,2);
  var button_img = 'images/back.' + short_color + '.profile.photos.new.png';
  
  $('input#add_photo').uploadify({
    'uploader'       : 'http://mojspoj.cosmopolitan.hr/flash/uploadify.swf',
    'script'         : '/ajax/photo',
    'scriptData'     : {
      'type'         : 'upload',
      'sess_id'      : $.cookie('PHPSESSID')
    },
    'cancelImg'      : '/images/cancel.png',
    'queueID'        : 'photo_uploads',
    'buttonImg'      : button_img,
    'width'          : 122,
    'height'         : 20,
    'auto'           : true,
    'multi'          : true,
    'fileDesc'       : '*.jpg, *.jpeg',
    'fileExt'        : '*.jpg;*.jpeg,*.JPG,*.JPEG',
    'onComplete'     : addPhotoToGallery
  });
}

/**
 * Omogućava izmjenu avatara
 * Stranica: /moj-profil/uredi
 */
function enableAvatarUpload() {
  var color = $.cookie('cd_color');
  var short_color = color.substr(0,2);
  var avatar_img = '/images/back.' + short_color + '.profile.edit.button.avatar.png';
  
  $('input#edit_avatar').uploadify({
    'uploader'       : 'http://mojspoj.cosmopolitan.hr/flash/uploadify.swf',
    'script'         : '/ajax/avatar',
    'scriptData'     : {
      'sess_id'      : $.cookie('PHPSESSID')
    },
    'cancelImg'      : '/images/cancel.png',
    'queueID'        : 'photo_uploads',
    'buttonImg'      : avatar_img,
    'width'          : 113,
    'height'         : 20,
    'auto'           : true,
    'multi'          : false,
    'fileDesc'       : '*.jpg, *.jpeg',
    'fileExt'        : '*.jpg;*.jpeg,*.JPG,*.JPEG',
    'onComplete'     : changeAvatar
  });
}

/**
 * Omogućava uklanjanje fotki
 * Stranica: /moj-profil
 */
function enablePhotoRemoval() {
  $('div#photos a.user_photo_gallery').each(function(){
    var pid = $(this).attr('rel');
    $(this).after('<br /><a href="#" class="remove_photo" rel="' + pid + '">Briši</a>');
  });
  $('div#photos a.remove_photo').each(function(){
    $(this).click(function(){
      var this_photo = $(this);
      var really = confirm('Želite li zaista obrisati ovu fotografiju?');
      if (really) {
        var type = 'remove';
        var pid = this_photo.attr('rel');
        var filename = this_photo.prev().prev().children('img').attr('alt');
        $.post(
          '/ajax/photo',
          {
            type: type,
            filename: filename,
            pid: pid
          },
          function(data) {
            if (data != 0) {
              this_photo.prevAll().remove();
              this_photo.remove();
              if ($('a.user_photo_gallery').length == 0) {
                $('div.items').prepend('<p class="no_photos">Trenutno nemaš fotografija u galeriji.</p>');
              } else {
                var api = $("div.scrollable").scrollable({size: 3});
                api.reload();
              }
            }
          }
        )
        
      }
      return false;
    });
  });
}


/**
 * Omogućava brisanje spoja na osobnom profilu i na ispisu svih poruka nekog spoja
 * Stranica: /moj-profil i /spoj/:id
 */
function enableDateRemoval() {
  $('a.remove_contact').click(function(){
    var really = confirm('Želiš li zaista obrisati ovaj spoj?\nBrisanjem spoja obrisat ćeš cijelu povijest spoja s ovom osobe.');
    var this_element = $(this);
    
    if (really) {
      
      var type = 'remove';
      var did = $(this).attr('rel');
      $.post(
        '/ajax/date',
        {
          type: type,
          did: did
        },
        function(data) {
          if (data == 1) {
            if ($('div#dates_list').length != 0) {
              // Ako smo na ispisu svih poruka, baci natrag na osobni profil
              window.location = "http://mojspoj.cosmopolitan.hr/moj-profil";
            }
            else {
              this_element.parent().parent().slideUp('slow', function(){$(this).remove()}).next('p.delimiter').slideUp('slow', function(){$(this).remove()});
            }
          }
          else {
            
            //to-do Greška?
          }
          
        }
      );
    }
    return false;
  });
}

/**
 * Omogućava prihvaćanje ili odbijanje spoja
 * Stranica: /moj-profil
 */
function enableMessagingAcceptDeny() {
  $('div.new_messaging_request a.new_messaging_accept, div.new_messaging_request a.new_messaging_deny').click(function(){
    
    $(this).fadeTo('slow', 1).prev('a').fadeTo('slow', 0.33).end().next('a').fadeTo('slow', 0.33);
    
    var clicked = $(this).attr('class');
    clicked = clicked.split('_');
    clicked = clicked[2];
    
    var this_div = $(this).parent().parent();

    if (this_div.children('form[class^=new_messaging]').length == 0) {
      var html = '<form class="new_messaging_' + clicked + '" action="'+ clicked +'" method="post"><div class="new_messaging_' + clicked + '"><textarea name="new_messaging_' + clicked + '">Upiši svoj odgovor...</textarea><p class="send"><button type="submit">Pošalji</button></p></div></form>';
      this_div.children('div.new_messaging_actions').after(html);
      this_div.children('form.new_messaging_' + clicked).slideDown('slow');
      
      $(this_div).find('textarea').focus(function(){
		$tmp=$(this_div).find('textarea').val();
        if ($tmp == 'Upiši svoju poruku...' || $tmp == 'Upiši svoj odgovor...') {
          $(this).val(''); 
        }
      });
      
      $(this_div).find('button').click(function() {
        var type = $(this_div).children('form[class^=new_messaging]').attr('action');
        var message = this_div.find('textarea').val();
        var tid = $(this_div).find('a.new_messaging_user').attr('href');
        tid = tid.split('/');
        tid = tid[2];
        $.post(
          '/ajax/date',
          {
            type: type,
            message: message,
            tid: tid
          },
          function(data) {
            if (data != 0) {
              $(this_div).slideUp('slow', function() {$(this_div).remove()});
              var num_of_invites = $('div#messaging span.h4_details strong').text();
              num_of_invites = parseInt(num_of_invites) - 1;
              $('div#messaging span.h4_details strong').text(num_of_invites);
              if (type == 'accept') {
                if ($('div#dates_content div.date').length > 0) {
                  data = data + '<p class="delimiter"><img alt="Delimiter" src="images/back.profile.delimiter.small.3.png"/></p>';
                }
                $('div#dates_content').prepend(data);
                $('a.remove_contact, a.reply_date').unbind();
                enableDateRemoval();
                enableDateAnswers();
              }
            } else {
              // to-do => greška
            }
          }
        );
        return false;
      });
    }
    
    this_div.children('form[class^=new_messaging]').attr('action',clicked);

    return false;
  });
}

function hoverEffects() {
  
  $('div#user_action a img, div.search_action a img').each(function() {
    var $_this = $(this);
    var prevImage = $_this.attr('src');
    var newImage = prevImage.substring(10);
    newImage = '/images/bl' + newImage;
    newImage = newImage.substring(0, newImage.indexOf('.png'));
    newImage = newImage + '.des.png';
    $_this.hover(
      function() {
        $_this.attr('src', newImage);          
      },
      function() {
        $_this.attr('src', prevImage);
      }
    );
  });
  

  
}

/***************************************************
 | =functions
***************************************************/
/**
 * Funkcija prima boju i postavlja cookie na tu boju te
 * mijenja styelsheet koji se brine o specifičnim bojama.
 * 
 * @param color Boja koja će se postaviti - mora biti iz sljedećeg skupa vrijednosti: pink, blue, orange ili green
 */
function switchStyleSheet(color) {
  var options = {
    expires: 365,
    path: '/'
  }
  var prev_color = $.cookie('cd_color');
  var prev_short_color = prev_color.substr(0,2);
  $.cookie('cd_color', color, options);
  $('ul#color_picker li a').removeClass('active');
  $('ul#color_picker li a#' + color).addClass('active');
  var short_color = color.substr(0,2);
  
  var ie6 = '';
  if($.browser.msie && $.browser.version=="6.0") {
    ie6 = 'ie6.';
  }
  
  $('link[rel=stylesheet]:eq(1)').attr('href','/css/color_' + short_color + '.css');
  button_img = 'images/back.' + short_color + '.profile.photos.new.png';
  avatar_img = '/images/back.' + short_color + '.profile.edit.button.avatar.png';
  wink = '/images/' + short_color + '.profile.action.wink.' + ie6 + 'png';
  kiss = '/images/' + short_color + '.profile.action.kiss.' + ie6 + 'png';
  msg = '/images/' + short_color + '.profile.action.messaging.' + ie6 + 'png';
  arrow_down = '/images/' + short_color + '.arrow.down.png';
  arrow_up = '/images/' + short_color + '.arrow.up.png';
  cosmo = '/images/cosmo.' + short_color + '.png';
    
  if ($('a#kiss').length > 0) {
    $('a#kiss img').attr('src',kiss);
    $('a#wink img').attr('src',wink);
    $('a#messaging img').attr('src',msg);
  }
  
  if ($('a.search_wink').length > 0) {
    $('a.search_kiss img').attr('src',kiss);
    $('a.search_wink img').attr('src',wink);
    $('a.search_messaging img').attr('src',msg);
  }
  
  if ($('a#open_instructions').length > 0) {
    $('a#open_instructions img').attr('src', arrow_down);
    $('a#close_instructions img').attr('src', arrow_up);
  }
  
  if ($('a#more_messages').length > 0) {
    $('a#more_messages img').attr('src', arrow_down);
    $('a#less_messages img').attr('src', arrow_up);
  }

  if ($('div#details_left a.myprofile').length > 0) {
    $('div#details_left a.myprofile img').attr ('src', cosmo);
  }
  
  if ($('input#add_photo').length > 0) {
	var old_value = "";
	//IE bug - ne vidi param tagove
	if($.browser.msie) {
		old_value = $('object#add_photoUploader').attr('flashvars');
	}
	else
	{
		old_value = $('object#add_photoUploader param[name=flashvars]').attr('value');
	}
    
    var new_value = old_value.replace('back.' + prev_short_color + '.profile.photos.new.png', 'back.' + short_color + '.profile.photos.new.png');
    $('object#add_photoUploader param[name=flashvars]').attr('value', new_value);
    var old_data = $('object#add_photoUploader').attr('data');
    var new_data = old_data + '?' + parseInt(Math.random()*1000);
    $('object#add_photoUploader').attr('data', new_data);
    
  }
  
  if ($('input#edit_avatar').length > 0) {
    var old_value = $('object#edit_avatarUploader param[name=flashvars]').attr('value');
    var new_value = old_value.replace('back.' + prev_short_color + '.profile.edit.button.avatar.png', 'back.' + short_color + '.profile.edit.button.avatar.png');
    $('object#edit_avatarUploader param[name=flashvars]').attr('value', new_value);
    var old_data = $('object#edit_avatarUploader').attr('data');
    var new_data = old_data + '?' + parseInt(Math.random()*1000);
    $('object#edit_avatarUploader').attr('data', new_data);
  }
}

/**
 * Početno postavljanje boja
 */
function initialSwitchStyleSheet() {
  var options = {
    expires: 365,
    path: '/'
  }
  var color = $.cookie('cd_color');
  if (color == "") {
    color = "pink";
  }
  $('ul#color_picker li a').removeClass('active');
  $('ul#color_picker li a#' + color).addClass('active');
  var short_color = color.substring(0,2);

  var ie6 = '';
	 
  if($.browser.msie && $.browser.version=="6.0") {
    ie6 = 'ie6.';
  }

  wink = '/images/' + short_color + '.profile.action.wink.' + ie6 + 'png';
  kiss = '/images/' + short_color + '.profile.action.kiss.' + ie6 + 'png';
  msg = '/images/' + short_color + '.profile.action.messaging.' + ie6 + 'png';
  arrow_down = '/images/' + short_color + '.arrow.down.png';
  arrow_up = '/images/' + short_color + '.arrow.up.png';
    
  if ($('a#kiss').length > 0) {
    $('a#kiss img').attr('src',kiss);
    $('a#wink img').attr('src',wink);
    $('a#messaging img').attr('src',msg);
  }
  
  if ($('a.search_wink').length > 0) {
    $('a.search_kiss img').attr('src',kiss);
    $('a.search_wink img').attr('src',wink);
    $('a.search_messaging img').attr('src',msg);
  }
  
  if ($('a#open_instructions').length > 0) {
    $('a#open_instructions img').attr('src', arrow_down);
    $('a#close_instructions img').attr('src', arrow_up);
  }
  
  if ($('a#more_messages').length > 0) {
    $('a#more_messages img').attr('src', arrow_down);
    $('a#less_messages img').attr('src', arrow_up);
  }
  
}

/**
 * Mijenjanje boje flasha
 */
function colorFlash(color) {
  var options = {
    expires: 365,
    path: '/'
  }
  if ($('div#flash1 embed').length != 0) {
    $('div#flash1 embed').get(0).SetVariable("color", color);
  }
  if ($('div#flash2 embed').length != 0) {
    
    var new_value = 'color=' + color;
    var new_src = 'http://mojspoj.cosmopolitan.hr/flash/smartPicker.swf?' + parseInt(Math.random()*1000);
    $('div#flash2 embed').attr('flashvars', new_value);
    $('div#flash2 embed').attr('src', new_src);
  }
  if ($('div#flash3 embed').length != 0) {
    var uid = $('div#flash3').attr('class');
    uid = uid.split(' ');
    uid = uid[0];
    uid = uid.split('-');
    uid = uid[1];
    
    new_value = 'color=' + color + '&uid=' + uid;
    new_src = 'http://mojspoj.cosmopolitan.hr/flash/smartPicker.swf?' + parseInt(Math.random()*1000);
    $('div#flash3 embed').attr('flashvars', new_value);
    $('div#flash3 embed').attr('src', new_src);
  }
}

/**
 * Funkcija prima dio sajta na kojem će se slike preloadat.
 * 
 * @param site Home, userpage...
 */
function preloadImages(site) {
  var image_html = '';
  switch(site) {
    case 'home':
      image_html =
        '<div style="display: none; visibility: hidden;">' +
        '<img src="images/back.gr.footer.sprite.png" alt="preload" />' +
        '<img src="images/back.gr.search.png" alt="preload" />' +
        '<img src="images/back.gr.login.png" alt="preload" />' +
        '<img src="images/back.gr.main.top.png" alt="preload" />' +
        '<img src="images/back.gr.h2.png" alt="preload" />' +
        '<img src="images/back.gr.button.login.png" alt="preload" />' +
        '<img src="images/back.gr.content.top.png" alt="preload" />' +
        '<img src="images/back.pi.footer.sprite.png" alt="preload" />' +
        '<img src="images/back.pi.search.png" alt="preload" />' +
        '<img src="images/back.pi.login.png" alt="preload" />' +
        '<img src="images/back.pi.main.top.png" alt="preload" />' +
        '<img src="images/back.pi.h2.png" alt="preload" />' +
        '<img src="images/back.pi.button.login.png" alt="preload" />' +
        '<img src="images/back.pi.content.top.png" alt="preload" />' +
        '<img src="images/back.or.footer.sprite.png" alt="preload" />' +
        '<img src="images/back.or.search.png" alt="preload" />' +
        '<img src="images/back.or.login.png" alt="preload" />' +
        '<img src="images/back.or.main.top.png" alt="preload" />' +
        '<img src="images/back.or.h2.png" alt="preload" />' +
        '<img src="images/back.or.button.login.png" alt="preload" />' +
        '<img src="images/back.or.content.top.png" alt="preload" />' +
        '<img src="images/back.bl.footer.sprite.png" alt="preload" />' +
        '<img src="images/back.bl.search.png" alt="preload" />' +
        '<img src="images/back.bl.login.png" alt="preload" />' +
        '<img src="images/back.bl.main.top.png" alt="preload" />' +
        '<img src="images/back.bl.h2.png" alt="preload" />' +
        '<img src="images/back.bl.button.login.png" alt="preload" />' +
        '<img src="images/back.bl.content.top.png" alt="preload" />' +
        '</div>';
      break;
    case 'user':
      //to-do
      break;
    default:
      break;
  }
  $('body').append(image_html);
}

/**
 * Validiraj login formu
 */
function validateLogin() {
  $('form#login_box').validate(
    {
      rules:
      {
        email: {
          required: true,
          email: true
        },
        password: "required"
      },
      messages:
      {
        email: "",
        password: ""
      },
      errorPlacement: function(error, element)
      {
        error.appendTo('body');
      }
    }
  );
}

/**
 * Validiraj registracijsku formu
 */
function validateRegistration() {
  $('form#register').validate({
    rules: {
      username: "required",
      password: "required",
      passwordConfirm: {
        equalTo: "form#register input#password",
        required: true
      },
      email: {
        required: true,
        email: true
      },
      emailConfirm: {
        equalTo: "form#register input#email",
        required: true,
        email: true
      },
      optin: "required",
      city: "required",
      gender: "required"
    },
    messages: {
      username: "Korisničko ime je obavezno.",
      password: "Lozinka je obavezna.",
      passwordConfirm: {
        equalTo: "Lozinke moraju biti jednake.",
        required: "Lozinka je obavezna."
      },
      email: {
        required: "E-mail adresa je obavezna.",
        email: "E-mail adresa mora biti valjana."
      },
      emailConfirm: {
        equalTo: "E-mail adrese moraju biti jednake.",
        required: "E-mail adresa je obavezna.",
        email: "E-mail adresa mora biti valjana."
      },
      optin: "Slaganje s uvjetima korištenja je obavezno.",
      city: "Grad je obavezan.",
      gender: "Odabir spola je obavezno."
    },
    errorPlacement: function(error, element)
    {
      if (element.is(":radio")) {
        element.next().next().next().after( error );
        //error.appendTo(element.parent().parent());
      }
      else if (element.is(":checkbox")) {
        error.appendTo(element.parent());
      }
      else {
        element.after( error );
        //error.after( element.parent() );
      }
    }
  });
}

/**
 * Dodaj novu poruku među ostale javne poruke
 *
 * @param message Poruka koja je poslana
 */
function addToMessages(message) {
  if ($('div#message_list div.message:eq(1)').is(':hidden')) {
    $('div#message_list div.message:first').hide().before(message);
  } else {
    $('div#message_list').prepend(message);
  }
  
  $('div#new_message_text textarea').val('Upiši svoju poruku...');
  var color = $.cookie('cd_color');
  color = color.substr(0,2);
  
  var extraMessages = $('div#message_list div.message').length - 1;
  if (extraMessages == 0) {
    
  } else if (extraMessages == 1) {
    var links =
      '<a id="more_messages" href="#">Još 1 poruka <img alt="Dodatne poruke" src="/images/' + color + '.arrow.down.png"/></a>' +
      '<a id="less_messages" href="#">Sakrij <img alt="Dodatne poruke" src="/images/' + color + '.arrow.up.png"/></a>';
    $('div#message_list').append(links);
    
    $('div.message:gt(0)').hide();
    $('a#more_messages').click(
      function() {
        $('div.message:gt(0)').slideDown('slow');
        $('a#more_messages').hide();
        $('a#less_messages').show();
        return false;
      }
    );
    $('a#less_messages').click(
      function() {
        $('div.message:gt(0)').slideUp('slow');
        $('a#less_messages').hide();
        $('a#more_messages').show();
        return false;
      }
    );
    
  } else {
    
    $('a#more_messages').html('Još ' + extraMessages + ' poruka<img alt="Dodatne poruke" src="/images/' + color + '.arrow.down.png"/>');
  }
}

/**
 * Postavlja novi status
 *
 * @param new_user_text Novi korisnikov status
 */
function setNewStatus(new_user_text) {
  $('a#save_status').attr('id','edit_status');
  $('div#user_status textarea').replaceWith(new_user_text);
  $('a#edit_status, a#save_status, div#user_status p.personal').unbind();
  editUserStatus();
}

/**
 * Omogućava chat
 */
function enableChatting() {
  var windowFocus = true;
  var username;
  var chatHeartbeatCount = 0;
  var minChatHeartbeat = 4000;
  var maxChatHeartbeat = 50000;
  var chatHeartbeatTime = minChatHeartbeat;
  var originalTitle;
  var blinkOrder = 0;
  // IE 6 ne dobije chatbox
  if ($.browser.msie && $.browser.version == "6.0") {
    $('div#chat_box').remove();
  } else { // Ostali može
    // ako nema nikog online
    if ($('div#chat_box ul li').length == 0) {
      $('div#chat_box ul').html('<p style="color: #fff; font-weight: bold; font-size: 12px; padding: 10px 0 0 10px;">Niti jedan kontakt nije online.</p>');
    } else {
      // Pripremi chatbox prije prvog AJAX-a
      $('div#chat_box ul li').each(function(){
        $(this).click(function(){
          $('div#chat_box ul li').removeClass('selected');
          $(this).addClass('selected');
          return false;
        });
      });
      $('div#chat_box a#start_chat').click(function(){
        var $chatter = $('div#chat_box ul li.selected');
        if ($chatter.length == 1) {
          var chatter = $('div#chat_box ul li.selected').attr('title');
          chatWith(chatter);
        }
        return false;
      });
    }
    
    // Svakih 10 sekundi provjeri ima i koga onlajn
    setInterval(function() {
      $.get(
        '/ajax/chat',
        {},
        function(data) {
          $('div#chat_box ul li, div#chat_box a#start_chat').unbind();
          
          // Nema nikog onlajn
          if (data == 0) {
            $('div#chat_box ul').html('<p style="color: #fff; font-weight: bold; font-size: 12px; padding: 10px 0 0 10px;">Niti jedan kontakt nije online.</p>');
          } else { // Ima nekoga onlajn :)
            $('div#chat_box ul').html(data);
            $('div#chat_box ul li').each(function(){
              $(this).click(function(){
                $('div#chat_box ul li').removeClass('selected');
                $(this).addClass('selected');
                return false;
              });
            });
            
            // Započni chat
            $('div#chat_box a#start_chat').click(function(){
              var $chatter = $('div#chat_box ul li.selected');
              if ($chatter.length == 1) {
                var chatter = $('div#chat_box ul li.selected').attr('title');
                chatWith(chatter);
              }
              return false;
            });
          }
        }
      )
    }, 30000);
  }
}

/**
 * Dodaje uploadanu fotku u galeriju
 */
function addPhotoToGallery(event, queueID, fileObj, response){
  $('div#photo_uploads').html('');
  $('div.items p.no_photos').remove();
  $('div.items').prepend(response);
  $('div#photos a.remove_photo:first').click(function(){
      var this_photo = $(this);
      var really = confirm('Želite li zaista obrisati ovu fotografiju?');
      if (really) {
        var type = 'remove';
        var pid = this_photo.attr('rel');
        var filename = this_photo.prev().prev().children('img').attr('alt');
        $.post(
          '/ajax/photo',
          {
            type: type,
            filename: filename,
            pid: pid
          },
          function(data) {
            if (data != 0) {
              this_photo.prevAll().remove();
              this_photo.remove();
              if ($('a.user_photo_gallery').length == 0) {
                $('div.items').prepend('<p class="no_photos">Trenutno nemaš fotografija u galeriji.</p>');
              } else {
                var api = $("div.scrollable").scrollable({size: 3});
                api.reload();
              }
            }
            else {
              alert ("Došlo je do greške prilikom uploada slike, molimo te pokušaj ponovo. Ograničenje na veličinu slike je 8 MB. Ukoliko i dalje ne uspiješ uploadati svoju sliku, kontaktiraj nas na mojspoj@cosmopolitan.hr!");
            }
          }
        )
      }
      return false;
  });
  
  var api = $("div.scrollable").scrollable({size: 3});
  api.reload();
  
  $("a.user_photo_gallery").zoomimage({
    border: 10,
    controls: false,
    duration: 200
  });
}

/**
 * Mijenja avatar
 */
function changeAvatar(event, queueID, fileObj, response){
  $('div.big_avatar img').attr('src', response + '?' + parseInt(Math.random()*1000));
  $('div#welcome_box img.small_avatar').attr('src', response + '?' + parseInt(Math.random()*1000));
}

/**
 * TextAreaExpander plugin for jQuery
 * v1.0
 * Expands or contracts a textarea height depending on the
 * quatity of content entered by the user in the box.
 *
 * By Craig Buckler, Optimalworks.net
 *
 * As featured on SitePoint.com:
 * http://www.sitepoint.com/blogs/2009/07/29/build-auto-expanding-textarea-1/
 *
 * Please use as you wish at your own risk.
 */

(function($) {

  // jQuery plugin definition
  $.fn.TextAreaExpander = function(minHeight, maxHeight) {

    var hCheck = !($.browser.msie || $.browser.opera);

    // resize a textarea
    function ResizeTextarea(e) {

      // event or initialize element?
      e = e.target || e;

      // find content length and box width
      var vlen = e.value.length, ewidth = e.offsetWidth;
      if (vlen != e.valLength || ewidth != e.boxWidth) {

        if (hCheck && (vlen < e.valLength || ewidth != e.boxWidth)) e.style.height = "0px";
        var h = Math.max(e.expandMin, Math.min(e.scrollHeight, e.expandMax));

        e.style.overflow = (e.scrollHeight > h ? "auto" : "hidden");
        e.style.height = h + "px";

        e.valLength = vlen;
        e.boxWidth = ewidth;
      }

      return true;
    };

    // initialize
    this.each(function() {

      // is a textarea?
      if (this.nodeName.toLowerCase() != "textarea") return;

      // set height restrictions
      var p = this.className.match(/expand(\d+)\-*(\d+)*/i);
      this.expandMin = minHeight || (p ? parseInt('0'+p[1], 10) : 0);
      this.expandMax = maxHeight || (p ? parseInt('0'+p[2], 10) : 99999);

      // initial resize
      ResizeTextarea(this);

      // zero vertical padding and add events
      if (!this.Initialized) {
        this.Initialized = true;
        $(this).css("padding-top", 0).css("padding-bottom", 0);
        $(this).bind("keyup", ResizeTextarea).bind("focus", ResizeTextarea);
      }
    });

    return this;
  };

})(jQuery);