// ADECN Press Center 
// by P. Mark Anderson
// mark@martianrover.com

//
//
var PressCenter = {

  // milliseconds between press item shifts
  ticker_delay_ms: 4401,
  
  // duration of shift animation in seconds
  ticker_speed_sec: 0.8,
  
  all_press_items: [],
  pause_ticker: false,
  
  load: function() {
    try {
      PressCenter.get_press_items()
    } catch (e) {
      PressCenter.error(e, "problem getting press items")
    }
  },
  
  //
  // Workhorse method.  This is the ajax callback.
  //
	render: function(transport) {
	  try {
  	  PressCenter.parse_xml(transport)
  	  PressCenter.render_categories()
  	  PressCenter.render_ticker()
  	  PressCenter.fix_links_because_ie_sucks()
  	  PressCenter.run_ticker()  	  
    } catch (e) {
      PressCenter.error(e, "problem rendering")
    }
  },

  fix_links_because_ie_sucks: function() {
    var fix_link = function(link) {
      var matches = link.href.match(/.+(http[s]?:\/\/.*$)/)
      if (matches != null) {
        link.href = matches[1]
      }
    }

    $$("#press_center a").each(function(link) {
      fix_link(link)
	  })
	  
    $$("#press_container a").each(function(link) {
      fix_link(link)
	  })
  },
  
  run_ticker: function() {
    // activate the links
    $A(document.getElementsByClassName("press_block_links")).each(function(link) {
      Event.observe(link, "mouseover", function() {
        PressCenter.pause_ticker = true
      }, false)
      Event.observe(link, "mouseout", function() {
        PressCenter.pause_ticker = false
      }, false)
      
      // do the cell too
      cell = link.parentNode.parentNode
      Event.observe(cell, "mouseover", function() {
        PressCenter.pause_ticker = true
        window.status = link.href
      }, false)
      Event.observe(cell, "mouseout", function() {
        PressCenter.pause_ticker = false
        window.status = ''
      }, false)
      
      Event.observe(cell, "click", function() {
        window.location = link.href
      }, false)
      
    }) 

    // animate the blocks
    blocks = $("press_container").getElementsByTagName("li")
    PressCenter.cur_block_num = 1
    PressCenter.max_block_num = blocks.length
    
    if (PressCenter.max_block_num < 2) {
      return
    }
    
    try {
      new Insertion.Bottom("press_container", '<li class="press_block">' + blocks[1].innerHTML + "</li>")
      new Insertion.Bottom("press_container", '<li class="press_block">' + blocks[2].innerHTML + "</li>")
    } catch (e) {
    }
    
    skip = false
    setInterval(function() {
      Element.show("ticker_pusher")
      if (skip != true && PressCenter.pause_ticker == false) {
        new Effect.BlindLeft("ticker_pusher", {
          duration: PressCenter.ticker_speed_sec,
          afterFinish:function() {
            cur = PressCenter.cur_block_num++
            Element.hide(blocks[cur])
            Element.show("ticker_pusher")

            if (PressCenter.cur_block_num == PressCenter.max_block_num) {
              PressCenter.cur_block_num = 1
              //skip = true
              block_index = 0
              $A(blocks).each(function(elem) {
                Element.show(elem)
              })
            }
          }})
      } else {
        skip = false
      }
    }, PressCenter.ticker_delay_ms)
  },
  
  render_categories: function() {
    if ($("press_center") == null) {
      return
    }
	  tpl_item = PressCenter.get_item_template()
	  tpl_category = PressCenter.get_category_template()
	  var item_lists = {}
	  var one_item = ''

	  // group items by category
	  $A(PressCenter.all_press_items).each(function(item) {
	    if (item_lists[item.get("category")] == null) {
  	    item_lists[item.get("category")] = []
	    }
	    item_lists[item.get("category")].push(tpl_item.mixin(item.atts))
	  })

    // render each category
    var all_categories_html = ''
    $H(item_lists).each(function(row) {
  	  html = tpl_category.mixin({
  	      category: row.key,
  	      item_list: row.value.join('')
  	  })
  	  
  	  all_categories_html += html
    })
    
    Element.update("press_center", all_categories_html)
	},
  
	render_ticker: function() {
	  var tpl_press_block = PressCenter.get_press_block_template()
	  var ticker_html = ''

	  // group items by category
	  $A(PressCenter.all_press_items).each(function(item) {
	    if (item.get("is_featured")) {
  	    ticker_html += tpl_press_block.mixin(item.atts)
  	  }  
	  })
	  
    Element.update("press_container", 
        '<li id="ticker_pusher" style="width:256px">x &nbsp; x</li>' + ticker_html)
	},
  
  get_press_items: function() {
    // get xml
    PressCenter.ajax_get("press_center.xml")
  },

  ajax_get: function(url, loading, complete, params) {
    new Ajax.Request(url, 
      {
        asynchronous:true, 
        method:"get", 
        evalScripts:false, 
        onComplete:function(transport, params){PressCenter.render(transport)} /*,
        onException:function(ajax, e) {
          alert("Error name: " + e.name
              + "\n Error message: " + e.message
              + "\n Error number: " + e.number
              + "\n Error description: " + e.description)
          }
          */
      }
    )
	},

	// put all the items into the all_press_items array
	parse_xml: function(transport) {
	  var xmldoc = transport.responseXML
	  //var press_center_elem = xmldoc.firstChild
	  var press_item_elems = xmldoc.getElementsByTagName("press_item")

    for (var item_index=0; item_index < press_item_elems.length; item_index++) {
      // get each item
      press_item_elem = press_item_elems.item(item_index)
      if (press_item_elem.nodeType == 3) {continue}

      var press_item = new PressItem()
      for (var att_index=0; att_index < press_item_elem.childNodes.length; att_index++) {
        // get each attribute for this item
        att = press_item_elem.childNodes.item(att_index)
        if (att.nodeType == 3 || att.firstChild == null) {continue}
        press_item.set(att.nodeName, att.firstChild.nodeValue)
        if (press_item_elem.getAttribute("is_featured") == "true") {
          press_item.set("is_featured", true)
        }
      }

      PressCenter.all_press_items.push(press_item)
    }
    
    //alert(PressItem.sort_by_release_date)
    //PressCenter.all_press_items = PressCenter.all_press_items.sort(PressItem.sort_by_release_date)
  },
  
  error: function(e, msg) {
    alert("Error: " + msg + ":\n" + e.name
    + "\n Error message: " + e.message
    + "\n Error number: " + e.number
    + "\n Error description: " + e.description)
  },

	
	/* TEMPLATE FUNCTIONS */
	// return html as string
  get_template: function(tpl_name) {
    html = ""
    if ($(tpl_name)) {
      html = $(tpl_name).innerHTML
    }
    html = html.gsub(new RegExp("%7B"), "{")
    html = html.gsub(new RegExp("%7D"), "}")
    return html
  },
  
  get_category_template: function() {
    return PressCenter.get_template("tpl_press_center_category")
  },
  
  get_item_template: function() {
    return PressCenter.get_template("tpl_press_center_item")
  },

  get_press_block_template: function() {
    return PressCenter.get_template("tpl_press_block")
  }
  
	
}


// 
// PressItem class
//
PressItem = Class.create();
PressItem.prototype = {
  initialize: function() {
    this.atts = {}
  },
  
  set: function(att_name, att_value) {
/*
    if (att_name == "link" && att_value != null) {
      if (att_value.match(/^http[s]?:\/\//) == null && att_value[0] != '/') {
        // relative link needs to be absolute because IE is so sweet
        var pos = document.location.href.lastIndexOf('/')
        var base = document.location.href.substr(0,pos)
        att_value = base + '/' + att_value
      }
    }
*/
    this.atts[att_name] = att_value
  },
  
  get: function(att_name) {
    return this.atts[att_name]
  },
  
  sort_by_release_date: function(a, b) {
    return a.get("release_date") < b.get("release_date")
  }
}





//
// Script.aculo.us extensions
//
if (typeof(Effect) != "undefined") {
  Effect.BlindLeft = function(element) {
    element = $(element);
    element.makeClipping();
    var elementDimensions = element.getDimensions();
    return new Effect.Scale(element, 0, 
      Object.extend({ scaleContent: false, 
        scaleY: false, 
        restoreAfterFinish: true,
        afterFinishInternal: function(effect) {
          effect.element.hide();
          effect.element.undoClipping();
        } 
      }, arguments[1] || {})
    );
  }

  Effect.BlindRight = function(element) {
    element = $(element);
    var elementDimensions = element.getDimensions();
    return new Effect.Scale(element, 100, 
      Object.extend({ scaleContent: false, 
        scaleY: false,
        scaleFrom: 0,
        scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
        restoreAfterFinish: true,
        afterSetup: function(effect) {
          effect.element.makeClipping();
          effect.element.setStyle({width: '0px'});
          effect.element.show(); 
        },  
        afterFinishInternal: function(effect) {
          effect.element.undoClipping();
        }
      }, arguments[1] || {})
    );
  }
  
}



