/**
 * @author Kirowski Zrt.
 * @Copyright 2010 Kirowski Zrt.
 */

(function($){

    // Extend the jQuery itself
    jQuery.extend({
        parseJSON: function(data){
            if (typeof data !== "string" || !data) {
                return null;
            }
            
            // JSON RegExp
            var rvalidchars = /^[\],:{}\s]*$/,
            rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
            rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
            rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;
            
            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = jQuery.trim(data);
            
            // Make sure the incoming data is actual JSON
            // Logic borrowed from http://json.org/json2.js
            if (rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) {
            
                // Try to use the native JSON parser first
                return window.JSON && window.JSON.parse ? window.JSON.parse(data) : (new Function("return " + data))();
                
            }
            else {
                jQuery.error("Invalid JSON: " + data);
            }
        },
        
        stringifyJSON: function(obj){
            var t = typeof(obj);
            if (t != "object" || obj === null) {
                // simple data type
                if (t == "string") 
                    obj = '"' + obj + '"';
                return String(obj);
            }
            else {
                // recurse array or object
                var n, v, json = [], arr = (obj && obj.constructor == Array);
                for (n in obj) {
                    v = obj[n];
                    t = typeof(v);
                    if (t == "string") 
                        v = '"' + v + '"';
                    else 
                        if (t == "object" && v !== null) 
                            v = jQuery.stringifyJSON(v);
                    json.push((arr ? "" : '"' + n + '":') + String(v));
                }
                return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
            }
        }
    });
    
    // Extend jQuery element method
    $.fn.extend({
        check: function(){
            return jQuery(this).attr('checked',true);
        },
        uncheck: function(){
            return jQuery(this).attr('checked',false);
        },
        select: function(){
            return jQuery(this).attr('selected','selected');
        },
        deselect: function(){
            return jQuery(this).removeAttr('selected');
        },
        disable: function(){
            return jQuery(this).attr('disabled','disabled').removeAttr('enabled');
        },
        enable: function(){
            return jQuery(this).attr('enabled','enabled').removeAttr('disabled');
        },
        clearInputs: function(a){
            return $(this).each(function(){
                var $t = $(this),
                d = a || $t.val() || $t.text();
                if(!$t.val() || $t.val() == '')$t.val(d);
                $t.focus(function(){
                    var b = $(this);
                    if(b.val() == d)b.val("");
                    b.removeClass("error");
                }).blur(function(){
                    var b = $(this);
                    if (b.val() == d || b.val() == "")b.val(d);
                    b.removeClass("error");
                }).parents('form').submit(function(){
                    if ($t.val() == d) {
                        $t.val('');
                    }
                });
            });
        },
        equalHeights: function(){
            var tallest = jQuery(this).eq(0).addClass('tallest').height();
            return jQuery(this).each(function(i){
                var $t = jQuery(this), h = $t.height();
                if (h > tallest){
                    tallest = h;
                    $t.addClass('tallest').siblings().removeClass('tallest');
                }
            }).css('height', tallest);
        },
        replaceSubmitBtn: function(myText, wrapWithSpan){
            var $sbmts = $(this).filter(function(){
                return !$(this).hasClass('replaced');
            });
            if ($sbmts.length) {
                $sbmts.each(function(){
                    var $sbmt = $(this).wrap('<span class="replacedSubmitContainer" style="position:relative;float:left;"></span>');
                    var $btn = $('<a href="#" class="arrow replacedSubmit"></a>').addClass($sbmt.attr('class')).css({
                        position: 'relative',
                        zIndex: 1
                    }).append($('<strong />').html(myText || $sbmt.val() || $sbmt.text()));
                    if (wrapWithSpan) {
                        $btn.find('strong').wrap('<span></span>');
                    };
                    
                    $sbmt.after($btn).css({
                        opacity: 0,
                        position: 'absolute',
                        zIndex: 2,
                        width: $btn.outerWidth(),
                        height: $btn.outerHeight(),
                        top: 0,
                        left: 0,
                        border: 0,
                        padding: 0,
                        margin: 0,
                        overflow: 'visible',
                        cursor: 'pointer'
                    }).addClass('replaced').hover(function(){
                        $btn.addClass('hovered');
                    }, function(){
                        $btn.removeClass('hovered');
                    });                    
                    if ($(this).hasClass('withCancel'))$btn.after('<a class="cancel" href=\"#\"><strong>Mégsem</strong></a>');
                })
            }
        }
    });
})(jQuery);
