(function ($) {

/* 
	NivoSlider v2.4
*/

    var NivoSlider = function (element, options) {
        //Defaults are below
        var settings = $.extend({}, $.fn.nivoSlider.defaults, options);

        //Useful variables. Play carefully.
        var vars = {
            currentSlide: 0,
            currentImage: '',
            totalSlides: 0,
            randAnim: '',
            running: false,
            paused: false,
            stop: false
        };

        //Get this slider
        var slider = $(element);
        slider.data('nivo:vars', vars);
        slider.css('position', 'relative');
        slider.addClass('nivoSlider');

        //Find our slider children
        var kids = slider.children();
        kids.each(function () {
            var child = $(this);
            var link = '';
            if (!child.is('img')) {
                if (child.is('a')) {
                    child.addClass('nivo-imageLink');
                    link = child;
                }
                child = child.find('img:first');
            }
            //Get img width & height
            var childWidth = child.width();
            if (childWidth == 0) childWidth = child.attr('width');
            var childHeight = child.height();
            if (childHeight == 0) childHeight = child.attr('height');
            //Resize the slider
            if (childWidth > slider.width()) {
                slider.width(childWidth);
            }
            if (childHeight > slider.height()) {
                slider.height(childHeight);
            }
            if (link != '') {
                link.css('display', 'none');
            }
            child.css('display', 'none');
            vars.totalSlides++;
        });

        //Set startSlide
        if (settings.startSlide > 0) {
            if (settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
            vars.currentSlide = settings.startSlide;
        }

        //Get initial image
        if ($(kids[vars.currentSlide]).is('img')) {
            vars.currentImage = $(kids[vars.currentSlide]);
        } else {
            vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
        }

        //Show initial link
        if ($(kids[vars.currentSlide]).is('a')) {
            $(kids[vars.currentSlide]).css('display', 'block');
        }

        //Set first background
        slider.css('background', 'url("' + vars.currentImage.attr('src') + '") no-repeat');

        //Add initial slices
        for (var i = 0; i < settings.slices; i++) {
            var sliceWidth = Math.round(slider.width() / settings.slices);
            if (i == settings.slices - 1) {
                slider.append(
                $('<div class="nivo-slice"></div>').css({
                    left: (sliceWidth * i) + 'px',
                    width: (slider.width() - (sliceWidth * i)) + 'px'
                }));
            } else {
                slider.append(
                $('<div class="nivo-slice"></div>').css({
                    left: (sliceWidth * i) + 'px',
                    width: sliceWidth + 'px'
                }));
            }
        }

        //Create caption
        slider.append(
        $('<div class="nivo-caption"><p></p></div>').css({
            display: 'none',
            opacity: settings.captionOpacity
        }));
        //Process initial  caption
        if (vars.currentImage.attr('title') != '') {
            var title = vars.currentImage.attr('title');
            if (title.substr(0, 1) == '#') title = $(title).html();
            $('.nivo-caption p', slider).html(title);
            $('.nivo-caption', slider).fadeIn(settings.animSpeed);
        }

        //In the words of Super Mario "let's a go!"
        var timer = 0;
        if (!settings.manualAdvance && kids.length > 1) {
            timer = setInterval(function () {
                nivoRun(slider, kids, settings, false);
            }, settings.pauseTime);
        }

        //Add Direction nav
        if (settings.directionNav) {
            slider.append('<div class="nivo-directionNav"><a class="nivo-prevNav">Prev</a><a class="nivo-nextNav">Next</a></div>');

            //Hide Direction nav
            if (settings.directionNavHide) {
                $('.nivo-directionNav', slider).hide();
                slider.hover(function () {
                    $('.nivo-directionNav', slider).show();
                }, function () {
                    $('.nivo-directionNav', slider).hide();
                });
            }

            $('a.nivo-prevNav', slider).live('click', function () {
                if (vars.running) return false;
                clearInterval(timer);
                timer = '';
                vars.currentSlide -= 2;
                nivoRun(slider, kids, settings, 'prev');
            });

            $('a.nivo-nextNav', slider).live('click', function () {
                if (vars.running) return false;
                clearInterval(timer);
                timer = '';
                nivoRun(slider, kids, settings, 'next');
            });
        }

        //Add Control nav
        if (settings.controlNav) {
            var nivoControl = $('<div class="nivo-controlNav"></div>');
            slider.append(nivoControl);
            for (var i = 0; i < kids.length; i++) {
                if (settings.controlNavThumbs) {
                    var child = kids.eq(i);
                    if (!child.is('img')) {
                        child = child.find('img:first');
                    }
                    if (settings.controlNavThumbsFromRel) {
                        nivoControl.append('<a class="nivo-control" rel="' + i + '"><img src="' + child.attr('rel') + '" alt="" /></a>');
                    } else {
                        nivoControl.append('<a class="nivo-control" rel="' + i + '"><img src="' + child.attr('src').replace(settings.controlNavThumbsSearch, settings.controlNavThumbsReplace) + '" alt="" /></a>');
                    }
                } else {
                    nivoControl.append('<a class="nivo-control" rel="' + i + '">' + (i + 1) + '</a>');
                }

            }
            //Set initial active link
            $('.nivo-controlNav a:eq(' + vars.currentSlide + ')', slider).addClass('active');

            $('.nivo-controlNav a', slider).live('click', function () {
                if (vars.running) return false;
                if ($(this).hasClass('active')) return false;
                clearInterval(timer);
                timer = '';
                slider.css('background', 'url("' + vars.currentImage.attr('src') + '") no-repeat');
                vars.currentSlide = $(this).attr('rel') - 1;
                nivoRun(slider, kids, settings, 'control');
            });
        }

        //Keyboard Navigation
        if (settings.keyboardNav) {
            $(window).keypress(function (event) {
                //Left
                if (event.keyCode == '37') {
                    if (vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    vars.currentSlide -= 2;
                    nivoRun(slider, kids, settings, 'prev');
                }
                //Right
                if (event.keyCode == '39') {
                    if (vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    nivoRun(slider, kids, settings, 'next');
                }
            });
        }

        //For pauseOnHover setting
        if (settings.pauseOnHover) {
            slider.hover(function () {
                vars.paused = true;
                clearInterval(timer);
                timer = '';
            }, function () {
                vars.paused = false;
                //Restart the timer
                if (timer == '' && !settings.manualAdvance) {
                    timer = setInterval(function () {
                        nivoRun(slider, kids, settings, false);
                    }, settings.pauseTime);
                }
            });
        }

        //Event when Animation finishes
        slider.bind('nivo:animFinished', function () {
            vars.running = false;
            //Hide child links
            $(kids).each(function () {
                if ($(this).is('a')) {
                    $(this).css('display', 'none');
                }
            });
            //Show current link
            if ($(kids[vars.currentSlide]).is('a')) {
                $(kids[vars.currentSlide]).css('display', 'block');
            }
            //Restart the timer
            if (timer == '' && !vars.paused && !settings.manualAdvance) {
                timer = setInterval(function () {
                    nivoRun(slider, kids, settings, false);
                }, settings.pauseTime);
            }
            //Trigger the afterChange callback
            settings.afterChange.call(this);
        });

        // Reset slice width before animations run
        var resetSliceWidth = function (slider, settings) {
            var slices = $('.nivo-slice', slider);
            var i = 0;
            slices.each(function () {
                var slice = $(this);
                var sliceWidth = Math.round(slider.width() / settings.slices);
                if (i == settings.slices - 1) {
                    slice.css('width', (slider.width() - (sliceWidth * i)) + 'px');
                } else {
                    slice.css('width', sliceWidth + 'px');
                }
                i++;
            });
        }

        // Private run method
        var nivoRun = function (slider, kids, settings, nudge) {
            //Get our vars
            var vars = slider.data('nivo:vars');

            //Trigger the lastSlide callback
            if (vars && (vars.currentSlide == vars.totalSlides - 1)) {
                settings.lastSlide.call(this);
            }

            // Stop
            if ((!vars || vars.stop) && !nudge) return false;

            //Trigger the beforeChange callback
            settings.beforeChange.call(this);

            //Set current background before change
            if (!nudge) {
                slider.css('background', 'url("' + vars.currentImage.attr('src') + '") no-repeat');
            } else {
                if (nudge == 'prev') {
                    slider.css('background', 'url("' + vars.currentImage.attr('src') + '") no-repeat');
                }
                if (nudge == 'next') {
                    slider.css('background', 'url("' + vars.currentImage.attr('src') + '") no-repeat');
                }
            }
            vars.currentSlide++;
            //Trigger the slideshowEnd callback
            if (vars.currentSlide == vars.totalSlides) {
                vars.currentSlide = 0;
                settings.slideshowEnd.call(this);
            }
            if (vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
            //Set vars.currentImage
            if ($(kids[vars.currentSlide]).is('img')) {
                vars.currentImage = $(kids[vars.currentSlide]);
            } else {
                vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
            }

            //Set acitve links
            if (settings.controlNav) {
                $('.nivo-controlNav a', slider).removeClass('active');
                $('.nivo-controlNav a:eq(' + vars.currentSlide + ')', slider).addClass('active');
            }

            //Process caption
            if (vars.currentImage.attr('title') != '') {
                var title = vars.currentImage.attr('title');
                if (title.substr(0, 1) == '#') title = $(title).html();

                if ($('.nivo-caption', slider).css('display') == 'block') {
                    $('.nivo-caption p', slider).fadeOut(settings.animSpeed, function () {
                        $(this).html(title);
                        $(this).fadeIn(settings.animSpeed);
                    });
                } else {
                    $('.nivo-caption p', slider).html(title);
                }
                $('.nivo-caption', slider).fadeIn(settings.animSpeed);
            } else {
                $('.nivo-caption', slider).fadeOut(settings.animSpeed);
            }

            //Set new slice backgrounds
            var i = 0;
            $('.nivo-slice', slider).each(function () {
                var sliceWidth = Math.round(slider.width() / settings.slices);
                $(this).css({
                    height: '0px',
                    opacity: '0',
                    background: 'url("' + vars.currentImage.attr('src') + '") no-repeat -' + ((sliceWidth + (i * sliceWidth)) - sliceWidth) + 'px 0%'
                });
                i++;
            });

            if (settings.effect == 'random') {
                var anims = new Array('sliceDownRight', 'sliceDownLeft', 'sliceUpRight', 'sliceUpLeft', 'sliceUpDown', 'sliceUpDownLeft', 'fold', 'fade', 'slideInRight', 'slideInLeft');
                vars.randAnim = anims[Math.floor(Math.random() * (anims.length + 1))];
                if (vars.randAnim == undefined) vars.randAnim = 'fade';
            }

            //Run random effect from specified set (eg: effect:'fold,fade')
            if (settings.effect.indexOf(',') != -1) {
                var anims = settings.effect.split(',');
                vars.randAnim = anims[Math.floor(Math.random() * (anims.length))];
                if (vars.randAnim == undefined) vars.randAnim = 'fade';
            }

            //Run effects
            vars.running = true;
            if (settings.effect == 'sliceDown' || settings.effect == 'sliceDownRight' || vars.randAnim == 'sliceDownRight' || settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft') {
                var timeBuff = 0;
                var i = 0;
                resetSliceWidth(slider, settings);
                var slices = $('.nivo-slice', slider);
                if (settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft') slices = $('.nivo-slice', slider)._reverse();
                slices.each(function () {
                    var slice = $(this);
                    slice.css({
                        'top': '0px'
                    });
                    if (i == settings.slices - 1) {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed, '', function () {
                                slider.trigger('nivo:animFinished');
                            });
                        }, (100 + timeBuff));
                    } else {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed);
                        }, (100 + timeBuff));
                    }
                    timeBuff += 50;
                    i++;
                });
            } else if (settings.effect == 'sliceUp' || settings.effect == 'sliceUpRight' || vars.randAnim == 'sliceUpRight' || settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft') {
                var timeBuff = 0;
                var i = 0;
                resetSliceWidth(slider, settings);
                var slices = $('.nivo-slice', slider);
                if (settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft') slices = $('.nivo-slice', slider)._reverse();
                slices.each(function () {
                    var slice = $(this);
                    slice.css({
                        'bottom': '0px'
                    });
                    if (i == settings.slices - 1) {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed, '', function () {
                                slider.trigger('nivo:animFinished');
                            });
                        }, (100 + timeBuff));
                    } else {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed);
                        }, (100 + timeBuff));
                    }
                    timeBuff += 50;
                    i++;
                });
            } else if (settings.effect == 'sliceUpDown' || settings.effect == 'sliceUpDownRight' || vars.randAnim == 'sliceUpDown' || settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft') {
                var timeBuff = 0;
                var i = 0;
                var v = 0;
                resetSliceWidth(slider, settings);
                var slices = $('.nivo-slice', slider);
                if (settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft') slices = $('.nivo-slice', slider)._reverse();
                slices.each(function () {
                    var slice = $(this);
                    if (i == 0) {
                        slice.css('top', '0px');
                        i++;
                    } else {
                        slice.css('bottom', '0px');
                        i = 0;
                    }

                    if (v == settings.slices - 1) {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed, '', function () {
                                slider.trigger('nivo:animFinished');
                            });
                        }, (100 + timeBuff));
                    } else {
                        setTimeout(function () {
                            slice.animate({
                                height: '100%',
                                opacity: '1.0'
                            }, settings.animSpeed);
                        }, (100 + timeBuff));
                    }
                    timeBuff += 50;
                    v++;
                });
            } else if (settings.effect == 'fold' || vars.randAnim == 'fold') {
                var timeBuff = 0;
                var i = 0;
                resetSliceWidth(slider, settings);
                $('.nivo-slice', slider).each(function () {
                    var slice = $(this);
                    var origWidth = slice.width();
                    slice.css({
                        top: '0px',
                        height: '100%',
                        width: '0px'
                    });
                    if (i == settings.slices - 1) {
                        setTimeout(function () {
                            slice.animate({
                                width: origWidth,
                                opacity: '1.0'
                            }, settings.animSpeed, '', function () {
                                slider.trigger('nivo:animFinished');
                            });
                        }, (100 + timeBuff));
                    } else {
                        setTimeout(function () {
                            slice.animate({
                                width: origWidth,
                                opacity: '1.0'
                            }, settings.animSpeed);
                        }, (100 + timeBuff));
                    }
                    timeBuff += 50;
                    i++;
                });
            } else if (settings.effect == 'fade' || vars.randAnim == 'fade') {
                var firstSlice = $('.nivo-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': slider.width() + 'px'
                });

                firstSlice.animate({
                    opacity: '1.0'
                }, (settings.animSpeed * 2), '', function () {
                    slider.trigger('nivo:animFinished');
                });
            } else if (settings.effect == 'slideInRight' || vars.randAnim == 'slideInRight') {
                var firstSlice = $('.nivo-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': '0px',
                    'opacity': '1'
                });

                firstSlice.animate({
                    width: slider.width() + 'px'
                }, (settings.animSpeed * 2), '', function () {
                    slider.trigger('nivo:animFinished');
                });
            } else if (settings.effect == 'slideInLeft' || vars.randAnim == 'slideInLeft') {
                var firstSlice = $('.nivo-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': '0px',
                    'opacity': '1',
                    'left': '',
                    'right': '0px'
                });

                firstSlice.animate({
                    width: slider.width() + 'px'
                }, (settings.animSpeed * 2), '', function () {
                    // Reset positioning
                    firstSlice.css({
                        'left': '0px',
                        'right': ''
                    });
                    slider.trigger('nivo:animFinished');
                });
            }
        }

        // For debugging
        var trace = function (msg) {
            if (this.console && typeof console.log != "undefined") console.log(msg);
        }

        // Start / Stop
        this.stop = function () {
            if (!$(element).data('nivo:vars').stop) {
                $(element).data('nivo:vars').stop = true;
                trace('Stop Slider');
            }
        }

        this.start = function () {
            if ($(element).data('nivo:vars').stop) {
                $(element).data('nivo:vars').stop = false;
                trace('Start Slider');
            }
        }

        //Trigger the afterLoad callback
        settings.afterLoad.call(this);
    };

    $.fn.nivoSlider = function (options) {

        return this.each(function () {
            var element = $(this);
            // Return early if this element already has a plugin instance
            if (element.data('nivoslider')) return;
            // Pass options to plugin constructor
            var nivoslider = new NivoSlider(this, options);
            // Store plugin object in this element's data
            element.data('nivoslider', nivoslider);
        });

    };

    //Default settings
    $.fn.nivoSlider.defaults = {
        effect: 'random',
        slices: 15,
        animSpeed: 500,
        pauseTime: 3000,
        startSlide: 0,
        directionNav: true,
        directionNavHide: true,
        controlNav: true,
        controlNavThumbs: false,
        controlNavThumbsFromRel: false,
        controlNavThumbsSearch: '.jpg',
        controlNavThumbsReplace: '_thumb.jpg',
        keyboardNav: true,
        pauseOnHover: true,
        manualAdvance: false,
        captionOpacity: 0.8,
        beforeChange: function () {},
        afterChange: function () {},
        slideshowEnd: function () {},
        lastSlide: function () {},
        afterLoad: function () {}
    };

    $.fn._reverse = [].reverse;

/* 
	end NivoSlider 
*/


/* 
	zWeatherfeed 1.0.2 
*/


    var row = 'odd';

    $.fn.weatherfeed = function (locations, options) {

        // Set pluign defaults
        var defaults = {
            unit: 'c',
            image: true,
            highlow: true,
            wind: true,
            link: true,
            showerror: true
        };
        var options = $.extend(defaults, options);

        // Functions
        return this.each(function (i, e) {
            var $e = $(e);

            // Add feed class to user div
            if (!$e.hasClass('weatherFeed')) $e.addClass('weatherFeed');

            // Check and append locations
            if (!$.isArray(locations)) return false;
            var count = locations.length;
            if (count > 10) count = 10;
            var locationid = '';
            for (var i = 0; i < count; i++) {
                if (locationid != '') locationid += ',';
                locationid += "'" + locations[i] + "'";
            }

            // Cache results for an hour to prevent overuse
            now = new Date()

            // Create Yahoo Weather feed API address
            var query = "select * from weather.forecast where location in (" + locationid + ") and u='" + options.unit + "'";
            var api = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent(query) + '&rnd=' + now.getFullYear() + now.getMonth() + now.getDay() + now.getHours() + '&format=json&callback=?';

            // Send request
            //$.getJSON(api, function(data) {
            $.ajax({
                type: 'GET',
                url: api,
                dataType: 'json',
                success: function (data) {

                    if (data.query) {

                        if (data.query.results.channel.length > 0) {

                            // Multiple locations
                            var result = data.query.results.channel.length;
                            for (var i = 0; i < result; i++) {

                                // Create weather feed item
                                _callback(e, data.query.results.channel[i], options);
                            }
                        } else {

                            // Single location only
                            _callback(e, data.query.results.channel, options);
                        }
                    } else {
                        if (options.showerror) $e.html('<p>Weather information unavailable</p>');
                    }
                },
                error: function (data) {
                    if (options.showerror) $e.html('<p>Weather request failed</p>');
                }
            });

        });
    };

    // Function to each feed item
    var _callback = function (e, feed, options) {
        var $e = $(e);

        // Format feed items
        var wd = feed.wind.direction;
        if (wd >= 348.75 && wd <= 360) {
            wd = "N"
        };
        if (wd >= 0 && wd < 11.25) {
            wd = "N"
        };
        if (wd >= 11.25 && wd < 33.75) {
            wd = "NNE"
        };
        if (wd >= 33.75 && wd < 56.25) {
            wd = "NE"
        };
        if (wd >= 56.25 && wd < 78.75) {
            wd = "ENE"
        };
        if (wd >= 78.75 && wd < 101.25) {
            wd = "E"
        };
        if (wd >= 101.25 && wd < 123.75) {
            wd = "ESE"
        };
        if (wd >= 123.75 && wd < 146.25) {
            wd = "SE"
        };
        if (wd >= 146.25 && wd < 168.75) {
            wd = "SSE"
        };
        if (wd >= 168.75 && wd < 191.25) {
            wd = "S"
        };
        if (wd >= 191.25 && wd < 213.75) {
            wd = "SSW"
        };
        if (wd >= 213.75 && wd < 236.25) {
            wd = "SW"
        };
        if (wd >= 236.25 && wd < 258.75) {
            wd = "WSW"
        };
        if (wd >= 258.75 && wd < 281.25) {
            wd = "W"
        };
        if (wd >= 281.25 && wd < 303.75) {
            wd = "WNW"
        };
        if (wd >= 303.75 && wd < 326.25) {
            wd = "NW"
        };
        if (wd >= 326.25 && wd < 348.75) {
            wd = "NNW"
        };
        var wf = feed.item.forecast[0];

        // Determine day or night image
        wpd = feed.item.pubDate;
        n = wpd.indexOf(":");
        tpb = _getTimeAsDate(wpd.substr(n - 2, 8));
        tsr = _getTimeAsDate(feed.astronomy.sunrise);
        tss = _getTimeAsDate(feed.astronomy.sunset);

        if (tpb > tsr && tpb < tss) {
            daynight = 'd';
        } else {
            daynight = 'n';
        }

        // Add item container
        var html = '<div class="weatherItem ' + row + '"';
        if (options.image) html += ' style="background-image: url(http://l.yimg.com/a/i/us/nws/weather/gr/' + feed.item.condition.code + daynight + '.png); background-repeat: no-repeat;"';
        html += '>';

        // Add item data
        html += '<div class="weatherCity">Huizen</div>';
        html += '<div class="weatherTemp">' + feed.item.condition.temp + '&deg;</div>';
/*
		html += '<div class="weatherDesc">'+ feed.item.condition.text +'</div>';
		if (options.highlow) html += '<div class="weatherRange">High: '+ wf.high +'&deg; Low: '+ wf.low +'&deg;</div>';
		if (options.wind) html += '<div class="weatherWind">Wind: '+ wd +' '+ feed.wind.speed + feed.units.speed +'</div>';
		if (options.link) html += '<div class="weatherLink"><a href="'+ feed.item.link +'">Read full forecast</a></div>';
		*/
        html += '</div>';

        // Alternate row classes
        if (row == 'odd') {
            row = 'even';
        } else {
            row = 'odd';
        }

        $e.append(html);
    };

    // Get time string as date
    var _getTimeAsDate = function (t) {

        d = new Date();
        r = new Date(d.toDateString() + ' ' + t);

        return r;
    };

/* 
	end zWeatherfeed
*/

/* 
	GoogleMaps 1.0.1 
*/

    jQuery.fn.googleMaps = function (options) {

        if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) {
            return this;
        }

        // Fill default values where not set by instantiation code
        var opts = $.extend({}, $.googleMaps.defaults, options);

        //$.fn.googleMaps.includeGoogle(opts.key, opts.sensor);
        return this.each(function () {
            // Create Map
            $.googleMaps.gMap = new GMap2(this, opts);
            $.googleMaps.mapsConfiguration(opts);
        });
    };

    $.googleMaps = {
        mapsConfiguration: function (opts) {
            // GEOCODE
            if (opts.geocode) {
                geocoder = new GClientGeocoder();
                geocoder.getLatLng(opts.geocode, function (center) {
                    if (!center) {
                        alert(address + " not found");
                    } else {
                        $.googleMaps.gMap.setCenter(center, opts.depth);
                        $.googleMaps.latitude = center.x;
                        $.googleMaps.longitude = center.y;
                    }
                });
            } else {
                // Latitude & Longitude Center Point
                var center = $.googleMaps.mapLatLong(opts.latitude, opts.longitude);
                // Set the center of the Map with the new Center Point and Depth
                $.googleMaps.gMap.setCenter(center, opts.depth);
            }

            // POLYLINE
            if (opts.polyline)
            // Draw a PolyLine on the Map
            $.googleMaps.gMap.addOverlay($.googleMaps.mapPolyLine(opts.polyline));
            // GEODESIC 
            if (opts.geodesic) {
                $.googleMaps.mapGeoDesic(opts.geodesic);
            }
            // PAN
            if (opts.pan) {
                // Set Default Options
                opts.pan = $.googleMaps.mapPanOptions(opts.pan);
                // Pan the Map
                window.setTimeout(function () {
                    $.googleMaps.gMap.panTo($.googleMaps.mapLatLong(opts.pan.panLatitude, opts.pan.panLongitude));
                }, opts.pan.timeout);
            }

            // LAYER
            if (opts.layer)
            // Set the Custom Layer
            $.googleMaps.gMap.addOverlay(new GLayer(opts.layer));

            // MARKERS
            if (opts.markers) $.googleMaps.mapMarkers(center, opts.markers);

            // CONTROLS
            if (opts.controls.type || opts.controls.zoom || opts.controls.mapType) {
                $.googleMaps.mapControls(opts.controls);
            } else {
                if (!opts.controls.hide) $.googleMaps.gMap.setUIToDefault();
            }

            // SCROLL
            if (opts.scroll) $.googleMaps.gMap.enableScrollWheelZoom();
            else if (!opts.scroll) $.googleMaps.gMap.disableScrollWheelZoom();

            // LOCAL SEARCH
            if (opts.controls.localSearch) $.googleMaps.gMap.enableGoogleBar();
            else
            $.googleMaps.gMap.disableGoogleBar();

            // FEED (RSS/KML)
            if (opts.feed) $.googleMaps.gMap.addOverlay(new GGeoXml(opts.feed));

            // TRAFFIC INFO
            if (opts.trafficInfo) {
                var trafficOptions = {
                    incidents: true
                };
                trafficInfo = new GTrafficOverlay(trafficOptions);
                $.googleMaps.gMap.addOverlay(trafficInfo);
            }

            // DIRECTIONS
            if (opts.directions) {
                $.googleMaps.directions = new GDirections($.googleMaps.gMap, opts.directions.panel);
                $.googleMaps.directions.load(opts.directions.route);
            }

            if (opts.streetViewOverlay) {
                svOverlay = new GStreetviewOverlay();
                $.googleMaps.gMap.addOverlay(svOverlay);
            }
        },
        mapGeoDesic: function (options) {
            // Default GeoDesic Options
            geoDesicDefaults = {
                startLatitude: 37.4419,
                startLongitude: -122.1419,
                endLatitude: 37.4519,
                endLongitude: -122.1519,
                color: '#ff0000',
                pixels: 2,
                opacity: 10
            }
            // Merge the User & Default Options
            options = $.extend({}, geoDesicDefaults, options);
            var polyOptions = {
                geodesic: true
            };
            var polyline = new GPolyline([
            new GLatLng(options.startLatitude, options.startLongitude), new GLatLng(options.endLatitude, options.endLongitude)], options.color, options.pixels, options.opacity, polyOptions);
            $.googleMaps.gMap.addOverlay(polyline);
        },
        localSearchControl: function (options) {
            var controlLocation = $.googleMaps.mapControlsLocation(options.location);
            $.googleMaps.gMap.addControl(new $.googleMaps.gMap.LocalSearch(), new GControlPosition(controlLocation, new GSize(options.x, options.y)));
        },
        getLatitude: function () {
            return $.googleMaps.latitude;
        },
        getLongitude: function () {
            return $.googleMaps.longitude;
        },
        directions: {},
        latitude: '',
        longitude: '',
        latlong: {},
        maps: {},
        marker: {},
        gMap: {},
        defaults: {
            // Default Map Options
            latitude: 37.4419,
            longitude: -122.1419,
            depth: 13,
            scroll: true,
            trafficInfo: false,
            streetViewOverlay: false,
            controls: {
                hide: false,
                localSearch: false
            },
            layer: null
        },
        mapPolyLine: function (options) {
            // Default PolyLine Options
            polylineDefaults = {
                startLatitude: 37.4419,
                startLongitude: -122.1419,
                endLatitude: 37.4519,
                endLongitude: -122.1519,
                color: '#ff0000',
                pixels: 2
            }
            // Merge the User & Default Options
            options = $.extend({}, polylineDefaults, options);
            //Return the New Polyline
            return new GPolyline([
            $.googleMaps.mapLatLong(options.startLatitude, options.startLongitude), $.googleMaps.mapLatLong(options.endLatitude, options.endLongitude)], options.color, options.pixels);
        },
        mapLatLong: function (latitude, longitude) {
            // Returns Latitude & Longitude Center Point
            return new GLatLng(latitude, longitude);
        },
        mapPanOptions: function (options) {
            // Returns Panning Options
            var panDefaults = {
                panLatitude: 37.4569,
                panLongitude: -122.1569,
                timeout: 0
            }
            return options = $.extend({}, panDefaults, options);
        },
        mapMarkersOptions: function (icon) {
            //Define an icon
            var gIcon = new GIcon(G_DEFAULT_ICON);
            if (icon.image)
            // Define Icons Image
            gIcon.image = icon.image;
            if (icon.shadow)
            // Define Icons Shadow
            gIcon.shadow = icon.shadow;
            if (icon.iconSize)
            // Define Icons Size
            gIcon.iconSize = new GSize(icon.iconSize);
            if (icon.shadowSize)
            // Define Icons Shadow Size
            gIcon.shadowSize = new GSize(icon.shadowSize);
            if (icon.iconAnchor)
            // Define Icons Anchor
            gIcon.iconAnchor = new GPoint(icon.iconAnchor);
            if (icon.infoWindowAnchor)
            // Define Icons Info Window Anchor
            gIcon.infoWindowAnchor = new GPoint(icon.infoWindowAnchor);
            if (icon.dragCrossImage)
            // Define Drag Cross Icon Image
            gIcon.dragCrossImage = icon.dragCrossImage;
            if (icon.dragCrossSize)
            // Define Drag Cross Icon Size
            gIcon.dragCrossSize = new GSize(icon.dragCrossSize);
            if (icon.dragCrossAnchor)
            // Define Drag Cross Icon Anchor
            gIcon.dragCrossAnchor = new GPoint(icon.dragCrossAnchor);
            if (icon.maxHeight)
            // Define Icons Max Height
            gIcon.maxHeight = icon.maxHeight;
            if (icon.PrintImage)
            // Define Print Image
            gIcon.PrintImage = icon.PrintImage;
            if (icon.mozPrintImage)
            // Define Moz Print Image
            gIcon.mozPrintImage = icon.mozPrintImage;
            if (icon.PrintShadow)
            // Define Print Shadow
            gIcon.PrintShadow = icon.PrintShadow;
            if (icon.transparent)
            // Define Transparent
            gIcon.transparent = icon.transparent;
            return gIcon;
        },
        mapMarkers: function (center, markers) {
            if (typeof(markers.length) == 'undefined')
            // One marker only. Parse it into an array for consistency.
            markers = [markers];

            var j = 0;
            for (i = 0; i < markers.length; i++) {
                var gIcon = null;
                if (markers[i].icon) {
                    gIcon = $.googleMaps.mapMarkersOptions(markers[i].icon);
                }

                if (markers[i].geocode) {
                    var geocoder = new GClientGeocoder();
                    geocoder.getLatLng(markers[i].geocode, function (center) {
                        if (!center) alert(address + " not found");
                        else
                        $.googleMaps.marker[i] = new GMarker(center, {
                            draggable: markers[i].draggable,
                            icon: gIcon
                        });
                    });
                } else if (markers[i].latitude && markers[i].longitude) {
                    // Latitude & Longitude Center Point
                    center = $.googleMaps.mapLatLong(markers[i].latitude, markers[i].longitude);
                    $.googleMaps.marker[i] = new GMarker(center, {
                        draggable: markers[i].draggable,
                        icon: gIcon
                    });
                }
                $.googleMaps.gMap.addOverlay($.googleMaps.marker[i]);
                if (markers[i].info) {
                    // Hide Div Layer With Info Window HTML
                    $(markers[i].info.layer).hide();
                    // Marker Div Layer Exists
                    if (markers[i].info.popup)
                    // Map Marker Shows an Info Box on Load
                    $.googleMaps.marker[i].openInfoWindowHtml($(markers[i].info.layer).html());
                    else
                    $.googleMaps.marker[i].bindInfoWindowHtml($(markers[i].info.layer).html().toString());
                }
            }
        },
        mapControlsLocation: function (location) {
            switch (location) {
            case 'G_ANCHOR_TOP_RIGHT':
                return G_ANCHOR_TOP_RIGHT;
                break;
            case 'G_ANCHOR_BOTTOM_RIGHT':
                return G_ANCHOR_BOTTOM_RIGHT;
                break;
            case 'G_ANCHOR_TOP_LEFT':
                return G_ANCHOR_TOP_LEFT;
                break;
            case 'G_ANCHOR_BOTTOM_LEFT':
                return G_ANCHOR_BOTTOM_LEFT;
                break;
            }
            return;
        },
        mapControl: function (control) {
            switch (control) {
            case 'GLargeMapControl3D':
                return new GLargeMapControl3D();
                break;
            case 'GLargeMapControl':
                return new GLargeMapControl();
                break;
            case 'GSmallMapControl':
                return new GSmallMapControl();
                break;
            case 'GSmallZoomControl3D':
                return new GSmallZoomControl3D();
                break;
            case 'GSmallZoomControl':
                return new GSmallZoomControl();
                break;
            case 'GScaleControl':
                return new GScaleControl();
                break;
            case 'GMapTypeControl':
                return new GMapTypeControl();
                break;
            case 'GHierarchicalMapTypeControl':
                return new GHierarchicalMapTypeControl();
                break;
            case 'GOverviewMapControl':
                return new GOverviewMapControl();
                break;
            case 'GNavLabelControl':
                return new GNavLabelControl();
                break;
            }
            return;
        },
        mapTypeControl: function (type) {
            switch (type) {
            case 'G_NORMAL_MAP':
                return G_NORMAL_MAP;
                break;
            case 'G_SATELLITE_MAP':
                return G_SATELLITE_MAP;
                break;
            case 'G_HYBRID_MAP':
                return G_HYBRID_MAP;
                break;
            }
            return;
        },
        mapControls: function (options) {
            // Default Controls Options
            controlsDefaults = {
                type: {
                    location: 'G_ANCHOR_TOP_RIGHT',
                    x: 10,
                    y: 10,
                    control: 'GMapTypeControl'
                },
                zoom: {
                    location: 'G_ANCHOR_TOP_LEFT',
                    x: 10,
                    y: 10,
                    control: 'GLargeMapControl3D'
                }
            };
            // Merge the User & Default Options
            options = $.extend({}, controlsDefaults, options);
            options.type = $.extend({}, controlsDefaults.type, options.type);
            options.zoom = $.extend({}, controlsDefaults.zoom, options.zoom);

            if (options.type) {
                var controlLocation = $.googleMaps.mapControlsLocation(options.type.location);
                var controlPosition = new GControlPosition(controlLocation, new GSize(options.type.x, options.type.y));
                $.googleMaps.gMap.addControl($.googleMaps.mapControl(options.type.control), controlPosition);
            }
            if (options.zoom) {
                var controlLocation = $.googleMaps.mapControlsLocation(options.zoom.location);
                var controlPosition = new GControlPosition(controlLocation, new GSize(options.zoom.x, options.zoom.y))
                $.googleMaps.gMap.addControl($.googleMaps.mapControl(options.zoom.control), controlPosition);
            }
            if (options.mapType) {
                if (options.mapType.length >= 1) {
                    for (i = 0; i < options.mapType.length; i++) {
                        if (options.mapType[i].remove) $.googleMaps.gMap.removeMapType($.googleMaps.mapTypeControl(options.mapType[i].remove));
                        if (options.mapType[i].add) $.googleMaps.gMap.addMapType($.googleMaps.mapTypeControl(options.mapType[i].add));
                    }
                } else {
                    if (options.mapType.add) $.googleMaps.gMap.addMapType($.googleMaps.mapTypeControl(options.mapType.add));
                    if (options.mapType.remove) $.googleMaps.gMap.removeMapType($.googleMaps.mapTypeControl(options.mapType.remove));
                }
            }
        },
        geoCode: function (options) {
            geocoder = new GClientGeocoder();

            geocoder.getLatLng(options.address, function (point) {
                if (!point) alert(address + " not found");
                else
                $.googleMaps.gMap.setCenter(point, options.depth);
            });
        }
    };

/* 
	end GoogleMaps
*/

})(this.jQuery);
