//Copyright (c) 2013 Crystalline Technologies
//
//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'),
//  to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
//  and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
//  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

(function($){

    //Main method
    $.fn.json2html = function(json, transform, _options){

        //Make sure we have the json2html base loaded
        if(typeof json2html === 'undefined') return(undefined);

        //Default Options
        var options = {
            'append':true,
            'replace':false,
            'prepend':false,
            'eventData':{}
        };

        //Extend the options (with defaults)
        if( _options !== undefined ) $.extend(options, _options);

        //Insure that we have the events turned (Required)
        options.events = true;

        //Make sure to take care of any chaining
        return this.each(function(){

            //let json2html core do it's magic
            var result = json2html.transform(json, transform, options);

            //Attach the html(string) result to the DOM
            var dom = $(document.createElement('i')).html(result.html);

            //Determine if we have events
            for(var i = 0; i < result.events.length; i++) {

                var event = result.events[i];

                //find the associated DOM object with this event
                var obj = $(dom).find("[json2html-event-id-"+event.type+"='" + event.id + "']");

                //Check to see if we found this element or not
                if(obj.length === 0) throw 'jquery.json2html was unable to attach event ' + event.id + ' to DOM';

                //remove the attribute
                $(obj).removeAttr('json2html-event-id-'+event.type);

                //attach the event
                $(obj).on(event.type,event.data,function(e){
                    //attach the jquery event
                    e.data.event = e;

                    //call the appropriate method
                    e.data.action.call($(this),e.data);
                });
            }

            //Append it to the appropriate element
            if (options.replace) $.fn.replaceWith.call($(this),$(dom).children());
            else if (options.prepend) $.fn.prepend.call($(this),$(dom).children());
            else $.fn.append.call($(this),$(dom).children());
        });
    };
})(jQuery);
