/* jScale Image Scaler v1.01
* Last updated: Aug 6th, 2009: Fixed bug when "ls (largest side)" option is used
* Author: JavaScript Kit at http://www.javascriptkit.com/
* Visit http://www.javascriptkit.com/script/script2/jScale/ for full source code
*/

jQuery.jScale={
        getnewSize:function(side, nvalue){
                var otherside=(side=="w")? "h" : "w"
                if (typeof nvalue=="undefined" || nvalue==null) //if this side has no explicit size set, scale it
                        var newSize=this.ndimensions[otherside] * this.odimensions[side] / this.odimensions[otherside]
                else
                        var newSize=(/%/.test(nvalue))? parseInt(nvalue)/100 * this.odimensions[side] : parseInt(nvalue)
                this.ndimensions[side]=Math.round(newSize)
        },
        getnewDimensions:function($, imgref, setting, callback){
                //create temporary floating image to get original image's true dimensions (in case width/height attr set)
                var $tempimg=$('<img src="'+imgref.src+'" style="position:absolute; top:0; left:0; visibility:hidden" />').prependTo('body')
                this.odimensions={w:$tempimg.width(), h:$tempimg.height()} //get image dimensions
                var sortbysize=(this.odimensions.w>this.odimensions.h)? ["w","h"] : ["h","w"] //array to determine [largerside, shorterside]
                this.ndimensions={}
                if (typeof setting.ls!="undefined"){ //if setting.ls defined
                        setting[sortbysize[0]]=setting.ls //set the correct side to the longest side's value setting
                        setting[sortbysize[1]]=null
                }
                var sortbyavail=(setting.w)? ["w","h"] : (setting.h)? ["h","w"] : [] //check which side to work on based on availibility (which property is set by user)
                if (sortbyavail.length>0){
                        this.getnewSize(sortbyavail[0], setting[sortbyavail[0]]) //work on side with property that's defined for sure first
                        this.getnewSize(sortbyavail[1], setting[sortbyavail[1]]) //work on side with property that may or may not be defined last
                        var callbackfunc=callback || function(){}
                        if (setting.speed>0)
                                $(imgref).animate({width:this.ndimensions.w+'px', height:this.ndimensions.h+'px'}, setting.speed, callbackfunc)
                        else{
                                $(imgref).css({width:this.ndimensions.w+'px', height:this.ndimensions.h+'px'})
                                callbackfunc.call(imgref)
                        }
                }
                $tempimg.remove()
        }
};

jQuery.fn.jScale=function(setting, callback){
        return this.each(function(){ //return jQuery obj
                var imgref=this
                if (typeof setting=="undefined" || imgref.tagName!="IMG")
                        return true //skip to next matched element
                if (imgref.complete){ //account for IE not firing image.onload
                        jQuery.jScale.getnewDimensions(jQuery, imgref, setting, callback)
                }
                else{
                        $(this).bind('load', function(){
                                jQuery.jScale.getnewDimensions(jQuery, imgref, setting, callback)
                        })
                }
        })
};