/**
 * Javascript manipulation of HuddleFish widgets
 *
 * @copyright Camna, LLC.
 * @author Aaron Birchler <abirchler@camna.com>
 */

HFWidgetInitializers = {};
HFWidgetDelayedInitializers = {};

;(function($) {

  $.HFAjax = $.ajax;
  
  var scpts = $("script");
  var n = scpts.length;
  $.HFLoadedScripts = [];
  for (var i=0; i<n; i++){
    var src = $(scpts[i]).attr("src");
    $.HFLoadedScripts.push(src);
  }

	var styles = $("link[rel=stylesheet]");
	var n = styles.length;
  $.HFLoadedStyles = [];
  for (var i=0; i<n; i++){
    var url = $(styles[i]).attr("href");
    $.HFLoadedStyles.push(url);
  }
  
  $.HFLogout = function(){
    // alert("Logging out");
    window.location.href = window.location.href;
  }
  
  $.HFLoadScriptIfNecessary = function(src){
    var n = $.HFLoadedScripts.length;
    var loadScript = true;
    for (var i=0; i<n; i++){
      if ($.HFLoadedScripts[i] == src){
        loadScript = false;
        break;
      }
    }
    if (loadScript){
      $("head").append("<script type='text/javascript' src='"+src+"'></script>");
    }
  }
  
  $.HFLoadStyleIfNecessary = function(url){
    var n = $.HFLoadedStyles.length;
    var loadStyle = true;
    for (var i=0; i<n; i++){
      if ($.HFLoadedStyles[i] == url){
        loadStyle = false;
        break;
      }
    }
    if (loadStyle){
      $('head').append('<link rel="stylesheet" type="text/css" href="'+url+'"/>');
    }
  }
  
  /**
   * This replaces the jQuery ajax function with our own.
   * This function will call the jquery ajax function, but it also does some more work beyond this.
   */
  $.ajax = function(options){
  
    var successFnc = options.success;
    var completeFnc = options.complete;
    var errorFnc = options.error;
    
    options.success = function(data, textStatus, XMLHttpRequest){
      var isLoggedIn = XMLHttpRequest.getResponseHeader("X-HF-Isloggedin");
      if (window.HFIsLoggedIn && isLoggedIn == 'No'){
       $.HFLogout();
      }
      else{
        var rh = XMLHttpRequest.getResponseHeader("X-HF-ScriptResources");
        var sr = XMLHttpRequest.getResponseHeader("X-HF-StyleResources");
        if (rh){
          var scripts = $.parseJSON(rh);
          var n = scripts.length;
          for (var i=0; i<n; i++){
            $.HFLoadScriptIfNecessary(scripts[i]);
          }
        }
        if (sr){
        	var styles = $.parseJSON(sr);
        	var n = styles.length;
        	for (var i=0; i<n; i++){
        		$.HFLoadStyleIfNecessary(styles[i]);
        	}
        }
        if ($.isFunction(successFnc)) successFnc.call(this, data, textStatus, XMLHttpRequest);
      }
    };
    
    options.complete = function(XMLHttpRequest, textStatus){
      var isLoggedIn = XMLHttpRequest.getResponseHeader("X-HF-Isloggedin");
      if (window.HFIsLoggedIn && isLoggedIn == 'No'){
       $.HFLogout();
      }
      else{
        if ($.isFunction(completeFnc)) completeFnc.call(this, XMLHttpRequest, textStatus);
      }
    };
    
    options.error = function(XMLHttpRequest, textStatus, errorThrown){
      var isLoggedIn = XMLHttpRequest.getResponseHeader("X-HF-Isloggedin");
      if (window.HFIsLoggedIn && isLoggedIn == 'No'){
       $.HFLogout();
      }
      else{
        if ($.isFunction(errorFnc)) errorFnc.call(this, XMLHttpRequest, textStatus, errorThrown);
      }
    };
    
    return $.HFAjax(options);
  }
  
  $.fn.HFAbsolutize = function() {
  	this.each(function(){
  		var o, h, w, p, offset;
  		o = $(this);
  		offset = o.offset();
  		h = o.height();
  		w = o.width();
  		p = o.position();
  		o.css('position', 'absolute').width(w).height(h).offset(offset);
  	});
  }
  
  $.HFReloadPage = function() {
    window.location.href = window.location.href.replace(/^([^#]+)(#.*)?$/, '$1');
  }
  
  $.fn.HFInit = function(){
    this.find('.create_dialog').click(function(e) {
      e.preventDefault();
      var url;
      var dialogOpts = $(this).attr('data-dialog_opts');
      var opts = {};
      if (dialogOpts){
        dialogOpts = $.parseJSON(dialogOpts);
        $.extend({}, opts, dialogOpts);
      }
      if (this.tagName == 'BUTTON') {
        url = $(this).attr('value');
      }
      else {
        url = $(this).attr('href');
      }
      create_dialog(url, dialogOpts);
    });
    this.find('.date_picker').datepicker({
      dateFormat: 'mm/dd/yy',
      showOn: 'button',
      buttonImage: '/images/calendar.gif',
      buttonImageOnly: true
    });
    this.find('.widget_help_control').click(function(e){
      $(e.target).closest('.widget').HFToggleWidgetHelp();
    });
    this.find('.widget_help_hide_button').click(function(e){
      $(e.target).closest('div.widget').HFHideWidgetHelp();
    });
    
    var wysiwygs = this.find('textarea.wysiwyg');
    
    wysiwygs.each(function(){
      var t = $(this);
      var v = t.val();
      if ((/^\s*$/).test(v)){
        t.val('<br/>');
      }
      t.htmlarea({
        // css: "/css/wysiwyg.css",
        toolbar: [
          ["html"], ["bold", "italic", "underline", "strikethrough", "|", "subscript", "superscript"],
          [
            {
              css:'forecolor',
              text:'Text Color',
              action: function(btn){
                // this.ec("foreColor", false, c || prompt("Enter HTML Color:", "#"));
              }
            }
          ],
          ["increasefontsize", "decreasefontsize"],
          ["orderedlist", "unorderedlist"],
          ["indent", "outdent"],
          ["justifyleft", "justifycenter", "justifyright"],
          ["link", "unlink", "image", "horizontalrule"],
          ["p", "h1", "h2", "h3", "h4", "h5"],
          ["cut", "copy", "paste"]
        ],
        loaded: function(){

          var thisEditor = this;
          var fc = $(this.container).find('a.forecolor').parent();
          var cp = $('<input type="text" name="picker" id="_picker" value="#000"/>');
          cp.change(function(evt){
            var color = $(evt.target).val();
            thisEditor.ec("foreColor", false, color);
          });
          fc.replaceWith(cp);
          cp.colorPicker();
        }
      });
    });    
    
    this.data('HFWidgetCleanupFn', function(){});
    
    this.find("div.widget").andSelf().filter('div.widget').HFInitWidget();
    
    this.HFRoundCorners();
    
    // Trigger events for each of the elements on which HFInit was called 
    this.each(function(){
      var evt = $.Event('hfinit');
      $(this).trigger(evt);
    });
    
    return this;
  }
  
  $.fn.HFShowWidgetHelp = function() {
  
    this.each(function(){
      var info = $(this).HFPageWidgetInfo();
      var url = '/main/set_widget_help_status/'+info.page_widget_id+'/A';
      $(this).find('.widget_help_text').show();
      $.post(url);
    });
  }
  
  $.fn.HFHideWidgetHelp = function() {

    this.each(function(){
      var info = $(this).HFPageWidgetInfo();
      var url = '/main/set_widget_help_status/'+info.page_widget_id+'/I';
      $(this).find('.widget_help_text').hide();
      $.post(url);
    });
  }
  
  $.fn.HFToggleWidgetHelp = function() {
    
    this.each(function(){
      var ht = $(this).find('.widget_help_text');
      if (ht.is(':visible')) {
        $(this).HFHideWidgetHelp();
      }
      else {
        $(this).HFShowWidgetHelp();
      }
    });
  }
  
  $.fn.HFPageWidgetInfo = function() {
  
    var info = {};
    
    if (this.hasClass('widget')) {
      var id = $(this).attr('id');
      info.page_widget_id = id.replace(/^[a-zA-Z_]+_widget_(\d+)$/, '$1');
      info.pageWidgetId = info.page_widget_id;
      info.name = id.replace(/^([a-zA-Z_]+)_widget_\d+$/, '$1');
    }
    
    return info;
  }

	$.fn.HFInitWidget = function() {
	
		this.each(function(){
		
		  var widget = $(this);
		  
      widget.find('a.delete_widget_button').unbind('click').click(function(evt){
      
        evt.preventDefault();
      
        var confirmMsg = $(this).data('delete-confirm-msg');
        
        if (!confirmMsg){
          confirmMsg = 'Are you sure you want to remove this widget?';
        }
        
        if (confirm(confirmMsg)) {
          create_dialog(this.href);
        }
        return false;
      }).mousemove(function(evt){
        evt.preventDefault();
        evt.stopPropagation();
      });
      
      var info = widget.HFPageWidgetInfo();
      
      if (HFWidgetInitializers[info.name]){
        HFWidgetInitializers[info.name].call(this, info.pageWidgetId, info.name);
      }
      
			widget.trigger($.Event('hfwidgetinit'));
		})/*
.mousemove(function(evt){
		  evt.preventDefault();
		  return false;
		})
*/;
	}
	
	$.fn.HFDelayedInitWidget = function() {
	
    this.each(function(){
      var widget = $(this);
      
      var info = widget.HFPageWidgetInfo();
      
      if (HFWidgetDelayedInitializers[info.name]){
        HFWidgetDelayedInitializers[info.name].call(this, info.pageWidgetId, info.name);
      }
      
      widget.trigger($.Event('hfwidgetinitdelayed'));
    });
	}

  /**
   * Reloads a widget using AJAX
   * @param string loadURL The URL of the widget's display
   * @param function callBack Function to run after the reload is complete
   * @return object
   */
  $.fn.HFReloadWidget = function() {
  
    var n = arguments.length;
    
    var callBack;
    var opts;
    var userLoadURL;
    
    for (var i=0; i<n; i++) {
      if (!callBack && $.isFunction(arguments[i])) {
        callBack = arguments[i];
      }
      if (!opts && $.isPlainObject(arguments[i])) {
        opts = arguments[i];
      }
      if (!userLoadURL && arguments[i].charAt) {
        userLoadURL = arguments[i];
      }
    }
    
   	hfopts = $.extend({segments:null,params:null}, opts);
   	
   	if (!window.HFShowBuilder) {
   	  if (hfoptsall.params) hfopts.params['no-builder'] = 1;
   	  else hfoptsall.params = {'no-builder':1};
   	}
    
    this.each(function(){
    
      var w = $(this);
      
      w.HFUnloadWidget();
      
      var loadURL = w.data('hfloadurl');

      var widgetInfo = w.HFPageWidgetInfo();
      
      if (widgetInfo.name && widgetInfo.page_widget_id) {
      
        if (userLoadURL) {
          loadURL = userLoadURL;
        }
        else if (!loadURL){
          loadURL = '/'+widgetInfo.name+'_widget'+'/display/'+widgetInfo.page_widget_id;
          if (hfopts.segments){
            loadURL = loadURL + "/" + hfopts.segments.join("/");
          }
          if (hfopts.params) {
            var queryString = $.param(hfopts.params);
            if (queryString) {
              loadURL = loadURL + "?" + queryString;
            }
          }
        }
        
        $.get(
          loadURL,
          function(data){
            var d = $(data);
            w.find('*').andSelf().removeAttr('id'); // IDs of the old widget are removed so there are not dupicate ids during replcement
            w.replaceWith(d);
            d.data("hfreloadurl", loadURL);
            d.HFInit();
            if ($.isFunction(callBack)) {
              callBack.apply(d);
            }
            d.trigger('hfwidgetloaded');    
          }
        );
      }
      
      w.HFDelayedInitWidget();
    });
    
    return this;
  }

  /**
   * Called on a widget before it is reloaded or before the page is unloaded
   * @param evt Page unload event (optional)
   * @return object
   */
  $.fn.HFUnloadWidget = function(evt) {

    var stopReload = false;

    this.each(function(){
    
      var w = $(this);
      
      var e = $.Event("hfwidgetunload");
      
      if (evt)
      {
        evt.unloadEvent = evt;
      }
      
      w.trigger(e);
    });

    return this;
  }
  
  if (window.addEventListener){
    window.addEventListener("beforeunload", function(){
      $("div.widget").HFUnloadWidget();    
    }, false);
  }
  else if (window.attachEvent){
    window.attachEvent("onbeforeunload", function(){
      $("div.widget").HFUnloadWidget();    
    });
  }
  else{
    $(window).unload(function(evt){
      $("div.widget").HFUnloadWidget(evt);
    });
  }
  
  /** Containers & Columns **/
  
  $.fn.HFPageContainer = function(){
  
    this.each(function(){

      // var colMenu = $(this).find("select");
      // var v = colMenu.val();
      // var p = 100/3;
      // var vals = [];
      // for (i=1; i<v; i++){
      //   vals.push(p*(i));
      // }
      
      // if (v > 1) {
      //   var s = $(this).find(".col_slider").slider({
      //     min:0,
      //     max:100,
      //     values:vals,
      //     change:function(evt, ui){
      //       var p = $(evt.target).parent();
      //       var vals = $(evt.target).slider("values");
      //       var cls = p.next().children();
      //       var n = vals.length;
      //       var t = 0;
      //       for (var i=0; i<n; i++){
      //         $(cls[i]).css("width", Math.round(vals[i]-t)+"%");
      //         t = t + (vals[i]-t);
      //       }
      //       $(cls[n]).css("width", (100-t)+"%");
      //     }
      //   });
      // }
      
    });
  
    return this;
  }
  

})(jQuery)

$(document).load(function(){
  $('div.widget').HFDelayedInitWidget();			
});

