(function($){

  $.fn.ccshuffle = function() {
      return this.each(function(){
        var items = $(this).children();
        return (items.length)
          ? $(this).empty().append($.ccshuffle(items))
          : this;
      });
    }

  $.ccshuffle = function(arr) {
    for(
      var j, x, i = arr.length; i;
      j = parseInt(Math.random() * i),
      x = arr[--i], arr[i] = arr[j], arr[j] = x
    );
    return arr;
  }
  
  $.fn.ccXmlToString = function(){
    var str = '';
    this.each(function(){
      if(window.ActiveXObject){
        str += this.xml;
      } else {
        str += (new XMLSerializer()).serializeToString(this);
      }
    });
    
    return str;
  };
  
  $.fn.ccvideo = function(options){
    var options = $.extend({}, $.fn.ccvideo.options, options||{});
    
    var loadData = function(data){
      var retData;
      $.ajax({
        url: data,
        type: "GET",
        dataType: "xml",
        async: false,
        timeout: 3000,
        success: function(xml) {
          retData = $(xml);
        },   
        error: function() {
          retData = false;
        }
      });
      return retData;
    }
    
    if(typeof $.fn.ccvideo.registry == 'undefined'){
      $.fn.ccvideo.registry = {
        data: loadData(options.data),
        getVideo: function(videoId){
          var idMask = options.templateNodePrefix+"-thumbnail-";
          var id = videoId.substr(videoId.indexOf(idMask)+idMask.length);
          var video = $('#'+id, this.data);
          
          if(video.length > 0){
            var a = $('altContent', video).children();
            if(a.length > 0){
              a = $.browser.msie ? $(a.ccXmlToString().replace(/html:/, '', 'g')) :  $(a.ccXmlToString());
            } else {
              a = $("<div></div>").css({'width': video.attr('width'), 'height':video.attr('height')});
            }
            
            return {
              'swf': video.attr('player'),
              'flashvars': {'xmlpath': video.attr('xmlpath')},
              'params': {flashvars: $.param({'xmlpath': video.attr('xmlpath')})},
              'alt': a,//$('altContent', video).children().ccXmlToString().replace(/html:/, '', 'g'), //$("<p>&nbsp;</p>").css({'width': video.attr('width'), 'height':video.attr('height')}),//
              'attributes': {
                'id': video.attr('id'),
                'width': video.attr('width'),
                'height':video.attr('height'),
                'data': video.attr('player')
              }
            };
          } else {
            return null;
          }
        }
      };
      
      registry = $.fn.ccvideo.registry;  
    }
    
     
    
    // plugin body
    this.each(function(i){
      $this = $(this);
      
      var videoToNode = function(video){
        
        // transform to proper video markup
        // image
        var video = $(video);
        //alert($.param($.fn.ccvideo.registry.getVideo(options.templateNodePrefix+'-video-'+video.attr('id'))));
        var html = '<div class="container">'
                      +'<img class="thumbnail" />'
                      +'<h4 class="title"></h4>'
                      +'<div class="description">'
                      +'</div>'
                   +'<div>';
        var node = $(html);
        
        var container = node.attr({
            "id": options.templateNodePrefix+'-video-'+video.attr('id'),
            "class": options.templateNodePrefix+'-video'
        }).css($.extend({}, options.css[".container"]||{},{
          "padding-left": 10,
          "padding-right": 10
        }));
    
        var thumbnail = $('img.thumbnail', node).attr({
            "id": options.templateNodePrefix+'-thumbnail-'+video.attr('id'),
            "class": options.templateNodePrefix+'-thumbnail',
            src: $('thumbnail', video).attr('src'),
            alt: "thumbnail"
        });
        
        var title = $('.title', node).attr({
            "id": options.templateNodePrefix+'-title-'+video.attr('id'),
            "class": options.templateNodePrefix+'-title'
        }).css(options.css[".title"]||{});
        

        if($('title', video).children().length){
          var cTitle = $('title', video).children().clone();
          title.append(($.browser.msie ? cTitle.ccXmlToString().replace(/html:/, '', 'g') : cTitle.ccXmlToString()));
        } else {
          title.html($('title', video).text());
        }
        
         var description = $('.description', node).attr({
              "id": options.templateNodePrefix+'-description-'+video.attr('id'),
              "class": options.templateNodePrefix+'-description'
          }).css(options.css[".description"]||{});
        
        if($('description', video).children().length){
          var cDescription = $('description', video).children().clone()
          description.append(($.browser.msie ? cDescription.ccXmlToString().replace(/html:/, '', 'g') : cDescription.ccXmlToString()));
        } else {
          description.html($('description', video).text());
        }
        
        return node;
      };
      
      if($.browser.msie){
        var videos = $('videos', registry.data).children();
      } else {
        var videos = options.randomize||false ? $('videos', registry.data).ccshuffle().children() : $('videos', registry.data).children();
      }

      var l = options.limit == null ? videos.length : options.limit;
      
      var videosHtml = $("<div></div>").attr("id", options.templateNodePrefix+'-videos');
      
      // create our columns
      var videoGroups = new Array();
      
      for(var j=0; (j < options.layout.grouping); j++){
        videoGroups[j] = $("<div></div>").attr("class", options.templateNodePrefix+'-video_group').css({
          width: Math.floor(($this.innerWidth()/options.layout.grouping)-10),
          float: "left",
          overflow: "auto"
        });
      }
      
      // create content
      var igroup = 0;
      
      for(var k=0; ( k < l && k < videos.length); k++){
        if(igroup < videoGroups.length){
          videoGroups[igroup].append(videoToNode(videos[k]));
          igroup++;
        } else {
          igroup = 0;
          videoGroups[igroup].append(videoToNode(videos[k]));
          igroup++;
        }
      }
     
      $.each(videoGroups, function(k,v){
        videosHtml.append(v);
      });
      
      switch(options.mode){
        case "append":
          $this.append(videosHtml);
          break;
        case "replace":
          $this.empty().append(videosHtml);
          break;
      }
      var s = 'img.'+options.templateNodePrefix+'-thumbnail';
      $(s).ccfancyzoom({directory: options.zoomdir});
      
      return $this;
    });
  };
  
  $.fn.ccvideo.options = {
    data: null,// str|jQuery|jsonobject,
    templateNodePrefix: 'ccvideo',
    selector: 'videos',
    layout: {grouping: 2, direction: 'horizontal'},
    rowsets: false,
    mode: "append",
    limit: null,
    zoomdir: 'http://cclickvidservgs.com/davita/js/fancyzoom/images',
    css: {
      ".description": {"font-family":"Arial,Helvetica,sans-serif","font-size":"80%","padding-bottom":"20px"},
      ".title": {},
      ".thumbnail": {},
      ".container": {"padding-top":"20px"}
    }
  }
  
})(jQuery);
