/*globals YAHOO, window, document, dcsMultiTrack, alert */

/*members CollectionSlideShow, Connect, CustomEvent, Dom, Event, Ready, 
    Refresh, Vmix, VmixUploader, action, addClass, ads, appendChild, 
    asyncRequest, attrs, author, checked, class_id, click, concat, 
    container, createElement, createTextNode, description, display, dmg, 
    element, events, failure, fire, firstChild, focus, follow, get, 
    getElementsByClassName, getTarget, hasClass, hasOwnProperty, head, 
    innerHTML, lang, length, limit, media, merge, namespace, next, on, page, 
    parentNode, prev, register_plugin, register_widget, reloadAds, 
    removeChild, removeClass, removeListener, setForm, setStyle, site, src, 
    stopEvent, subscribe, thumbnail, title, trackPageview, transport, type, 
    unsubscribe, upload, url, util, value, vmix_player, weather, xdr, 
    xdrReadyEvent
*/

YAHOO.namespace("dmg.weather.Vmix");

YAHOO.dmg.weather.Vmix = function(){
    var VMIX_URL = "http://api.vmixcore.com/apis/collection.php?",
        num_of_callbacks = 0,
        registered_widgets = {},
        yuD = YAHOO.util.Dom,
        yuE = YAHOO.util.Event,
        yuC = YAHOO.util.Connect,
        ATOKEN;

    function create_callback (cb_func){
        var func_name = 'vmix_cb' + num_of_callbacks;
        num_of_callbacks++;
        YAHOO.dmg.weather.Vmix[func_name] = cb_func;
        return func_name;
    }

    function VmixPlugin (widget){
        function onClick (e) {
            var t = yuE.getTarget(e);
            while(t !== widget.attrs.element){
                if (yuD.hasClass(t, "jw-lb-vmix-next")){
                    yuE.stopEvent(e);
                    if (!yuD.hasClass(t, "inactive")) {
                        widget.vmix_player.next();
                    }
                } else if(yuD.hasClass(t, "jw-lb-vmix-prev")){
                    yuE.stopEvent(e);
                    if (!yuD.hasClass(t, "inactive")) {
                        widget.vmix_player.prev();
                    }
                }
                t = t.parentNode;
            }
        }
        
        function load (type, args, me) {
            var cont_class, el, defaults;
            for(cont_class in registered_widgets){
  
                if(registered_widgets.hasOwnProperty(cont_class)){
                    el = yuD.getElementsByClassName(cont_class, 'div', widget.attrs.element)[0];
                    if(el && widget.vmix_player){
                        widget.vmix_player.display(el);
                    } else if (el){
                        defaults = { 
                            next : 'jw-lb-vmix-next', 
                            prev : 'jw-lb-vmix-prev',
                            container : widget.attrs.element
                        };
                        widget.vmix_player = new YAHOO.dmg.weather.Vmix.CollectionSlideShow(el, registered_widgets[cont_class], defaults);
                        widget.events.follow({ click : onClick });
                    }
                }
            }
        }
        
        widget.Refresh.subscribe(load);
    }
    
    YAHOO.dmg.weather.register_plugin(VmixPlugin);
    
    return {
        CollectionSlideShow : function(id, col_id, settings){
            var cb_func_str,
                defaults = {
                  limit:20,
                  container : window
                },
                image_cache = [],
                el = YAHOO.util.Dom.get(id),
                new_images = new YAHOO.util.CustomEvent('new_image', this),
                num = 0,
                complete = false,
                site = YAHOO.dmg.weather.page.site;
                
            
            defaults = YAHOO.lang.merge(defaults, settings||{});
            
            if (site === 'det') {
                ATOKEN = "ceb951d51bd3ce91bed7c79e77e87e49";
            } else if (site === 'mia') {
                ATOKEN = '991f1d001dc50992514b88638d1d91d1';
            } else if (site === 'orlpn') {
                ATOKEN = 'fd2e549f5ef129767d49d739cbe5fd9c';
            } else if (site === 'jax') {
                ATOKEN = 'b083bbcb56662c31fd7e3ef75f4c15d1';
            } else if (site === 'ant') {
                ATOKEN = 'c204e869a1c373495c786866e5d238fe';
            } else if (site === 'hou') {
                ATOKEN = 'c29fb3ad567ee0af2cbf8a691f80136e';
            }
            
            function populate_images (obj) {
                image_cache = image_cache.concat(obj.media);
                new_images.fire();
                delete YAHOO.dmg.weather.Vmix[cb_func_str];
            }

            function get_images (start) {
              if(!complete){
                cb_func_str = create_callback(populate_images);
                var s = document.createElement('script');
                s.src = VMIX_URL + 'action=getCollectionMedias&collection_id=';
                s.src += col_id + '&atoken=' + ATOKEN + '&output=jsonp&callback=YAHOO.dmg.weather.Vmix.';
                s.src += cb_func_str + '&limit=' + defaults.limit + "&start=" + start;
                s.src += '&order_method=DESC&order=date_created';
                s.type = 'text/javascript';
                window.head.appendChild(s);
              }
            }

            function show_image (snum) {
                var orig_len = image_cache.length;
                if(orig_len <= snum){

                    var check_new_images = function (e){
                        if(orig_len === image_cache.length){
                            complete = true;
                        } else {
                            new_images.unsubscribe(check_new_images);
                            show_image(snum);
                        }
                    };

                    new_images.subscribe(check_new_images, this);
                    if (!complete){
                      get_images(image_cache.length);
                    }
                } else {
                    var vmix_image = image_cache[snum],
                        old_el, d, img, p, t, s, a;
                    if(vmix_image.class_id === "2"){
                      old_el = el.firstChild;
                      d = document.createElement('div');
                      img = document.createElement('img');
                      img.src = vmix_image.thumbnail[1].url;
                      p = document.createElement('p');
                      t = document.createTextNode(vmix_image.description);
                      s = document.createElement('h5');
                      s.innerHTML = vmix_image.title;
                      p.appendChild(s);
                      p.appendChild(t);
                      YAHOO.util.Dom.setStyle(p, 'opacity', 0.7);

                      a = document.createElement('span');
                      a.innerHTML = vmix_image.author;
                      YAHOO.util.Dom.setStyle(a, 'opacity', 0.7);

                      d.appendChild(img);
                      d.appendChild(p);
                      d.appendChild(a);

                      el.appendChild(d);
                      if(old_el){
                          el.removeChild(old_el);
                          YAHOO.dmg.weather.page.trackPageview();                      
                          YAHOO.dmg.ads.reloadAds();
                      }
                      
                      num = snum;
                    } else {
                      show_image((snum + (snum - num)) || 1);
                    }
                }
                if (snum===0 && defaults.prev){
                  YAHOO.util.Dom.addClass(YAHOO.util.Dom.getElementsByClassName(defaults.prev, 'a', defaults.container), 'inactive');
                } else if(defaults.prev){
                  YAHOO.util.Dom.removeClass(YAHOO.util.Dom.getElementsByClassName(defaults.prev, 'a', defaults.container), 'inactive');
                }
                if (complete && snum >= orig_len - 1 && defaults.next){
                  YAHOO.util.Dom.addClass(
                      YAHOO.util.Dom.getElementsByClassName(
                        defaults.next, 'a', defaults.container), 'inactive');
                } else if(defaults.next){
                  YAHOO.util.Dom.removeClass(
                    YAHOO.util.Dom.getElementsByClassName(
                      defaults.next, 'a', defaults.container), 'inactive');
                }
            }

            this.next = function(){
                show_image(num + 1);
            };

            this.prev = function(){
                show_image(num - 1);
            };
            
            this.display = function(nel){
              el = nel;
              show_image(num);
            };
            show_image(0);
        },

        
        register_widget : function(collection_id, container_class){
            registered_widgets[container_class] = collection_id;
        },
        
        VmixUploader : function (widget) {
            var checked = false;
            
            function makeForm (form) {
                var btn = yuD.getElementsByClassName('vmix_upload_btn', 'a', widget.attrs.element)[0],
                    callback;
                
                function validate_form () {
                    var vfields = ['title', 'description', 'md_8', 'md_9', 'author', 'md_6', 'md_7', 'md_10', 'md_22', 'file_upload'],
                        i = 0;
                    for (i; i < vfields.length; i++) {
                        if (!form[vfields[i]].value) {
                            form[vfields[i]].focus();
                            yuD.setStyle(form[vfields[i]].parentNode, "border", "2px #FF0000 solid");
                            alert("Please Fill In All Fields");
                            return false;
                        } else if (form[vfields[i]].type === "checkbox" && !form[vfields[i]].checked) {
                            yuD.setStyle(form[vfields[i]].parentNode,  "border", "2px #FF0000 solid");
                            alert("Please agree to the terms of service");
                            return false;
                        } else {
                            yuD.setStyle(form[vfields[i]].parentNode, "border", "0");
                        }
                    }
                    return true;
                }
                
                function send_request (e) {
                    yuE.stopEvent(e);
                    btn.innerHTML = "Uploading";
                    yuE.removeListener(btn, "click");
                    if (validate_form()) {
                        yuC.setForm(form, true);
                        yuC.asyncRequest('POST', form.action, callback);
                    } else {
                        btn.innerHTML = "Submit Your Event";
                        yuE.on(btn, "click", send_request);                        
                    }
                }
                
                callback = {
                 upload: function (o) {
                     widget.attrs.element.firstChild.innerHTML = "<h1>Thanks for Submitting Your Event</h1>";
                  },
                  failure : function (o) {
                    alert("Your Upload Failed. Please Try Again");
                    btn.innerHTML = "Submit Your Event";
                    yuE.on(btn, "click", send_request);
                  },
                  xdr : true
                };
                
                function transport_ready () {
                    yuE.on(btn, "click", send_request);
                    yuE.on(form, "submit", function (e) { yuE.stopEvent(e); });
                }

                yuC.transport('/static/connection.swf');
                yuC.xdrReadyEvent.subscribe(transport_ready);
            }
            
            function load (type, args, me) {
                var upload_forms = yuD.getElementsByClassName('vmix_upload_form', 'form', widget.attrs.element);
                if (upload_forms.length) {
                    makeForm(upload_forms[0]);
                } else if (!checked) {
                    if (type === 'Ready') {
                        widget.Refresh.subscribe(load);
                    } else {
                        // assume that on Ready has the same is legend or not
                        widget.Refresh.unsubscribe(load);
                        checked = true;
                    }
                }
            }
            
            widget.Ready.subscribe(load);
        }
    };
}();
