/**
 * Return form values as map.
 */
(function($) {
    $.fn.getFormData = function() {
        var paramMap = {};
        $(this).find('input,select,textarea').each( function( i, input) {
            if( $(input).attr('type') == 'checkbox' ) {
                if( $(input).is(":checked") ) {
                    paramMap[input.name] = '1';
                }
            } else {
                paramMap[input.name] = input.value;
            }
                
        //               paramMap[input.name] = input.value;
        });
        //            $(this).find('textarea').each( function( i, input) {
        //               paramMap[input.name] = input.value;
        //            });
        return paramMap;
    }
})(jQuery);

/**
 * Set form values from map.
 */
(function($) {
    $.fn.setFormData = function(paramMap) {
        var form = this;
        $.each( paramMap, function( key, value ) {
            var mask = "input[name='" + key + "']";
            $(form).find(mask).val(value);
            mask = "select[name='" + key + "']";
            $(form).find(mask).val(value);
        });
        return paramMap;
    }
})(jQuery);


(function($) {
    $.fn.jsonFeedSelect = function(jsonString) {
        $(this).html('');
        if( typeof( jsonString ) == 'string' ) {
            eval ('var json = ' + jsonString);
        } else {
            json = jsonString;
        }
	    
        for (var key in json) {
            if (!json.hasOwnProperty(key)) {
                continue;
            }
            //	        if ('selected' == key) {
            //	            continue;
            //	        }
            var option = $('<option>').val(key).append(json[key]);
            $(this).append(option);
        }
    }
})(jQuery);
	


/**
 * Initialize jQuery.editable  
 */
function initJsonEditable( pattern, savePath, callback ) {
    return initJsonEditable(pattern, savePath, callback, {});
}
function initJsonEditable( pattern, savePath, callback, options ) {
    var defaultOptions = {
        indicator : "<img src='/images/indicator.gif'> Saving...",
        tooltip   : 'Click to edit...',
        cssclass   : "editable",
        callback: callback,
        placeholder: ''
    };
    $.extend(defaultOptions, options);
    $(pattern).jsoneditable(savePath, defaultOptions);
}
/**
 * Initialize jQuery.editable  
 */
function initJsonEditableSelect( pattern, savePath, data, callback ) {
    $(pattern).jsoneditable(savePath, { 
        indicator : "<img src='/img/indicator.gif'> Saving...",
        data   : data,
        type   : "select",
        submit : "OK",
        placeholder: '',
        callback: callback
    });
}



// ====================================================================
//       URLEncode and URLDecode functions
//
// Copyright Albion Research Ltd. 2002
// http://www.albionresearch.com/
//
// You may copy these functions providing that 
// (a) you leave this copyright notice intact, and 
// (b) if you use these functions on a publicly accessible
//     web site you include a credit somewhere on the web site 
//     with a link back to http://www.albionresarch.com/
//
// If you find or fix any bugs, please let us know at albionresearch.com
//
// SpecialThanks to Neelesh Thakur for being the first to
// report a bug in URLDecode() - now fixed 2003-02-19.
// ====================================================================
function urlencode( plaintext )
{
    // The Javascript escape and unescape functions do not correspond
    // with what browsers actually do...
    var SAFECHARS = "0123456789" +					// Numeric
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
    "abcdefghijklmnopqrstuvwxyz" +
    "-_.!~*'()";					// RFC2396 Mark characters
    var HEX = "0123456789ABCDEF";

    //	var plaintext = document.URLForm.F1.value;
    var encoded = "";
    for (var i = 0; i < plaintext.length; i++ ) {
        var ch = plaintext.charAt(i);
        if (ch == " ") {
            encoded += "+";				// x-www-urlencoded, rather than %20
        } else if (SAFECHARS.indexOf(ch) != -1) {
            encoded += ch;
        } else {
            var charCode = ch.charCodeAt(0);
            if (charCode > 255) {
                alert( "Unicode Character '"
                    + ch
                    + "' cannot be encoded using standard URL encoding.\n" +
                    "(URL encoding only supports 8-bit characters.)\n" +
                    "A space (+) will be substituted." );
                encoded += "+";
            } else {
                encoded += "%";
                encoded += HEX.charAt((charCode >> 4) & 0xF);
                encoded += HEX.charAt(charCode & 0xF);
            }
        }
    } // for

    //	document.URLForm.F2.value = encoded;
    return encoded;
};

function urldecode( encoded )
{
    // Replace + with ' '
    // Replace %xx with equivalent character
    // Put [ERROR] in output if %xx is invalid.
    var HEXCHARS = "0123456789ABCDEFabcdef";
    //   var encoded = document.URLForm.F2.value;
    var plaintext = "";
    var i = 0;
    while (i < encoded.length) {
        var ch = encoded.charAt(i);
        if (ch == "+") {
            plaintext += " ";
            i++;
        } else if (ch == "%") {
            if (i < (encoded.length-2)
                && HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
                && HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
                plaintext += unescape( encoded.substr(i,3) );
                i += 3;
            } else {
                alert( 'Bad escape combination near ...' + encoded.substr(i) );
                plaintext += "%[ERROR]";
                i++;
            }
        } else {
            plaintext += ch;
            i++;
        }
    } // while
    //   document.URLForm.F1.value = plaintext;
    return plaintext;
};

