
jQuery.extend({
    slide: function($container, child_element_no, callback) {
        var $slider = $container.children(":first");
        var new_offset = $slider.children(':eq('+child_element_no+')').offset().left - $container.offset().left - ($slider.offset().left - $container.offset().left);
        $slider.animate( {left: -1 * new_offset}, 600, 'easeOutQuad', callback);
        return this;
    },
    slide_page: function($container, page_no, size, callback) {
        if (typeof(size) == 'undefined') {
            size = parseInt($container.parent().css('width').match(/\d+/));
        }
        var new_offset = size * page_no;
        $container.animate( {left: -1 * new_offset}, 600, 'easeOutQuad', callback);
        return this;
    },
    imgLoad: function(src, loaded_callback) {
        var img = new Image();
        $(img).load( function () {
            loaded_callback(img);
        });
        img.src = src;
        return this;
    },
    dimIn: function (user_css, callback, on_click) {
        $dim = $("#dim");
        if ($dim.length == 0) {
            $dim = $("<div />").attr('id', 'dim').css(
                { position: 'fixed',
                  top: 0,
                  left: 0,
                  width: '100%',
                  height: '100%',
                  zIndex: 20,
                  background: '#000',
                  opacity: .6 });
            $('body').prepend($dim);
        }
        if (on_click != undefined) {
            $dim.click(on_click);
        }
        if ($dim.data('act') == true) return false;
        if (user_css != undefined) {
            $dim.css(user_css);
        }
        return $dim.data('act', true).fadeIn(400, callback);
    },
    dimOut: function (callback) {
        $dim = $("#dim").unbind('click');
        if ($dim.data('act') == true) {
            $dim.fadeOut(400, callback).data('act', false);
            
        }
        
    },
    alert: function (message) {
        $.dimIn({}, null, function () {
            window.alert_box.fadeOut();
            $.dimOut();
        });
        if (window.alert_box == undefined) {
            window.alert_box = $('<div style="width: 400px; z-index:99999999; display: none; cursor: pointer; position: absolute; padding: 10px; background: #fff; box-shadow: 0 0 5px #666; -moz-box-shadow: 0 0 5px #666; -webkit-box-shadow: 0 0 5px #666;" />').appendTo('body').click( function () {
                $(this).fadeOut();
                $.dimOut();
            } );
        }
        window.alert_box.html('<p style="display: block; text-align: left;">'+message+'</p>').center().fadeIn();
    }
});

jQuery.fn.extend({
    inZoom: function (args) {

        var $t = this;

        // multi element support
        if ($t.length > 1) {
            $t.each(function () {
                if (typeof args == 'undefined') {
                    var args = {
                        collection: $t
                    }
                } else {
                    args.collection = $t;
                }
                jQuery(this).inZoom(args);
            })
            return $t;
        }

        if (typeof args == 'undefined') {
            args = {
                collection: $t
            }
        }

        var current_item = 0;

        $.each(args.collection, function (i) {

            if ($t[0] == $(this)[0]) {
                current_item = i;
            }

        })

        var $popup = jQuery('#inzoom'),
            $img = jQuery('#inzoom div');

        if (!$popup.length) {
            jQuery('<div id="inzoom" />').css({
                background: '#F4F4D2',
                zIndex: 100,
                position: 'absolute',
                left: '50%',
                top: '20px',
                padding: '20px 10px 10px',
                display: 'none'
            }).insertAfter('body > *:last').append('<div style="position: relative" />').append('<a href="#" class="btn-close"></a>');
            $popup = jQuery('#inzoom');
            $img = $popup.children('div');
            $popup.find('.btn-close').click(function () {
                $popup.fadeOut();
                jQuery.dimOut();
                return false;
            })
        }

//        var $img = $popup.children('div');

        $t.bind('click', function () {

            // bind click on image

            // $popup.unbind('click').click(function () {

            //     if (current_item == args.collection.length - 1) {
            //         current_item = 0;
            //     } else {
            //         current_item++;
            //     }

            //     args.collection.eq(current_item).trigger('click')

            //     return false;

            // })

            var img = new Image();

            jQuery(img).load(function () {

                var maxHeight = img.height - 60,
                    maxWidth = jQuery(window).width() - 60; // leave some space for padding

                maxWidth = maxWidth > img.width ? img.width : maxWidth;

                $img.css({
                    background: 'url('+img.src+') no-repeat top center',
                    backgroundSize: '100%',
                    width: maxWidth,
                    height: maxHeight
                });

                $popup.css({
                    marginLeft: '-' + Math.round($popup.outerWidth() / 2) + 'px'
                }).center();

            });

            img.src = $t.attr('href');

            jQuery.dimIn({}, function () {

                $popup.css('top', jQuery(window).scrollTop() + 10);

                $popup.center().fadeIn();

            }, function () {

                $popup.find('.btn-close').click();

            });

            return false;
        });

    },
    defaultText: function () {
        var $t = this;
        if ($t.length > 1) {
            $t.each(function () {
                $(this).defaultText();
            })
            return $t;
        }
        $t.bind('focus', function() {
            if ($t.data('default-text') == undefined) {
                $t.data('default-text', $t.val());
            }
            if ($t.val() == $t.data('default-text')) {
                $t.val('');
            }
        });
        $t.blur(function () {
            if (($t.val() == '') && ($t.data('default-text') != undefined)) {
                $t.val($t.data('default-text'));
            }
        });
        return $t;
    },
    center: function () {
        this.css({
            position: 'absolute',
            top: $(document).scrollTop() + ((Math.ceil($(window).height()) - this.outerHeight()) / 2),
            left: '50%',
            marginLeft: -1 * Math.ceil(this.width() / 2)
        });
        return this;
    },
	fadeOver: function (speed, callback, css, attr) {
        var $t = this;
		c = $t.clone();
		c.css( { position: 'absolute',
                 width: $t.width(),
                 height: $t.height(),
                 display: 'none',
                 zIndex: 2 } );
                if (css != undefined) {
                    c.css(css);
                }
                if (attr != undefined) {
                    c.attr(attr);
                }
                $tp = $t.parent(); // container
		$tp.css( { width: $tp.width(),
                   height: $tp.height()} );

		c.insertBefore($t).fadeTo(speed, 1, function () {
			c.next().remove();
			c.css( { position: 'relative', zIndex: 1} );
			if (typeof(callback) == 'function') callback();
		});
        return $t;
	},
    // returns highest DOM object of an array
    highest: function () {

        var $t = this;

        if ($t.length > 1) {

            var $h = null;

            $t.each(function () {

                var $k = $(this);

                if ($h) {

                    if ($k.height() > $h.height()) {
                        $h = $k;
                    }

                } else {

                    $h = $k;

                }

            });

            return $h;

        } else {

            return $t;

        }

    }
});

function validate_email(email) {
    var filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
    return filter.test(email);
}

function popup(url) {

    if (typeof(window.popuped) == 'undefined') {
        window.popuped = $('<div style="z-index:99999999; display: none; cursor: pointer; position: absolute; padding: 7px; background: #ffffff; box-shadow: 0 0 5px #666; -moz-box-shadow: 0 0 5px #666; -webkit-box-shadow: 0 0 5px #666;" />').appendTo('body').click( function () {
            $(this).find('img').fadeOut(400).end().fadeOut(400);
            $.dimOut();
        } );
        $('<img style="display: none" />').appendTo(window.popuped);
    }

    $popuped = window.popuped;

    $.dimIn({}, null, function () {
        window.popuped.click();
    });

    var props = { width: 100,
                  height: 100,
                  left: Math.ceil($(window).width() / 2) - 50,
                  top: $(document).scrollTop() + Math.ceil(($(window).height() - 25) / 2) - 20};

    if ($popuped.css('display') == 'none') {
        $popuped.css(props);
    } else {
        $popuped.find('img').fadeOut(400);
    }

    var img = new Image();

    $popuped.fadeIn(400);

    $(img).load( function () {

        $popuped.find('img').attr('src', img.src).end().animate(
            {
                left: Math.ceil(($(window).width() - img.width) / 2),
                top: (($(window).height() - img.height) / 2) + $(document).scrollTop(),
                height: img.height,
                width: img.width
            }, 400, function () {
                $(this).find('img').fadeIn('fast');
            }
        );


    });

    img.src = url;

}

// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});






/*
 * jQuery selectbox plugin
 */
jQuery.fn.extend({
    selectbox: function(options) {
        return this.each(function() {
            new jQuery.SelectBox(this, options);
        });
    }
});


/* pawel maziarz: work around for ie logging */
if (!window.console) {
    var console = {
        log: function(msg) {
        }
    }
}
/* */

jQuery.SelectBox = function(selectobj, options) {

    var opt = options || {};
    opt.inputType = opt.inputType || "input";
    opt.inputClass = opt.inputClass || "selectbox";
    opt.containerClass = opt.containerClass || "selectbox-wrapper";
    opt.hoverClass = opt.hoverClass || "current";
    opt.currentClass = opt.currentClass || "selected";
    opt.groupClass = opt.groupClass || "groupname"; //css class for group
    opt.maxHeight = opt.maxHeight || 200; // max height of dropdown list
    opt.loopnoStep = opt.loopnoStep || false; // to remove the step in list moves loop
    opt.onChangeCallback = opt.onChangeCallback || false;
    opt.onChangeParams = opt.onChangeParams || false;
    opt.debug = opt.debug || false;

    var elm_id = selectobj.id;
    var active = 0;
    var inFocus = false;
    var hasfocus = 0;
    //jquery object for select element
    var $select = jQuery(selectobj);
    // jquery container object
    var $container = setupContainer(opt);
    //jquery input object
    var $input = setupInput(opt);
    // hide select and append newly created elements
    $select.hide().before($input).before($container);


    init();

    $input
    .click(function(){
        if (!inFocus) {
            $container.toggle();
        }
    })
    .focus(function(){
        if ($container.not(':visible')) {
            inFocus = true;
            $container.show();
        }
    })
    .keydown(function(event) {
        switch(event.keyCode) {
            case 38: // up
                event.preventDefault();
                moveSelect(-1);
                break;
            case 40: // down
                event.preventDefault();
                moveSelect(1);
                break;
            //case 9:  // tab
            case 13: // return
                event.preventDefault(); // seems not working in mac !
                $('li.'+opt.hoverClass).trigger('click');
                break;
            case 27: //escape
              hideMe();
              break;
        }
    })
    .blur(function() {
        if ($container.is(':visible') && hasfocus > 0 ) {
            if(opt.debug) console.log('container visible and has focus')
        } else {
            // Workaround for ie scroll - thanks to Bernd Matzner
            if((jQuery.browser.msie && jQuery.browser.version.substr(0,1) < 8)
                           || (jQuery.browser.safari && !/chrome/.test(navigator.userAgent.toLowerCase()))) {
                if(document.activeElement.getAttribute('id').indexOf('_container')==-1){
                    hideMe();
                } else {
                    $input.focus();
                }
            } else {
                hideMe();
            }
        }
    });

    function hideMe() {
        hasfocus = 0;
        $container.hide();
    }

    function init() {
        $container.append(getSelectOptions($input.attr('id'))).hide();
        var width = $input.css('width');
        if($container.height() > opt.maxHeight){
            $container.width(parseInt(width)+parseInt($input.css('paddingRight'))+parseInt($input.css('paddingLeft')));
            $container.height(opt.maxHeight);
        } else $container.width(width);
    }

    function setupContainer(options) {
        var container = document.createElement("div");
        $container = jQuery(container);
        $container.attr('id', elm_id+'_container');
        $container.addClass(options.containerClass);
            $container.css('display', 'none');

        return $container;
    }

    function setupInput(options) {
        if(opt.inputType == "span"){
            var input = document.createElement("span");
            var $input = jQuery(input);
            $input.attr("id", elm_id+"_input");
            $input.addClass(options.inputClass);
            $input.attr("tabIndex", $select.attr("tabindex"));
        } else {
            var input = document.createElement("input");
            var $input = jQuery(input);
            $input.attr("id", elm_id+"_input");
            $input.attr("type", "text");
            $input.addClass(options.inputClass);
            $input.attr("autocomplete", "off");
            $input.attr("readonly", "readonly");
            $input.attr("tabIndex", $select.attr("tabindex")); // "I" capital is important for ie
            $input.css("width", $select.css("width"));
            }
        return $input;
    }

    function moveSelect(step) {
        var lis = jQuery("li", $container);
        if (!lis || lis.length == 0) return false;
        // find the first non-group (first option)
        firstchoice = 0;
        while($(lis[firstchoice]).hasClass(opt.groupClass)) firstchoice++;
        active += step;
            // if we are on a group step one more time
            if($(lis[active]).hasClass(opt.groupClass)) active += step;
        //loop through list from the first possible option
        if (active < firstchoice) {
            (opt.loopnoStep ? active = lis.size()-1 : active = lis.size() );
        } else if (opt.loopnoStep && active > lis.size()-1) {
            active = firstchoice;
        } else if (active > lis.size()) {
            active = firstchoice;
        }
            scroll(lis, active);
        lis.removeClass(opt.hoverClass);

        jQuery(lis[active]).addClass(opt.hoverClass);
    }

    function scroll(list, active) {
            var el = jQuery(list[active]).get(0);
            var list = $container.get(0);

        if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight) {
            list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;
        } else if(el.offsetTop < list.scrollTop) {
            list.scrollTop = el.offsetTop;
        }
    }

    function setCurrent() {
        var li = jQuery("li."+opt.currentClass, $container).get(0);
        var ar = (''+li.id).split('_');
        var el = ar[ar.length-1];
        if (opt.onChangeCallback){
                $select.get(0).selectedIndex = $('li', $container).index(li);
                opt.onChangeParams = { selectedVal : $select.val() };
            opt.onChangeCallback(opt.onChangeParams);
        } else {
            $select.val(el);
            $select.change();
        }
        if(opt.inputType == 'span') $input.html($(li).html());
        else $input.val($(li).html());
        return true;
    }

    // select value
    function getCurrentSelected() {
        return $select.val();
    }

    // input value
    function getCurrentValue() {
        return $input.val();
    }

    function getSelectOptions(parentid) {
        var select_options = new Array();
        var ul = document.createElement('ul');
        select_options = $select.children('option');
        if(select_options.length == 0) {
            var select_optgroups = new Array();
            select_optgroups = $select.children('optgroup');
            for(x=0;x<select_optgroups.length;x++){
                select_options = $("#"+select_optgroups[x].id).children('option');
                var li = document.createElement('li');
                li.setAttribute('id', parentid + '_' + $(this).val());
                li.innerHTML = $("#"+select_optgroups[x].id).attr('label');
                li.className = opt.groupClass;
                ul.appendChild(li);
                select_options.each(function() {
                    var li = document.createElement('li');
                    li.setAttribute('id', parentid + '_' + $(this).val());
                    li.innerHTML = $(this).html();
                    if ($(this).is(':selected')) {
                        $input.html($(this).html());
                        $(li).addClass(opt.currentClass);
                    }
                    ul.appendChild(li);
                    $(li)
                    .mouseover(function(event) {
                        hasfocus = 1;
                        if (opt.debug) console.log('over on : '+this.id);
                        jQuery(event.target, $container).addClass(opt.hoverClass);
                    })
                    .mouseout(function(event) {
                        hasfocus = -1;
                        if (opt.debug) console.log('out on : '+this.id);
                        jQuery(event.target, $container).removeClass(opt.hoverClass);
                    })
                    .click(function(event) {
                        var fl = $('li.'+opt.hoverClass, $container).get(0);
                        if (opt.debug) console.log('click on :'+this.id);
                        $('li.'+opt.currentClass, $container).removeClass(opt.currentClass);
                        $(this).addClass(opt.currentClass);
                        setCurrent();
                        $select.get(0).blur();
                        hideMe();
                    });
                });
            }
        } else select_options.each(function() {
            var li = document.createElement('li');
            li.setAttribute('id', parentid + '_' + $(this).val());
            li.innerHTML = $(this).html();
            if ($(this).is(':selected')) {
                $input.val($(this).html());
                $(li).addClass(opt.currentClass);
            }
            ul.appendChild(li);
            $(li)
            .mouseover(function(event) {
                hasfocus = 1;
                if (opt.debug) console.log('over on : '+this.id);
                jQuery(event.target, $container).addClass(opt.hoverClass);
            })
            .mouseout(function(event) {
                hasfocus = -1;
                if (opt.debug) console.log('out on : '+this.id);
                jQuery(event.target, $container).removeClass(opt.hoverClass);
            })
            .click(function(event) {
                var fl = $('li.'+opt.hoverClass, $container).get(0);
                if (opt.debug) console.log('click on :'+this.id);
                $('li.'+opt.currentClass, $container).removeClass(opt.currentClass);
                $(this).addClass(opt.currentClass);
                setCurrent();
                $select.get(0).blur();
                hideMe();
            });
        });
        return ul;
    }



};


