/** 
 * Base class for the Widget
 * @constructor
 */ 
function CMHTWidget(config,id) {
  
  this.defaultConfig = {
    "methods": {
      "config": "configuration.jsp",
      "login": "login.jsp",
      "logout": "logout.jsp",
      "register": "register.jsp",
      "resend_password": "resend_password.jsp",
      "upload_avatar": "upload_avatar.jsp",
      "person": "person.jsp",
      "contribution": "contribution.jsp",
      "comment": "comment.jsp",
      "new_contribution": "new_contribution.jsp",
      "edit_contribution": "edit_contribution.jsp",
      "display_relations": "display_relations.jsp",
      "autocomplete_tags": "autocomplete_tags.jsp",
      "new_contribution_submit": "new_contribution_submit.jsp",
      "vote": "vote.jsp",
      "set_the_agenda": "accordion_3_body.jsp",
      "archive_and_follow_up": "accordion_1_body.jsp",
      "show_all_profiles": "show_all_profiles.jsp",
      "search": "search.jsp",
      "accordion_0_body": "accordion_0_body.jsp",
      "accordion_1_body": "accordion_1_body.jsp",
      "accordion_2_body": "accordion_2_body.jsp",
      "accordion_3_body": "accordion_3_body.jsp",
      "accordion_4_body": "accordion_4_body.jsp",
      "show_full_program": "full_program.jsp",
      "show_current_item": "current_item.jsp",
      "show_full_live_comments": "full_live_comments.jsp",
      "show_one_live_comment": "one_live_comment.jsp",
      "show_full_admin_messages": "full_admin_messages.jsp",
      "show_one_admin_message": "one_admin_message.jsp"
    },

    "images": {
      "back_button_4": "images/back_button_4.png",
      "fullscreen_button_4": "images/fullscreen_button_4.png",
      "back_button": "images/back_button.png",
      "fullscreen_button": "images/fullscreen_button.png"
    },
    "language": "en"
  }
  
  this.genericEventHandlers = {
    "moreorless": this.handleMoreOrLess,
    "close_link": this.handleClose,
    "more": this.handleMore,
		"profile": this.handleProfile,
		"liveevents": this.handleliveEvents,
    "accordion_link": this.handleAccordionLink,
    "category_link": this.handleCategoryLink,
    "edit": this.handleEdit,
    "vote_link": this.handleVote,
    "handle_link": this.handleLink,
    "overlay_link": this.handleDisplayOverlay,
    "overlay_close": this.handleCloseOverlay,
    "related_contributions": this.handleCreateRelation,
    "sort_by": this.handleSortBy,
    "tagsearch": this.handleTagSearch,
    "link_to_video_player": this.handleVideoInPlayer,
    "play_video": this.handlePlayVideo
  }
  this.specificEventHandlers = {
    "register_link": this.handleRegister,
    "lost_password_link": this.handleLostPassword,
    "register_submit": this.handleRegisterSubmit,
    "resend_password_submit": this.handleLostPasswordSubmit,
    "avatar_submit": this.handleAvatarSubmit,
    "login_submit": this.handleLoginSubmit,
    "show_relations": this.handleShowRelations,
    "comment_submit": this.handleCommentSubmit,
    "live_comment_submit": this.handleLiveCommentSubmit,
    "contribution_write": this.handleWriteContribution,
    "create_relations": this.handleCreateRelations,
    "new_contribution_submit": this.handleNewContributionSubmit,
    "preview_contribution_submit": this.handlePreviewContribution,
    "logout": this.handleLogout,
    "accordion_body_program_expand": this.handleShowProgram,
    "accordion_body_live_comments_expand": this.handleShowLiveComments,
    "show_all_live_comments": this.handleShowLiveComments,
    "accordion_body_admin_messages_expand": this.handleShowAdminMessages,
    "display_other_comments": this.HandleDisplayOtherComments
  }
  
  
this.defaultTranslations = {
    "nl": {
      "unknown_error": "er is een onbekend probleem, probeert u het nogmaals",
      "empty_field_error": "velden in 't rood mogen niet leeg zijn, probeert u het nogmaals",
      "password_not_equal_error": "wachtwoorden zijn niet gelijk, probeert u het nogmaals",
      "resend_email_empty": "u moet wel een emailadres opgeven",
      "empty_login": "velden in 't rood mogen niet leeg zijn, probeert u het nogmaals",
      "unknown_login_error": "er is een onbekend probleem, probeert u het nogmaals",
      "avatar_loading": "uploading...",
      "hide_relations": "verberg alle relaties",
      "show_relations": "toon alle relaties",
      "remove_link": "verwijder",
      "add_link": "voegtoe",
      "already_voted": "u mag maar 1x stemmen",
      "title_current_item": "huidig item",
      "title_full_program": "volledig programma",
      "link_current_item": "uitklappen voor programma ▼",
      "link_full_program": "ga naar huidig item ▲",
      "empty_current_item": "geen item",
      "empty_full_program": "programma niet beschikbaar",
      "error_current_item": "probleem bij opvragen huidig item",
      "error_full_program": "probleem bij opvragen programma",
      "link_one_live_comment": "meer ▼",
      "link_full_live_comments": "minder ▲",
      "empty_full_live_comments": "geen live comments",
      "empty_one_live_comment": "geen live commentaar beschikbaar",
      "error_full_live_comments": "probleem bij opvragen live commentaar",
      "error_one_live_comment": "probleem bij opvragen live commentaar",
      "link_one_admin_message": "meer ▼",
      "link_full_admin_messages": "minder ▲",
      "empty_full_admin_messages": "geen admin berichten",
      "empty_one_admin_message": "geen admin berichten",
      "error_full_admin_messages": "probleem bij opvragen admin berichten",
      "error_one_admin_message": "probleem bij opvragen admin berichten"
      
    },
    "en": {
      "unknown_error": "unknown error occured, please try again",
      "empty_field_error": "fields in red may not be empty, please try again",
      "password_not_equal_error": "password and confirm password are not the same, please try again",
      "resend_email_empty": "emailaddress is empty",
      "empty_login": "fields in red may not be empty, please try again",
      "unknown_login_error": "unknown error occured, please try again",
      "avatar_loading": "uploading...",
      "hide_relations": "hide all relations",
      "show_relations": "show all relations",
      "remove_link": "remove",
      "add_Link": "add",
      "already_voted": "you can only vote once",
      "title_current_item": "current item",
      "title_full_program": "full program",
      "link_current_item": "expand for full program ▼",
      "link_full_program": "go to current item ▲",
      "empty_current_item": "no item",
      "empty_full_program": "program not available",
      "error_current_item": "error requesting current item",
      "error_full_program": "error requesting full program",
      "link_one_live_comment": "more ▼",
      "link_full_live_comments": "less ▲",
      "empty_full_live_comments": "no live comments",
      "empty_one_live_comment": "no live comment",
      "error_full_live_comments": "problem requesting live comments",
      "error_one_live_comment": "problem requesting live comments",
      "link_one_admin_message": "more ▼",
      "link_full_admin_messages": "less ▲",
      "empty_full_admin_messages": "no admin messages",
      "empty_one_admin_message": "no admin message",
      "error_full_admin_messages": "error requesting admin messages",
      "error_one_admin_message": "error requesting admin message"
    }

  }
    
  this.roundedOptions = {
    tl: { radius: 10 },
    tr: { radius: 10 },
    bl: { radius: 10 },
    br: { radius: 10 },
    antiAlias: true,
    autoPad: true
  }
    
  if (config) {
    if (config.params) {
      this.params = config.params;
    } else {
      this.params = this.getDefaultConfiguration();
    }
    if (config.translations) {
      this.translations = config.translations;
    } else {
      this.translations = this.getDefaultTranslations();
    }
  } else {
    this.params = this.getDefaultConfiguration();
    this.translations = this.getDefaultTranslations();
  }
  if (id) {
    this.channelID = id;
  }
  this.init();
}

CMHTWidget.prototype.init = function() {
  this.history = [];
  this.getChannelConfiguration();
  this.loadTranslations();
  this.loadBrowserSpecificMethods();
  this.initWidgetEvents();
  //this.getTabInfo();
  //this.createAccordion();
}

CMHTWidget.prototype.getDefaultConfiguration = function() {
  return this.defaultConfig;
}

CMHTWidget.prototype.getDefaultTranslations = function() {
  return this.defaultTranslations;
}

CMHTWidget.prototype.getChannelConfiguration = function () {
  var url = this.composeAPIUrl("config");
  var thisWidget = this;
  new Ajax.Request(url, {
      method: "get",
      onSuccess: function(transport) {
        var response = transport.responseText || "";
        if (response != "") {
          try {
            var json = response.evalJSON();
          } catch (error) {
            var json ="";
          }
          if (json != "") {
            thisWidget.tabs = json.tabs;
            thisWidget.styleConfig = json.style;
            thisWidget.createAccordion();
          } else {
            //TODO: error?
          }
        } else {
          //TODO: error?
        }
      },
      onFailure: function(transport) {
        // TODO: catch error
      },
      onLoading: function() {
        //TODO: display loading?
      }
  });
}

CMHTWidget.prototype.loadTranslations = function() {
  if (this.translations[this.params.language]) {
    this.translation = this.translations[this.params.language];
  } else {
    this.translation = this.translations["en"];
  }
}

CMHTWidget.prototype.getMessage = function(key) {
  if (this.translation[key]) {
    return this.translation[key];
  } else if (this.translations["en"][key]) {
    return this.translations["en"][key]
  } else {
    return "missing_translation"
  }
}

CMHTWidget.prototype.getStyleParam = function(key) {
  if (this.styleConfig[key]) {
    return this.styleConfig[key];
  } else {
    //TODO log error
  }
}

CMHTWidget.prototype.loadBrowserSpecificMethods = function() {
  if (Prototype.Browser.Gecko) { 
    this.setTabText = this.setTabTextFF;
    this.activate = this.activateFF;
    this.addExtraElements = this.addExtraElementsEmpty;
    this.enableButtons = this.enableButtonsFF;
    this.disableButtons = this.disableButtonsFF;
  } else if (Prototype.Browser.IE) {
    this.setTabText = this.setTabTextIE;
    this.activate = this.activateIE;
    this.addExtraElements = this.addExtraElementsIE;
    this.enableButtons = this.enableButtonsIE;
    this.disableButtons = this.disableButtonsIE;
  } else if (Prototype.Browser.WebKit) {
    this.setTabText = this.setTabTextWebKit;
    this.activate = this.activateFF;
    this.addExtraElements = this.addExtraElementsEmpty;
    this.enableButtons = this.enableButtonsFF;
    this.disableButtons = this.disableButtonsFF;
  } else {
    this.setTabText = this.setTabTextDefault;
    this.activate = this.activateDefault;
    this.addExtraElements = this.addExtraElementsEmpty;
    this.enableButtons = this.enableButtonsFF;
    this.disableButtons = this.disableButtonsFF;
  }
}

CMHTWidget.prototype.getTabInfo = function() {
  this.params.numberOfTabs = 0;
  
  var self = this;
  for (tab in cmht.widget.tabs) {
    if (this.tabs[tab].open) {
      this.params.defaultOpenTab = tab;
    }
    this.params.numberOfTabs++;
  }
  
  this.params.tabWidth = 428 + ((5 -this.params.numberOfTabs) * 42);
}

CMHTWidget.prototype.createAccordion = function() {
  if (!this.params.defaultOpenTab || !this.params.numberOfTabs) this.getTabInfo();
  this.accordion = new Accordion("cmht_widget", {
      classNames : {
        toggle : ".horizontal_accordion_toggle",
        toggleActive : "horizontal_accordion_toggle_active",
        content : "horizontal_accordion_content"
      },
      defaultSize : {
        width : this.params.tabWidth
      },
      direction : "horizontal",
      defaultOpen: this.params.defaultOpenTab
  });
  
  for (tab in this.tabs) {
    this.setTabText(this.tabs[tab]);
  }

  var self = this;
  this.accordion.accordions.each(function(pair) {
    var accordion = pair.value;
    var tabIndex = pair.key;
    var tab = self.tabs[tabIndex];
    accordion.observe('click',self.activate.bindAsEventListener(self,accordion,tab,self));
    accordion.observe('cmht:update',self.activate.bindAsEventListener(self,accordion,tab,self));
  });

}

CMHTWidget.prototype.setTabTextFF = function(tab) {
  tab.canvas = Raphael(tab.id, 41, 414);
  if (tab.id == "accordion_"+this.accordion.options.defaultOpen) {
    topOpacity = "1";
    bottomOpacity = "0";
    this.updateAccordionBody("accordion_" + this.accordion.options.defaultOpen);
  } else {
    topOpacity = "0";
    bottomOpacity = "1";
  }
  var bottomAttr = {"font": '30px "arial", "helvetica", "sans-serif"',"font-weight": "bold", opacity: bottomOpacity};
  var topAttr = {"font": '30px "arial", "helvetica", "sans-serif"', "font-weight": "bold", opacity: topOpacity};
  tab.bottom = {};
  tab.top = {};
  tab.bottom.text = tab.canvas.text(0, 0, tab.title).attr(bottomAttr).attr("fill", this.getStyleParam("label_b_colour"));
  tab.top.text = tab.canvas.text(0, 0, tab.title).attr(topAttr).attr("fill", this.getStyleParam("label_a_colour"));
  var w = -1;
  var w = tab.bottom.text.getBBox().width;
  var dy = 414-(w/2);
  
  tab.bottom.text.translate(20,dy);
  tab.bottom.text.rotate(90);
  var dy = (20+w/2);
  tab.top.text.translate(20,dy);
  tab.top.text.rotate(90);
  if (tab.id == "accordion_4") {
    var backImage = this.params.images["back_button_4"];
    var fullscreenImage = this.params.images["fullscreen_button_4"];
  } else {
    var backImage = this.params.images["back_button"];
    var fullscreenImage = this.params.images["fullscreen_button"];
  }
  var top = tab.top.text.getBBox().width + 20;
  tab.back_button = tab.canvas.image(backImage, 0, top, 40, 20);
  tab.fullscreen_button = tab.canvas.image(fullscreenImage, 0, top+30, 40, 20);
  if (topOpacity == "1") {
    this.enableButtons(tab,this);
  } else {
    this.disableButtons(tab);
  }  
}

CMHTWidget.prototype.setTabTextIE = function(tab) {
  if (tab.id == "accordion_4") {
    var backImage = this.params.images["back_button_4"];
    var fullscreenImage = this.params.images["fullscreen_button_4"];
  } else {
    var backImage = this.params.images["back_button"];
    var fullscreenImage = this.params.images["fullscreen_button"];
  }
  tab.fullscreen_button = new Element("img", { "id": "fullscreen_button", "src": fullscreenImage, "style": "display: none"});
  tab.back_button = new Element("img", { "id": "back_button","src": backImage, "style": "display: none" });

 $(tab.id).update(tab.title);
  Element.insert($(tab.id), {bottom: tab.back_button});
  Element.insert($(tab.id), {bottom: tab.fullscreen_button});
  if (tab.id == "accordion_"+this.accordion.options.defaultOpen) {
    this.updateAccordionBody("accordion_" + this.accordion.options.defaultOpen);
    this.enableButtons(tab,this);
  }
}

CMHTWidget.prototype.setTabTextWebKit = function(tab) {
    tab.canvas = Raphael(tab.id, 41, 414);
    if (tab.id == "accordion_"+this.accordion.options.defaultOpen) {
      topOpacity = "1";
      bottomOpacity = "0";
      this.updateAccordionBody("accordion_" + this.accordion.options.defaultOpen);
    } else {
      topOpacity = "0";
      bottomOpacity = "1";
    }
    var bottomAttr = {"font": '30px "arial", "helvetica", "sans-serif"',"font-weight": "bold", opacity: bottomOpacity};
    var topAttr = {"font": '30px "arial", "helvetica", "sans-serif"', "font-weight": "bold", opacity: topOpacity};
    tab.bottom = {};
    tab.top = {};
    tab.bottom.text = tab.canvas.text(0, 0, tab.title).attr(bottomAttr).attr("fill", this.getStyleParam("label_b_colour"));
    tab.top.text = tab.canvas.text(0, 0, tab.title).attr(topAttr).attr("fill", this.getStyleParam("label_a_colour"));
    
    var thisWidget = this;
    this.webkitTimer = setTimeout(function() {thisWidget.setDelayedTabText(thisWidget,tab)},300);
  
}

CMHTWidget.prototype.setDelayedTabText = function (widget,tab) {
    var w = -1;
    var w = tab.bottom.text.getBBox().width;
    var dy = 414-(w/2);

    tab.bottom.text.translate(20,dy);
    tab.bottom.text.rotate(90);
    var dy = (20+w/2);
    tab.top.text.translate(20,dy);
    tab.top.text.rotate(90);  
    
    
    if (tab.id == "accordion_4") {
      var backImage = widget.params.images["back_button_4"];
      var fullscreenImage = widget.params.images["fullscreen_button_4"];
    } else {
      var backImage = widget.params.images["back_button"];
      var fullscreenImage = widget.params.images["fullscreen_button"];
    }
    var top = tab.top.text.getBBox().width + 20;
    tab.back_button = tab.canvas.image(backImage, 0, top, 40, 20);
    tab.fullscreen_button = tab.canvas.image(fullscreenImage, 0, top+30, 40, 20);
    if (tab.id == "accordion_"+widget.accordion.options.defaultOpen) {
      widget.enableButtons(tab,widget);
    } else {
      widget.disableButtons(tab);
    }
}

CMHTWidget.prototype.goBack = function() {
  if (this.history.length >= 2) {
    var thisAction = this.history.pop();
    var previousAction = this.history.pop();
    if (previousAction) {
      var bodyID = previousAction.id;
      var id = bodyID.substring(bodyID.indexOf("_")+1);
      if (thisAction.id == previousAction.id) {
        this.updateAccordionBody(previousAction.id,previousAction.key,previousAction.params);
      } else {
        this.accordion.accordions.get(id).fire('cmht:update',{loadOtherContent:true,bodyID:previousAction.id,key:previousAction.key,params:previousAction.params});
      }
    }
  }
}


CMHTWidget.prototype.updateAccordionBody = function(id, key, params) {
  var bodyID = id + "_body";
  //get previous body and remove the content
  //this is to make sure ids used on multiple pages aren't conflicting with eachother
  var historyID = this.history.length;
  if (historyID > 1) {
    var previousBodyID = this.history[this.history.length-1].id + "_body";
    if (previousBodyID != bodyID) {
      $(previousBodyID).update('');
    }
  }
  this.history.push({"id": id,"key":key,"params":params});
  var body = this.getAccordionBody(bodyID);
  if (!key) key = bodyID;
  if (key) {
    if (params) {
      var url = this.composeAPIUrl(key, params);
    } else {
      var url = this.composeAPIUrl(key);
    }  
  } 
  // make body empty otherwise event observers won't work
  //$(bodyID).update('');
  //console.log("body: " + $(bodyID).innerHTML);
  //var bl = console;
  var thisWidget = this;
  new Ajax.Updater(bodyID, url, { 
      method: 'get', 
      onComplete: function() {
        thisWidget.initAccordionBodyEvents(thisWidget,id);
        
          new Ajax.Autocompleter("tags", "autocomplete_choices", thisWidget.composeAPIUrl("autocomplete_tags"),{
              paramName: "searchtag",
              tokens:",",
              minChars: 2,
              indicator:"loading_message",
              afterUpdateElement: function(inputField,selectedTag) {
                $(inputField).value = $(inputField).value +",";
              }
            }
          );
        if (key == "contribution") {
          thisWidget.checkElementWidth()
        }
        
        if (bodyID == "accordion_2_body") {
          thisWidget.startPeriodicalUpdater("current_item");
          thisWidget.startPeriodicalUpdater("one_live_comment");
          thisWidget.startPeriodicalUpdater("one_admin_message");
          
        } else {
          thisWidget.shutdownPeriodicalUpdates(thisWidget);
        }
      }
  });
}

CMHTWidget.prototype.handleGenericEvents = function (event,element,id) {
  var classNames = $w(element.className);
  var thisWidget = this;
  classNames.each(function(className) {
    if (thisWidget.genericEventHandlers[className]) {
      thisWidget.genericEventHandlers[className](event,element,thisWidget);
      //Event.stop(event);
    }
  });
}

CMHTWidget.prototype.handleSpecificEvents = function (event,element,id) {
  var elementID = element.id;
  if (this.specificEventHandlers[elementID]) {
    this.specificEventHandlers[elementID](event,element,this);
    Event.stop(event);
  }
}

CMHTWidget.prototype.handleMoreOrLess = function(event,element) {
  var moreorless = element;
  if ($(moreorless).hasClassName("less")) {
    $(moreorless).update("more");
    if ($(moreorless).ancestors()[0].next(0).hasClassName("open")) {
      $(moreorless).ancestors()[0].next(0).toggleClassName("open");
      $(moreorless).ancestors()[0].next(0).toggleClassName("halfclosed");
    } else {
      $(moreorless).ancestors()[0].next(0).hide("div.closed");
    }           
    $(moreorless).toggleClassName("less");
  } else {  
    if ($(moreorless).ancestors()[0].next(0).hasClassName("halfclosed")) {
      $(moreorless).ancestors()[0].next(0).toggleClassName("halfclosed");
      $(moreorless).ancestors()[0].next(0).toggleClassName("open");
    } else {
      $(moreorless).ancestors()[0].next(0).show("div.closed");
    }
    $(moreorless).update("less");
    $(moreorless).toggleClassName("less");
  }
}


CMHTWidget.prototype.HandleDisplayOtherComments = function(event,element,widget) {
  if($("other_live_comments").hasClassName("open")) {
    $("other_live_comments").hide();
  } else {
    $("other_live_comments").show();
  }
  $("other_live_comments").toggleClassName("open");
}

CMHTWidget.prototype.handleMore = function(event,element,widget) {
  var id = element.id;
  if (!id) {
    var id = element.up().id;
  }
  var bodyElement = element.up(".horizontal_accordion_content");
  if (!bodyElement) {
    var bodyElement = element.up("#cmht_widget");
  }
  if (id && bodyElement.id) {
    var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
    var params = $H();
    if (id == "show_all_profiles") {
      var valueID = "a";
      var key = "search";
      params.set(key,valueID);
      key = id;
    } else if (id.startsWith("show_all_profiles")) {
      var seperatorIndex = id.lastIndexOf("_");
      var valueID = id.substring(seperatorIndex+1);
      var id = id.substring(0,seperatorIndex);
      var key = "search";
      params.set(key,valueID);
      key = id;
    } else {
      var seperatorIndex = id.indexOf("_");
      var key = id.substring(0,seperatorIndex);
      var valueID = id.substring(seperatorIndex+1);
      params.set(key,valueID);
    }
    
    if (key == "contribution" && bodyElement.id != "accordion_3_body") {
      var bodyID = "accordion_3";
      widget.accordion.accordions.get("3").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,key:key,params:params});
    }  else {
      widget.updateAccordionBody(bodyID,key,params);
    }
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleProfile = function(event,element,widget) {
  var id = element.id;
  var bodyElement = element.up("#cmht_widget");
  if (id && bodyElement.id) {
    var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
    var params = $H();
    var seperatorIndex = id.indexOf("_");
    var key = id.substring(0,seperatorIndex);
    var valueID = id.substring(seperatorIndex+1);
    params.set(key,valueID);
		if (key == "person" && bodyElement.id != "accordion_0_body") {
      var bodyID = "accordion_0";
      if (widget.history[widget.history.length-1].id != bodyID) {
        widget.accordion.accordions.get("0").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,key:key,params:params});
      } else {
        widget.updateAccordionBody(bodyID,key,params);
      }
    }
	}
}

CMHTWidget.prototype.handleliveEvents = function(event,element,widget) {
  var id = element.id;
	var bodyID = "accordion_1";
	var params = $H();
	params.set("archive_eventid",id);
	widget.updateAccordionBody(bodyID,null,params);
}

CMHTWidget.prototype.handleCategoryLink = function(event,element,widget) {
  var id = element.id;
  if (!id) {
    var classNames = $w(element.className)
    classNames.each(function(className) {
      if (className.startsWith("cat_")) {
        var seperatorIndex = className.indexOf("_");
        id = className.substring(seperatorIndex+1);
      }
    })
    var bodyID = "accordion_3";
    var params = $H();
    params.set("cat",id);
    if (widget.history[widget.history.length-1].id != bodyID) {
      widget.accordion.accordions.get("3").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,key:null,params:params});
    } else {
      widget.updateAccordionBody(bodyID,null,params);
    }
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleAccordionLink = function(event,element,widget) {
  if (element.hasClassName("tune_in")) {
    var bodyID = "accordion_4";
    var accordionID = 4;
  } else if (element.hasClassName("set_the_agenda")) {
    var bodyID = "accordion_3";
    var accordionID = 3;
  } else if (element.hasClassName("join_live")) {
    var bodyID = "accordion_2";
    var accordionID = 2;
  } else if (element.hasClassName("archive_and_follow_up")) {
    var bodyID = "accordion_1";
    var accordionID = 1;
  } else if (element.hasClassName("community")) {
    var bodyID = "accordion_0";
    var accordionID = 0;
  }
  if (bodyID) {
    if (widget.history[widget.history.length-1].id != bodyID) {
      widget.accordion.accordions.get(accordionID).fire('cmht:update',{loadOtherContent:true,bodyID:bodyID});
    } else {
      widget.updateAccordionBody(bodyID);
    }
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleSearch = function(search,searchType,widget) {
  var key = "search";
  var bodyID = "accordion_4";
  var params = $H();
  params.set("searchtype",searchType);
  params.set("searchvalue",search);
  params.set("action","search");
  if (widget.history[widget.history.length-1].id != bodyID) {
    widget.accordion.accordions.get("4").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,params:params});
  } else {
    widget.updateAccordionBody(bodyID,null,params);
  }
}

CMHTWidget.prototype.handleTagSearch = function(event,element,widget) {
  var search = element.innerHTML;
  var searchType = "tag";
  widget.handleSearch(search,searchType,widget);
}

CMHTWidget.prototype.handleEdit = function(event,element,widget) {
  var id = element.id;
  var bodyElement = element.up(".horizontal_accordion_content");
  if (id && bodyElement.id) {
    var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
    var seperatorIndex = id.lastIndexOf("_");
    var key = id.substring(0,seperatorIndex);
    var valueID = id.substring(seperatorIndex+1);
    var params = $H();
    params.set(key,valueID);
    if (key == "contribution" && bodyElement.id != "accordion_3_body") {
			$('new_contribution_form').reset();
      var bodyID = "accordion_3";
      widget.accordion.accordions.get("3").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,key:key,params:params});
    } else if (key == "person"){
      params.set("action","edit");
      var bodyID = "accordion_4";
      widget.accordion.accordions.get("4").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID,params:params});
    } else {
      widget.updateAccordionBody(bodyID,key,params);
    }
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleVote = function(event,element,widget) {
  var id = element.id;
  if (!element.hasClassName("voted")) {
    var bodyElement = element.up(".horizontal_accordion_content");
    if (id && bodyElement.id) {
      var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
      var seperatorIndex = id.indexOf("_");
      var key1 = "action";
      var valueID1 = id.substring(0,seperatorIndex);
      
      var key2 = "objectid";
      var valueID2 = id.substring(seperatorIndex+1);
      $$("#" + bodyElement.id + " #plus_" + valueID2)[0].addClassName("voted");
      $$("#" + bodyElement.id + " #min_" + valueID2)[0].addClassName("voted");
      var params = $H();
      params.set(key1,valueID1);
      params.set(key2,valueID2);
      new Ajax.Request(widget.composeAPIUrl("vote"), {
          method: "post",
          parameters: params,
          onSuccess: function(transport) {
            var response = transport.responseText || "";
            if (response != "") {
              try {
                var json = response.evalJSON();
              } catch (error) {
                var json ="";
              }
              if (json != "") {
                if (json.status == "ok") {
                  if (json.message) {
                    element.next(".vote_counter").update(json.message);
                  } 
                } else {
                  //TODO: error?
                }
              }
            } else {
              //TODO: error?
            }
          },
          onFailure: function(transport) {
            var response = transport.responseText || "";
            if (response != "") {
              try {
                var json = response.evalJSON();
              } catch (error) {
                var json ="";
              }
              if (json != "") {
                if (json.status == "error") {
                  if (json.message) {
                    alert(json.message);
                  } else {
                    $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
                  }
                } else {
                  $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
                  $("cmht_message").show();
                  $("login_form").enable();
                }  
              } else {
                $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
                $("cmht_message").show();
                $("login_form").enable();
              }
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
              $("cmht_message").show();
              $("login_form").enable();
            }
          },
          onLoading: function() {
            //TODO: display loading?
          }
        });
    
    } else {
      //TODO: display error?
    }
  } else {
    // do nothing
  }
}


CMHTWidget.prototype.handleClose = function(event,element) {
  if (element.up("div",1).hasClassName("content")) {
    element.up("div",2).hide();
  } else {
    element.up("div",1).hide();
  }
}

CMHTWidget.prototype.handleWriteContribution = function(event,element,widget) {
  var id = element.id;
  var bodyElement = element.up(".horizontal_accordion_content");
  if (id && bodyElement.id) {
    var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
    var seperatorIndex = id.indexOf("_");
    var key = "new_contribution";
    var type = element.previous("#type").value;
    var params = $H();
    params.set("type",type);
    widget.updateAccordionBody(bodyID,key,params);
    
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleCloseOverlay = function(event,element) {
  element.up("div").toggleClassName("open");
  element.up("div").hide();
}

CMHTWidget.prototype.handleDisplayOverlay = function(event,element,widget) {
  var overlayID = "overlay_" + element.id;
  var overlay = $(overlayID);
  if (overlay.hasClassName("open")) {
    overlay.toggleClassName("open");
    overlay.hide();
  } else {
    overlay.toggleClassName("open");
    overlay.show();
  }
}

CMHTWidget.prototype.handlePreviewContribution = function(event,element,widget) {
  var overlayID = "overlay_" + element.id;
  var overlay = $(overlayID);
  if (overlay.hasClassName("open")) {
    overlay.toggleClassName("open");
    overlay.hide();
  } else {
    overlay.toggleClassName("open");
    $("preview").update($("text").value);
    widget.checkElementWidth();
    overlay.show();
  }
}

CMHTWidget.prototype.handleRegister = function(event,element) {
  var registerLink = $("register_link");
  var lostPasswordLink = $("lost_password_link");
  if (registerLink.hasClassName("open")) { 
    registerLink.toggleClassName("open");
    $("register_form").hide();
  } else {
    registerLink.toggleClassName("open");
    $("register_form").show();
    var lostPasswordLink = $("lost_password_link");
    if (lostPasswordLink.hasClassName("open")) { 
      lostPasswordLink.toggleClassName("open");
      $("lost_password_form").hide();
    }
  }
}

CMHTWidget.prototype.handleLostPassword = function(event,element) {
  var registerLink = $("register_link");
  var lostPasswordLink = $("lost_password_link");
  if (lostPasswordLink.hasClassName("open")) { 
    lostPasswordLink.toggleClassName("open");
    $("lost_password_form").hide();
  } else {
    lostPasswordLink.toggleClassName("open");
    $("lost_password_form").show();
    var registerLink = $("register_link");
    if (registerLink.hasClassName("open")) { 
      registerLink.toggleClassName("open");
      $("register_form").hide();
    }
  } 
}

CMHTWidget.prototype.handleShowRelations = function(event,element,widget) {
  var contributions = $("relations_body");
  if (contributions.hasClassName("open")) { 
    contributions.toggleClassName("open");
    element.update(widget.getMessage("show_relations"));
    $(contributions).hide();
  } else {
    contributions.toggleClassName("open");
    element.update(widget.getMessage("hide_relations"));
    $(contributions).show();
  }
}

CMHTWidget.prototype.handleLostPasswordSubmit = function(event,element,widget) {
  if (widget.resendPasswordIsValid(widget)) {
    widget.submitResendPassword(event,widget);
  }
}

CMHTWidget.prototype.handleRegisterSubmit = function(event,element,widget) {
  if (widget.registrationIsValid(widget)) {
    widget.submitRegistration(event,widget);
  }
}

CMHTWidget.prototype.handleAvatarSubmit = function(event,element,widget) {
  widget.fileUpload(widget,"avatar_upload_form",widget.composeAPIUrl("upload_avatar"),"avatar_message",widget.getMessage("avatar_loading"));
}

CMHTWidget.prototype.handleLoginSubmit = function(event,element,widget) {
  var registerLink = $("register_link");
  var lostPasswordLink = $("lost_password_link");
  var loginSubmit = $("login_submit");
  if (registerLink.hasClassName("open")) {
    registerLink.toggleClassName("open");
    $("register_form").hide();
  }
  if (lostPasswordLink.hasClassName("open")) { 
    lostPasswordLink.toggleClassName("open");
    $("lost_password_form").hide();
  }
  if (widget.loginIsValid(widget)) {
    widget.submitLogin(event,widget);
  }
}

CMHTWidget.prototype.handleCommentSubmit = function(event,element,widget) {
  if (widget.commentIsValid(widget)) {
    widget.submitComment(event,widget);
  }
}

CMHTWidget.prototype.handleLiveCommentSubmit = function(event,element,widget) {
  if (widget.commentIsValid(widget)) {
    var live = true;
    widget.submitComment(event,widget,live);
  }
}

CMHTWidget.prototype.handleLink = function(event,element,widget) {
  if (element.hasClassName("remove")) {
    element.up("fieldset.link").remove();
  } else {
    element.addClassName("remove");
    element.update(widget.getMessage("remove_link"));
    var links = $$("fieldset.link");
    var i = parseInt($("link_counter").value);
    var next = i;
    $("link_counter").value = i + 1;
    var lastLink = links[links.length -1];
    //$("create_comment_form").up("#comment_form").insert({before:json.html});
    var html = "<fieldset id=\"link_" + next +"\" class=\"link\">" +
               "<label for=\"link_title_" + next + "\">title</label><input id=\"link_title_" + next +"\" name=\"link_title_" + next +"\" type=\"text\"/>" +
               "<label for=\"link_url_" + next + "\">url</label><input id=\"link_url_" + next + "\" name=\"link_url_" + next +"\" type=\"text\"/>" + 
               "<span class=\"handle_link\">" + widget.getMessage("add_link") + "</span>" +
               "</fieldset>";
    lastLink.insert({after:html});
  }
}

CMHTWidget.prototype.handleCreateRelations = function(event,element,widget) {
  var displayRelations = $("display_relations");
  if (displayRelations.hasClassName("open")) {
    displayRelations.toggleClassName("open");
    displayRelations.hide();
  } else {
    displayRelations.toggleClassName("open");
    displayRelations.show();
    if ($("contributionid")) {
      var params = $H();
      var key = "contributionid";
      var value = $("contributionid").value;
      params.set(key,value);
    }
    if (params) {
      var url = widget.composeAPIUrl("display_relations",params);
    } else {
      var url = widget.composeAPIUrl("display_relations");
    }
    new Ajax.Updater(displayRelations, url, { 
        method: 'get', 
        onComplete: function() {
          widget.initRelatedContributions(widget);
        }
    });
  }
}

CMHTWidget.prototype.initRelatedContributions = function(widget) {
  if (widget.relatedContribs) {
    if (widget.relatedContribs.values().length > 0) {
      
      $$(".related_contributions").each(function(rel) {
       rel.checked = false;
      });
    } 
    widget.relatedContribs.each(function(rel) {
      if ($("contrib_" + rel.key)) {
        $("contrib_" + rel.key).checked = true;
      }
    });
  } else {
    //TODO: 
  }
}

CMHTWidget.prototype.handleCreateRelation = function(event,element,widget) {
  if (!widget.relatedContribs) {
    widget.relatedContribs = $H();
  }
  if (element.checked) {
    if (!widget.relatedContribs.get(element.value)) {
      widget.relatedContribs.set(element.value,true);
    }
  } else {
    if(widget.relatedContribs.get(element.value)) {
      widget.relatedContribs.unset(element.value)
    }
  }
}

CMHTWidget.prototype.handleNewContributionSubmit = function(event,element,widget) {
  if (widget.newContributionIsValid(widget)) {
    widget.submitNewContribution(event,widget);
  }
}

CMHTWidget.prototype.handleSortBy = function(event,element,widget) {
  var id = element.id;
  var bodyElement = element.up(".horizontal_accordion_content");
  if (id && bodyElement.id) {
    var bodyID = bodyElement.id.substring(0,bodyElement.id.lastIndexOf("_"));
    var seperatorIndex = id.indexOf("_");
    var params = $H();
      var catID = id.substring(0,seperatorIndex);
      var typID = id.substring(seperatorIndex+1);
      params.set("cat",catID);
      params.set("type",typID);
    if (bodyID == "accordion_3") {
      widget.updateAccordionBody(bodyID,"set_the_agenda",params);
    } else if (bodyID == "accordion_1") {
      widget.updateAccordionBody(bodyID,"archive_and_follow_up",params);  
    }
  } else {
    //TODO: display error?
  }
}

CMHTWidget.prototype.handleShowProgram = function(event,element,widget) {
  var programElement = $("accordion_body_program_body");
  if (programElement.hasClassName("expanded")) {
    $("accordion_body_program_title").update(widget.getMessage("title_current_item"));
    $("accordion_body_program_expand").update(widget.getMessage("link_current_item"));
    widget.toggleFullProgram($("current_item_container"),widget,false);
  } else {
    $("accordion_body_program_title").update(widget.getMessage("title_full_program"));
    $("accordion_body_program_expand").update(widget.getMessage("link_full_program"));
    widget.toggleFullProgram($("full_program_container"),widget,true);
  }
  programElement.toggleClassName("expanded");
}

CMHTWidget.prototype.toggleFullProgram = function (element,widget,displayFullProgram) {
  if (displayFullProgram) {
    var url = widget.composeAPIUrl("show_full_program");
    var error = "full_program";
  } else {
    var url = widget.composeAPIUrl("show_current_item");
    var error = "current_item";
  }
  new Ajax.Request(url, {
    method: "get",
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        element.update(response);
      } else {
        element.update(widget.getMessage("empty_" + error));  
      }
      if (displayFullProgram) {
        $("current_item_container").hide();
        $("full_program_container").show();
        setTimeout(function() {widget.startPeriodicalUpdater("full_program")},3000);
        widget.stopPeriodicalUpdater("current_item");
        widget.initHoverEffects(element,widget);
      } else {
        $("full_program_container").hide();
        $("current_item_container").show();
        setTimeout(function() {widget.startPeriodicalUpdater("current_item")},3000);
        widget.stopPeriodicalUpdater("full_program");
      }
    },
    onFailure: function(transport) {
      element.update(widget.getMessage("error_" + error));
    },
    onLoading: function() {
      //TODO: display loading message
    }
  });
}

CMHTWidget.prototype.initHoverEffectsoud = function (element,widget) { 
  var hoverElements = element.select(".full_program_contribution_title");
  if (hoverElements.length > 0) {
    if (!widget.hoverElements) {
      widget.hoverElements = hoverElements;
    } else {
      widget.hoverElements.each(function(element) {
        element.stopObserving("mouseover");
      });
      widget.hoverElements = hoverElements;
    }
    widget.hoverElements.each(function(elem) {
      elem.observe("mouseover", function(event) {
        $(Event.element(event)).down(".read").show();
      });
      elem.observe("mouseout", function(event) {
        $(Event.element(event)).down(".read").hide();
      });
    });
  } 
}

CMHTWidget.prototype.initHoverEffects = function (element,widget) { 
  var hoverElements = element.select(".full_program_contribution_title");
  if (hoverElements.length > 0) {
    hoverElements.each(function(elem) {
      elem.observe("mouseover", function(event) {
        $(Event.element(event)).down(".read").show();
      });
      elem.observe("mouseout", function(event) {
        $(Event.element(event)).down(".read").hide();
      });
    });
  }
}

CMHTWidget.prototype.handleShowLiveComments = function(event,element,widget) {
  var commentsElement = $("accordion_body_live_comments_body");
  if (commentsElement.hasClassName("expanded")) {
    $("accordion_body_live_comments_expand").update(widget.getMessage("link_one_live_comment"));
    $("one_live_comment_container").show();
    $("full_live_comments_container").hide();
    widget.toggleFullComments($("one_live_comment_container"),widget,false);
  } else {
    $("accordion_body_live_comments_expand").update(widget.getMessage("link_full_live_comments"));
    $("one_live_comment_container").hide();
    $("full_live_comments_container").show();
    widget.toggleFullComments($("full_live_comments_container"),widget,true);
  }
  commentsElement.toggleClassName("expanded");
}

CMHTWidget.prototype.toggleFullComments = function (element,widget,displayFullComments) {
  if (displayFullComments) {
    var url = widget.composeAPIUrl("show_full_live_comments");
    var error = "full_live_comments";
  } else {
    var url = widget.composeAPIUrl("show_one_live_comment");
    var error = "one_live_comment";
  }
  new Ajax.Request(url, {
    method: "get",
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        element.update(response);
      } else {
        element.update(widget.getMessage("empty_" + error));  
      }
      if (displayFullComments) {
        //$("one_live_comment_container").hide();
        //$("full_live_comments_container").show();
        setTimeout(function() {widget.startPeriodicalUpdater("full_live_comments")},3000);
        widget.stopPeriodicalUpdater("one_live_comment");
      } else {        
        //$("full_live_comments_container").hide();
        //$("one_live_comment_container").show();
        widget.stopPeriodicalUpdater("full_live_comments");
        setTimeout(function() {widget.startPeriodicalUpdater("one_live_comment")},3000);
      }
    },
    onFailure: function(transport) {
      element.update(widget.getMessage("error_" + error));
    },
    onLoading: function() {
      //TODO: display loading message
    }
  });
}

CMHTWidget.prototype.handleShowAdminMessages = function(event,element,widget) {
  var adminElement = $("accordion_body_admin_messages_body");
  if (adminElement.hasClassName("expanded")) {
    $("accordion_body_admin_messages_expand").update(widget.getMessage("link_one_admin_message"));
    widget.toggleFullAdminMessages($("one_admin_message_container"),widget,false);
  } else {
    $("accordion_body_admin_messages_expand").update(widget.getMessage("link_full_admin_messages"));
    widget.toggleFullAdminMessages($("full_admin_messages_container"),widget,true);
  }
  adminElement.toggleClassName("expanded");
}

CMHTWidget.prototype.toggleFullAdminMessages = function (element,widget,displayFullMessages) {
  if (displayFullMessages) {
    var url = widget.composeAPIUrl("show_full_admin_messages");
    var error = "full_admin_messages";
  } else {
    var url = widget.composeAPIUrl("show_one_admin_message");
    var error = "one_admin_message";
  }
  new Ajax.Request(url, {
    method: "get",
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        element.update(response);
      } else {
        element.update(widget.getMessage("empty_" + error));  
      }
      if (displayFullMessages) {
        $("one_admin_message_container").hide();
        $("full_admin_messages_container").show();
        setTimeout(function() {widget.startPeriodicalUpdater("full_admin_messages")},3000);
        widget.stopPeriodicalUpdater("one_admin_message");
      } else {
        $("full_admin_messages_container").hide();
        $("one_admin_message_container").show();
        widget.stopPeriodicalUpdater("full_admin_messages");
        setTimeout(function() {widget.startPeriodicalUpdater("one_admin_message")},3000);
      }
    },
    onFailure: function(transport) {
      element.update(widget.getMessage("error_" + error));
    },
    onLoading: function() {
      //TODO: display loading message
    }
  });
}

CMHTWidget.prototype.startPeriodicalUpdater = function(id) {
  var widget = this;
  if (!widget.updaters) {
    widget.updaters = $H();
  }
  var updater = widget.updaters.get(id);
  if (updater) {
    updater.start();
  } else {
    if (id == "full_program") {
      widget.updaters.set(id, new Ajax.PeriodicalUpdater(id + "_container", widget.composeAPIUrl("show_" + id), {
        method: 'get', 
        onSuccess: function(transport) {
          widget.initHoverEffects.defer($(id + "_container"),widget);
        },
        frequency: 3, decay: 2
      }));
    } else {
      widget.updaters.set(id, new Ajax.PeriodicalUpdater(id + "_container", widget.composeAPIUrl("show_" + id), {
        method: 'get', frequency: 3, decay: 2
      }));
    }
  } 
}

CMHTWidget.prototype.stopPeriodicalUpdater = function(id) {
  if (this.updaters) {
    var updater = this.updaters.get(id);
    if (updater) {
      updater.stop();
    }
  }
}

CMHTWidget.prototype.shutdownPeriodicalUpdates = function(widget) {
  if (widget.updaters) {
    widget.updaters.each(function(updater) {
      updater.value.stop();
    });
    widget.updaters = null;
  }
}

CMHTWidget.prototype.initWidgetEvents = function(widget) {
  if (!widget) {
    var widget = this;
  }
  if ($("cmht_widget_header")) {
    $("cmht_widget_header").stopObserving("click");
    $("cmht_widget_header").observe("click", function(event) {
      var element = Event.element(event);
      widget.handleGenericEvents(event,element);
      widget.handleSpecificEvents(event,element);
    });
    $("searchterm").observe("keypress", function(event) {
      if (event.keyCode == Event.KEY_RETURN) {
        var search = $F(Event.element(event));
        if (search && (search!= "")) {
          widget.handleSearch(search,"keyword",widget);
        }
      }
    });
  } else {
    setTimeout(function() {widget.initWidgetEvents(widget)},100);
  }
}

CMHTWidget.prototype.initAccordionBodyEvents = function(thisWidget,id) {
  if ($(id+"_body")) {
    $(id + "_body").stopObserving("click");
    $(id + "_body").observe("click", function(event) {
      var element = Event.element(event);
      thisWidget.handleGenericEvents(event,element,id);
      thisWidget.handleSpecificEvents(event,element,id);
    });
    thisWidget.addExtraElements();
    if (id=="accordion_4") {
      $("password").observe("keypress", function(event) {
        if (event.keyCode == Event.KEY_RETURN) {
          thisWidget.handleLoginSubmit(event,Event.element(event),thisWidget);
        }
      });
    }
  } else {
    setTimeout(function() {thisWidget.initAccordionBodyEvents(thisWidget,id)},100) 
  }
}

CMHTWidget.prototype.registrationIsValid = function(widget) {
  var error = false;
  widget.error_message = "";
  if (widget.errors) {
    widget.errors.each(function(errorField) {
      $(errorField).removeClassName("error");
      $(errorField).previous("label").removeClassName("error");
    });
  }
  widget.errors = [];
  $("cmht_message_body").update("");
  if ($("newusername").value == "") {
    var error = true;
    widget.errors.push("newusername");
  }
  if ($("newpassword").value == "") {
    var error = true;
    widget.errors.push("newpassword");
  } else if ($("newpassword").value != $("passwordconfirm").value) {
    var error = true;
    widget.errors.push("passwordconfirm");
  }
  if (error) {
    widget.errors.each(function(errorField) {
      $(errorField).addClassName("error");
      $(errorField).previous("label").addClassName("error");
      if ((errorField == "newusername") || (errorField=="newpassword")) {
        widget.error_message = widget.getMessage("empty_field_error");
      } else if (errorField == "passwordconfirm") {
        widget.error_message = widget.getMessage("password_not_equal_error");
      } else {
        widget.error_message = widget.getMessage("unknown_error");
      }
    });
    $("cmht_message_body").update(widget.error_message);
    $("cmht_message").show();
    return false;
  } else {
    return true;
  }
}

CMHTWidget.prototype.resendPasswordIsValid = function(widget) {
  var error = false;
  $("cmht_message_body").update("");
  if ($("resend_email").value == "") {
    var error = true;
  }
  if (error) {
    $("cmht_message_body").update(widget.getMessage("resend_email_empty"));
    $("cmht_message").show();
    return false;
  } else {
    return true;
  }
}

CMHTWidget.prototype.newContributionIsValid = function(widget) {
  if (widget.errors) {

    widget.errors.each(function(errorField) {
      $(errorField).removeClassName("error");
      $(errorField).previous("label").removeClassName("error");
    });
  }
  widget.errors = [];
  var error = false;
  $("cmht_message_body").update("");
  if ($("title").value == "") {
    var error = true;
    widget.errors.push("title");
  }
  if ($("nickname")) {
    if ($("nickname").value == "") {
      var error = true;
      widget.errors.push("nickname");
    }
  }
  if (error) {
    widget.errors.each(function(errorField) {
      $(errorField).addClassName("error");
      $(errorField).previous("label").addClassName("error");
    });
    $("cmht_message_body").update(widget.getMessage("empty_login"));
    $("cmht_message").show();
    return false;
  } else {
    return true;
  }
}

CMHTWidget.prototype.loginIsValid = function(widget) {
  if (widget.errors) {
    widget.errors.each(function(errorField) {
      $(errorField).removeClassName("error");
      $(errorField).previous("label").removeClassName("error");
    });
  }
  widget.errors = [];
  var error = false;
  $("cmht_message_body").update("");
  if ($("username").value == "") {
    var error = true;
    widget.errors.push("username");
  }
  if ($("password").value == "") {
    var error = true;
    widget.errors.push("password");
  }
  if (error) {
    widget.errors.each(function(errorField) {
      $(errorField).addClassName("error");
      $(errorField).previous("label").addClassName("error");
    });
    $("cmht_message_body").update(widget.getMessage("empty_login"));
    $("cmht_message").show();
    return false;
  } else {
    return true;
  }
}

CMHTWidget.prototype.commentIsValid = function(widget) {
  if (widget.errors) {
    widget.errors.each(function(errorField) {
      if ($(errorField)) {
        $(errorField).removeClassName("error");
        if ($(errorField).previous("label")) {
          $(errorField).previous("label").removeClassName("error");
        }
      }
    });
  }
  widget.errors = [];
  var error = false;
  //$("cmht_message_body").update("");
  if ($("text").value == "") {
    var error = true;
    widget.errors.push("text");
  }
  if ($("nickname")) {
    if ($("nickname").value == "") {
      var error = true;
      widget.errors.push("nickname");
    }
  }
  if (error) {
    widget.errors.each(function(errorField) {
      $(errorField).addClassName("error");
      if ($(errorField).previous("label")) {
        $(errorField).previous("label").addClassName("error");
      }
    });
    //$("cmht_message_body").update(widget.getMessage("empty_comment"));
    //$("cmht_message_body").show();
    return false;
  } else {
    return true;
  }
}
  



CMHTWidget.prototype.submitRegistration = function(event,widget) {
  new Ajax.Request(widget.composeAPIUrl("register"), {
    method: "get",
    parameters: $("registration_form").serialize(true),
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
              $("cmht_message").show();
            } 
            $("register_link").toggleClassName("open");
            $("register_form").hide();



						$("login_form").username.value=$("registration_form").username.value;
						$("login_form").password.value=$("registration_form").newpassword.value;
						widget.submitLogin(event,widget);




          } else {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_error"));
            }
            $("cmht_message").show();
            $("registration_form").enable();
          }
        } else {
          $("cmht_message_body").update(widget.getMessage("unknown_error"));
          $("cmht_message").show();
          $("registration_form").enable();  
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_error"));
        $("cmht_message").show();
        $("registration_form").enable();
      }
    },
    onFailure: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "error") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_error"));
            }
            $("cmht_message").show();
            $("registration_form").enable();
          } else {
            $("cmht_message_body").update(widget.getMessage("unknown_error"));
            $("cmht_message").show();
            $("registration_form").enable();
          }  
        } else {
          $("cmht_message_body").update(widget.getMessage("unknown_error"));
          $("cmht_message").show();
          $("registration_form").enable();
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_error"));
        $("cmht_message").show();
        $("registration_form").enable();
      }
      
    },      
    onLoading: function() {
      $("cmht_message").hide();
      $("registration_form").disable();
    },
    onComplete: function() {
      $("registration_form").enable();
    }
  });
  
}

CMHTWidget.prototype.submitResendPassword = function(event,widget) {
  new Ajax.Request(widget.composeAPIUrl("resend_password"), {
    method: "post",
    parameters: $("resend_password_form").serialize(true),
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
              $("cmht_message").show();
            } 
            $("lost_password_link").toggleClassName("open");
            $("lost_password_form").hide();
          } else {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_error"));
            }
            $("cmht_message").show();
            $("lost_password_form").enable();
          }
        } else {
          $("cmht_message_body").update(widget.getMessage("unknown_error"));
          $("cmht_message").show();
          $("lost_password_form").enable();  
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_error"));
        $("cmht_message").show();
        $("lost_password_form").enable();
      }
    },
    onFailure: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "error") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_error"));
            }
            $("cmht_message").show();
            $("lost_password_form").enable();
          } else {
            $("cmht_message_body").update(widget.getMessage("unknown_error"));
            $("cmht_message").show();
            $("lost_password_form").enable();
          }  
        } else {
          $("cmht_message_body").update(widget.getMessage("unknown_error"));
          $("cmht_message").show();
          $("lost_password_form").enable();
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_error"));
        $("cmht_message").show();
        $("lost_password_form").enable();
      }
      
    },
    onLoading: function() {
      $("cmht_message").hide();
      $("resend_password_form").disable();
    },
    onComplete: function() {
      $("resend_password_form").enable();
    }
  });
  
}

CMHTWidget.prototype.submitLogin = function(event,widget) {
  new Ajax.Request(widget.composeAPIUrl("login"), {
    method: "post",
    parameters: $("login_form").serialize(true),
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
              $("cmht_message").show();
            } 
            $("accordion_body_login").hide();
            widget.userID = json.userid;
            $("user_name").update(json.username);
						$("logout").update("<div id=\"logout\">logout</div>");
						var profilediv="<span id=\"person_" + json.userid + "\" class=\"profile\">profile</span>";						
						$("profile").update(profilediv);  
						widget.goBack();          
          } else {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
            }
            $("cmht_message").show();
            $("login_form").enable();
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
        $("cmht_message").show();
        $("login_form").enable();  
      }
    } else {
      $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
      $("cmht_message").show();
      $("login_form").enable();
      }
    },
    onFailure: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "error") {
            if (json.message) {
              $("cmht_message_body").update(json.message);
            } else {
              $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
            }
            $("cmht_message").show();
            $("login_form").enable();
          } else {
            $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
            $("cmht_message").show();
            $("login_form").enable();
          }  
        } else {
          $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
          $("cmht_message").show();
          $("login_form").enable();
        }
      } else {
        $("cmht_message_body").update(widget.getMessage("unknown_login_error"));
        $("cmht_message").show();
        $("login_form").enable();
      }
    },
    onLoading: function() {
      $("cmht_message").hide();
      $("login_form").disable();
    },
    onComplete: function() {
      $("login_form").enable();
    }
  });
}

CMHTWidget.prototype.handleLogout = function(event,element,widget) {
  var params = $H();
  params.set("userid",widget.userID);
  new Ajax.Request(widget.composeAPIUrl("logout"), {
    method: "post",
    parameters: params,
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            widget.userID = null;
            $("user_name").update("");
						$("profile").update("");
            $("logout").update("<span class=\"accordion_link tune_in\">please login</span>");
            var bodyID = "accordion_4";
            if (widget.history[widget.history.length-1].id != bodyID) {
              widget.accordion.accordions.get("4").fire('cmht:update',{loadOtherContent:true,bodyID:bodyID});
            } else {
              widget.updateAccordionBody(bodyID);
            }          
          } else {
            //TODO: error
          }
        } else {
          //TODO: error
        }
      }
    },
    onFailure: function(transport) {
    },
    onLoading: function() {
    },
    onComplete: function() {
    }
  });
}


CMHTWidget.prototype.submitComment = function(event,widget,live) {
  new Ajax.Request(widget.composeAPIUrl("comment"), {
    method: "get",
    parameters: $("create_comment_form").serialize(true),
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            if (json.message) {
              //$("cmht_message_body").update(json.message);
              //$("cmht_message").show();
            } 
            if (live) {
              //TODO: display update message
            } else if (json.html) {
              $("create_comment_form").up("#comment_form").insert({before:json.html});
            }
            $("text").value = "";
            if ($("nickname")) {
              $("nickname").value = "";
            }
            $("create_comment_form").enable();
          } else {
            //TODO: display error
          }
        } else {
          //TODO: display error 
        }
      } else {
        //TODO: display error
      }
    },
    onFailure: function(transport) {
      //TODO: display error
      $("create_comment_form").enable();
    },      
    onLoading: function() {
      //$("cmht_message").hide();
      $("create_comment_form").disable();
    },
    onComplete: function() {
      $("create_comment_form").enable();
    }
  });
  
}


CMHTWidget.prototype.submitNewContribution = function(event,widget) {
  new Ajax.Request(widget.composeAPIUrl("new_contribution_submit"), {
    method: "get",
    parameters: $("new_contribution_form").serialize(true),
    onSuccess: function(transport) {
      var response = transport.responseText || "";
      if (response != "") {
        try {
          var json = response.evalJSON();
        } catch (error) {
          var json ="";
        }
        if (json != "") {
          if (json.status == "ok") {
            if (json.id) {
              var valueID = json.id;
              var bodyID = "accordion_3";
              var key = "contribution";
              var params = $H();
              params.set(key,valueID);
              widget.updateAccordionBody(bodyID,key,params);
            } else {
              var bodyID = "accordion_3";
              widget.updateAccordionBody(bodyID);
            }
          } else {
            //TODO: display error
          }
        } else {
          //TODO: display error 
        }
      } else {
        //TODO: display error
      }
    },
    onFailure: function(transport) {
      //TODO: display error
      $("new_contribution_form").enable();
    },      
    onLoading: function() {
      //$("cmht_message").hide();
      $("new_contribution_form").disable();
    },
    onComplete: function() {
      $("new_contribution_form").enable();
    }
  });
  
}

CMHTWidget.prototype.fileUpload = function(widget, formID, formTarget, output, loadingMessage) {    
  uploadForm = $(formID);
  uploadForm.response = "";
  //var formID = formObj.identify();
    
  //uploadForm.down('input[type=button]').disable();
  var iframe = new Element('iframe', {id: 'fileUploadIframe', name: 'fileUploadIframe', style: 'border: none; width: 0px; height:0px;'});
  uploadForm.up().insert(iframe);
  window.frames['fileUploadIframe'].name="fileUploadIframe"; //ie sucks

  uploadForm.observe("files:uploaded", function (event) {
    var response = uploadForm.response.evalJSON();
    $(output).update();
    
    var status = new Element('div');
    var msg = "";
    if (response.status == "ok") {
      var img = new Element ("img", {src: response.url});
      $("avatar_image").update(img);
      msg = response.message;
      $("avatar_id").value = response.id;
    } else {
      msg = response.message;
    }
    status.update(msg);
    $(output).insert(status);
    //formObj.down('input[type=button]').enable();
  });

  var onLoading = function() {
    Event.stopObserving($('fileUploadIframe'),"load", onLoading);
    var cross = "javascript: ";
    cross += "window.parent.$('" + formID + "').response = document.body.innerHTML;";
    cross += "window.parent.$('" + formID + "').fire(\"files:uploaded\"); void(0); ";
            
    $('fileUploadIframe').src = cross;
    (function(){ $('fileUploadIframe').remove();}).delay(1);   
  };
  Event.observe($('fileUploadIframe'),"load", onLoading);
  uploadForm.writeAttribute({target: 'fileUploadIframe', action: formTarget, method: 'post', enctype: 'multipart/form-data', encoding: 'multipart/form-data'});
  $(output).update();
  uploadForm.submit();
  if(loadingMessage.length > 0){
    $(output).update(loadingMessage);
  }
}

CMHTWidget.prototype.getAccordionBody = function(id) {
  if (id == "accordion_4_body") {
    return "<div class=\"accordion_body\"><div class=\"accordion_body_header\"><h2>welcome to [channelname]</h2><span>more</span></div></div>"
  } else {
    return "boe";
  }
}

CMHTWidget.prototype.composeAPIUrl = function(method, params) {
  var randomNumber = Math.round(Math.random() * 1000000);
  var url = this.params.apiURL + this.params.methods[method];
  url = url + "?channelid=" + this.channelID;
  if (params) {
    url = url + "&" + params.toQueryString();
  }
  url = url + "&" + randomNumber;
  return url;
}

CMHTWidget.prototype.activateFF = function(event,accordion,tab,thisWidget) {
  
  thisWidget.accordion.previous = thisWidget.accordion.current;
  thisWidget.accordion.current = accordion;
  if ((thisWidget.accordion.current == thisWidget.accordion.previous) && !thisWidget.accordion.allClosed) {
    thisWidget.accordion.handleCloseEffect(); 
  } else {
    thisWidget.accordion.handleEffect();
  }
  
  var loadDefaultContent = true;
  if (event.memo) {
    if (event.memo.loadOtherContent) {
      loadDefaultContent = false;
      var bodyID = event.memo.bodyID;
      var key = event.memo.key;
      var params = event.memo.params;
    } 
  }
  if (thisWidget.accordion.previous) {
    if (thisWidget.accordion.previous != accordion) {
      var tabIndex = thisWidget.accordion.previous.id.substring(thisWidget.accordion.previous.id.indexOf("_")+1);
      var prevTab = thisWidget.tabs[tabIndex];
      prevTab.top.text.attr("opacity","0");
      prevTab.bottom.text.attr("opacity","1");
      thisWidget.disableButtons(prevTab);
      
      tab.top.text.attr("opacity","1");
      tab.bottom.text.attr("opacity","0");
      
      thisWidget.enableButtons(tab,thisWidget);
      
      if (loadDefaultContent) {
        thisWidget.updateAccordionBody(tab.id);
      } else {
        thisWidget.updateAccordionBody(bodyID,key,params);
      }
    } else {
      tab.bottom.text.attr("opacity","1");
      tab.top.text.attr("opacity","0");
      thisWidget.disableButtons(tab);
    }
  } else {
    tab.top.text.attr("opacity","1");
    tab.bottom.text.attr("opacity","0");
    thisWidget.enableButtons(tab,thisWidget);
    
    if (loadDefaultContent) {
      thisWidget.updateAccordionBody(tab.id);
    } else {
      thisWidget.updateAccordionBody(bodyID,key,params);
    }
  }  
}

CMHTWidget.prototype.activateIE = function(event,accordion,tab,thisWidget) {
  event.stop();
  thisWidget.accordion.previous = thisWidget.accordion.current;
  thisWidget.accordion.current = accordion;
  if ((thisWidget.accordion.current == thisWidget.accordion.previous) && !thisWidget.accordion.allClosed) {
    thisWidget.accordion.handleCloseEffect(); 
  } else {
    thisWidget.accordion.handleEffect();
  }
    
  var loadDefaultContent = true;
  if (event.memo) {
    if (event.memo.loadOtherContent) {
      loadDefaultContent = false;
      var bodyID = event.memo.bodyID;
      var key = event.memo.key;
      var params = event.memo.params;
    } 
  }
  if (thisWidget.accordion.previous) {
    if (thisWidget.accordion.previous.id != accordion.id) {
      var tabIndex = thisWidget.accordion.previous.id.substring(thisWidget.accordion.previous.id.indexOf("_")+1);
      var prevTab = thisWidget.tabs[tabIndex];
      thisWidget.disableButtons(prevTab);
      
      thisWidget.enableButtons(tab,thisWidget);
      
      if (loadDefaultContent) {
        thisWidget.updateAccordionBody(tab.id);
      } else {
        thisWidget.updateAccordionBody(bodyID,key,params);
      }
    } else {
      thisWidget.disableButtons(tab);
    }
  } else {
    thisWidget.enableButtons(tab,thisWidget);
    
    if (loadDefaultContent) {
      thisWidget.updateAccordionBody(tab.id);
    } else {
      thisWidget.updateAccordionBody(bodyID,key,params);
    }
  } 
  

}

CMHTWidget.prototype.enableButtonsFF = function(tab,widget) {
  tab.fullscreen_button.attr("opacity","1");
  tab.fullscreen_button[0].onclick = function(event) {
    var theurl = "";
    if (widget.history) {
      var history_length = widget.history.length;
      if (history_length > 0) {
        var accordion_id = widget.history[history_length-1].id;
        var id = accordion_id.substring(accordion_id.indexOf("_")+1);
        var theurl = "http://www.coolmediators.net/fullscreen.jsp?channelid=" + $("channelid").value + "&pageid=" + id;
      } 
    }
    if (theurl=="") var theurl = "http://www.coolmediators.net/fullscreen.jsp";
		mywindow = window.open(theurl,"mywindow");
    Event.stop(event);      
  }
  tab.back_button.attr("opacity","1");
  tab.back_button[0].onclick = function(event) {
    widget.goBack();
    Event.stop(event);  
  }
}

CMHTWidget.prototype.enableButtonsIE = function(tab,widget) {
  tab.fullscreen_button.show();
  tab.fullscreen_button.observe("click", function(event) {
	  var theurl = "";
    if (widget.history) {
      var history_length = widget.history.length;
      if (history_length > 0) {
        var accordion_id = widget.history[history_length-1].id;
        var id = accordion_id.substring(accordion_id.indexOf("_")+1);
        var theurl = "http://www.coolmediators.net/fullscreen.jsp?channelid=" + $("channelid").value + "&pageid=" + id;
      } 
    }
    if (theurl=="") var theurl = "http://www.coolmediators.net/fullscreen.jsp";
    mywindow = window.open(theurl,"mywindow");
    Event.stop(event);      
  });
  tab.back_button.show();
  tab.back_button.observe("click", function(event) {
    widget.goBack();
    Event.stop(event);  
  });
}

CMHTWidget.prototype.disableButtonsFF = function(tab) {
  tab.fullscreen_button.attr("opacity","0");
  tab.fullscreen_button[0].onclick=null;
  tab.back_button.attr("opacity","0");
  tab.back_button[0].onclick=null;
}

CMHTWidget.prototype.disableButtonsIE = function(tab) {
  tab.fullscreen_button.hide();
  tab.fullscreen_button.stopObserving("click");
  tab.back_button.hide();
  tab.back_button.stopObserving("click");
}

CMHTWidget.prototype.checkElementWidth = function() {
  $$("embed").each(function(el){
    if (el.width > 380) {
      var divide = el.width / el.height;
      el.width = 380;
      el.height = el.height / divide;
    }
  })
  $$("object").each(function(el){
    if (el.width > 380) {
      var divide = el.width / el.height;
      el.width = 380;
      el.height = el.height / divide;
    }
  })
  $$("img").each(function(el){
    if (el.width > 380) {
      var divide = el.width / el.height;
      el.width = 380;
      el.height = el.height / divide;
    }
  })

}

CMHTWidget.prototype.addExtraElementsIE = function() {

  
  $$(".rounded").each(function(elem) {
    var topElements = "<div class=\"roundedcornr_top\"><div></div></div>";

    var bottomElements = "<div class=\"roundedcornr_bottom\"><div></div></div>";
    var oldContent = elem.innerHTML;
    var newContent = new Element('div', { 'class': 'content' });
    newContent.update(oldContent);
    elem.update(newContent);
    Element.insert(newContent,{before: topElements});
    Element.insert(newContent,{after: bottomElements});
  })
}

//empty method
CMHTWidget.prototype.addExtraElementsEmpty = function() {
}




// TODO: implement javascript voor video in speler afhandeling
CMHTWidget.prototype.handleVideoInPlayer = function (event,element,widget) {
	var id = element.id;
  if (!id) {
    var id = element.up().id;
  }
  var valueID = id;
  $("video").update("<span id=\""+valueID+"\" class=\"play_video\"><img src=\"images/playvideo.png\" class=\"play_video\" width=\"160\" height=\"120\" border=\"0\"></span>"); 
  setTimeout(function() {window.location.assign("rtsp://"+valueID);},100);  
}

CMHTWidget.prototype.handlePlayVideo = function (event,element,widget) {
  var id = element.id;
  if (!id) {
    var id = element.up().id;
  }  
  var valueID = id; 
  $("video").update("<object classid=\"clsid:00\" codebase=\"http://www.apple.com/qtactivex/qtplugin.cab#version=7,0,2,0\" width=\"160\" height=\"120\" id=\"movie1\"><param name=\"src\" value=\"http://"+valueID+"\" <param name=\"scale\" value=\"tofit\"><param name=\"controller\" value=\"false\"><param name=\"type\" value=\"video/quicktime\"><param name=\"autoplay\" value=\"false\"><param name=\"volume\" value=\"75\"><param name=\"target\" value=\"myself\"><param name=\"bgcolor\" value=\"#000000\"><embed width=\"160\" height=\"120\" bgcolor=\"#000000\"	src=\"http://"+valueID+" \" scale=\"tofit\"	TYPE=\"video/quicktime\" AUTOPLAY=\"true\" volume = \"75\"	STARTTIME=\"00:00:00:00\"	controller=\"false\"	PLUGINSPAGE=\"www.apple.com/quicktime/download\" name=\"movie1\" enablejavascript=\"true\"></embed></object>");
} 
