(function() {
if (typeof SEETOO != "undefined") {
    return;
}

var SEETOO = window.SEETOO = {
    getQueryString: function(name) {
        return params[name];
    },

    hasQueryString: function(name) {
        return params[name] != undefined;
    },

    loadQueryString: function(queryString) {
        params = parseQueryString(queryString);
    },

    getParams: function(queryString) {
        return parseQueryString(queryString);
    },

    redirect: function(url, request, method) {
        request = request || {};
        method = method || 'GET';

        var el = document.createElement('form');
        document.body.appendChild(el);

        var form = jQuery(el).hide();

        form.attr({
            method: method.toUpperCase(),
            action: url
        });
        form.append('<input type="submit">');

        for (name in request) {
            form.append('<input name="' + name + '" value="' + request[name] + '" />');
        }

        form.submit();
    },

    postRedirect: function(additionalParams) {
        additionalParams = additionalParams || {};

        var request = {};
        jQuery.extend(request, params);
        jQuery.extend(request, additionalParams);

        this.redirect(document.location.href.substring(0, document.location.href.indexOf('?')), request, 'POST');
    },

    getFileName: function (path) {
        if (!path) return '';

        var pathParts = path.split('\\');
        var fileParts = pathParts[pathParts.length - 1].split('.');
        fileParts.pop();

        return fileParts.join('.');
    },

    getFileExtension: function (path) {
        if (!path) return '';

        var pathParts = path.split('\\');
        var fileParts = pathParts[pathParts.length - 1].split('.');
        var fileExtension = fileParts.pop() || '';
        return fileExtension.toLowerCase();
    },

    log: function() { try {
        if (window.console && console.firebug) {
            console.log(arguments);
        } else if (console && console.log) {
            var logMessage = '';

            $.each(arguments, function(i, n) {
                logMessage += n;
            });

            console.log(logMessage);
        }
    } catch(ex) {} },

    trace: function() {
        if (window.console && console.firebug) {
            console.trace(arguments);
        }
    },

    compareVersion: function(version, compareToVersion) {
        if (!version) {
            return -1;
        }

        var versionParts = version.split('.');
        var compareToVersionParts = compareToVersion.split('.');

        for (var i = 0; i < compareToVersionParts.length && i < versionParts.length; i++) {
            var versionPart = parseInt(versionParts[i], 10);
            var compareToVersionPart = parseInt(compareToVersionParts[i], 10);

            if (versionPart < compareToVersionPart) {
                return -1;
            }
            else if (versionPart > compareToVersionPart) {
                return 1;
            }
        }

        return 0;
    }
};

jQuery.ajax({
    type: "GET",
    url: "http://yui.yahooapis.com/combo?2.7.0/build/yahoo/yahoo-min.js&2.7.0/build/json/json-min.js",
    dataType: "script",
    cache: true,
    success: function() {
        SEETOO.JSON = {
            parse: function(s) {
                return YAHOO.lang.JSON.parse(s);
            },
            stringify: function (o) {
                return YAHOO.lang.JSON.stringify(o)
            }
        };
    }
});

var parseQueryString = function(request) {
    var params = {};

    if (typeof request == 'undefined' || request.length == 0 || request === '?') {
        return params;
    }

    var paramsPairs = request.split('&');

    while (paramsPairs.length > 0) {
        var pair = paramsPairs.shift().split('=');
        var pairValue;

        if (pair[1] === undefined) {
            pairValue = '';
        } else if (!isNaN(pair[1])) {
            pairValue = Number(pair[1]);
        } else {
            pairValue = pair[1];//unescape(pair[1]).toLowerCase();//decodeURIComponent(pair[1]);//unescape(pair[1])();

            if (pairValue == 'true') {
                pairValue = true;
            } else if (pairValue == 'false') {
                pairValue = false;
            }
        }

        params[unescape(pair[0])] = pairValue;
    }

    return params;
};

var params = parseQueryString(document.location.search.substring(1));

//
// GeoData
//

SEETOO.GeoData = {

    load: function(callback) {
        var geoData;

        var load = this.load = function(callback) {
            callback.call(this, geoData);
        };

        $.ajax({
            type: 'GET',
            url: 'http://j.maxmind.com/app/geoip.js',
            dataType: 'script',
            cache: true,
            success: function() {
                var countryCode = '';
                var countryName = '';
                var region = '';
                var city = '';

                try { countryCode = geoip_country_code(); } catch(ex) {}
                try { countryName = geoip_country_name(); } catch(ex) {}
                try { region = geoip_region(); } catch(ex) {}
                try { city = geoip_city(); } catch(ex) {}

                geoData = {
                    countryCode: countryCode,
                    countryName: countryName,
                    region: region,
                    city: city
                };

                load(callback);
            }
        });
    }

};

//
// Prototypes
//

String.prototype.trim = function() {
    //return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    s = this.replace(/^\s+/, '');

    for (var i = s.length - 1; i > 0; i--) {
        if (/\S/.test(s.charAt(i))) {
            s = s.substring(0, i + 1);
            break;
        }
    }

    return s;
};

String.prototype.format = function(source, params) {
/*
alert( String.format("Please enter at least {0} characters", 5) ); // alerts "Please enter at least 5 characters"
var template = String.format("Please enter at least {0} characters");
alert( template(2) ); // alerts "Please enter at least 2 characters"
alert( template(12) ); // alerts "Please enter at least 12 characters"
*/
    if (arguments.length == 1) {
        return function() {
            var args = jQuery.makeArray(arguments);
            args.unshift(source);
            return String.format.apply(this, args);
        };
    }

    if (arguments.length > 2 && params.constructor != Array) {
        params = jQuery.makeArray(arguments).slice(1);
    }

    if (params.constructor != Array) {
        params = [params];
    }

    jQuery.each(params, function(i, n) {
        source = source.replace(new RegExp("\{" + i + "\}", "g"), n);
    });

    return source;
};

var emailFilter = /^.+@.+\..{2,3}$/;
var emailIllegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/;

String.prototype.isEmail = function() {
    text = this.trim();

    if (text == '') {
        return false;
    }

    if (!(emailFilter.test(text))) {
       return false;
    }

    if (text.match(emailIllegalChars)) {
        return false;
    }

    return true;
};

//
// Pretty date
//

/*function prettyDate(time) {
    var date = typeof time == 'object' ? time : new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," "));
    var diff = (((new Date()).getTime() - date.getTime()) / 1000);
    var day_diff = Math.floor(diff / 86400);

    if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
        return;

    return day_diff == 0 && (
                diff < 60 && "just now" ||
                diff < 120 && "1 minute ago" ||
                diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
                diff < 7200 && "1 hour ago" ||
                diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
            day_diff == 1 && "Yesterday" ||
            day_diff < 7 && day_diff + " days ago" ||
            day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

Date.prototype.prettyDate = function() {
    return prettyDate(this);
}*/

if ( typeof jQuery != "undefined" ) {
(function($) { // extend and override jQuery

    $.fn.prettyDate = function() {
        return this.each(function() {
            var date = prettyDate(this.title);
            date && $(this).text(date);
            //(date = prettyDate(this.title)) && $(this).text(date); // TODO: test
        });
    };

    var $animate = $.fn.animate;
    $.fn.animate = function(prop, speed, easing, callback) {
        return this.each(function() {
            if (!$.browser.msie) {
                $animate.apply($(this), [prop, speed, easing, callback])
            } else {
                var fn = callback || !callback && easing || $.isFunction(speed) && speed;
                var complete = function() {
                    this.style && this.style.removeAttribute && this.style.removeAttribute('filter');
                    $.isFunction(fn) && fn.call(this);
                }

                callback && $animate.apply($(this), [prop, speed, easing, complete]) ||
                !callback && easing && $animate.apply($(this), [prop, speed, complete]) ||
                $animate.apply($(this), [prop, complete]);
            }
        });
    };

})(jQuery);
}

})();
