var __BEEING_MESSAGE_PARSER = true;
var __BEEING_URL_COUNTER = 0;
var __BEEING_SUBMIT_ID = 0;

// functions to call before parsing urls
var GENERAL_PARSE_FUNCTIONS =
  [
    objectParser
  ];

// array of things to do with urls 
// return new text if it is registered 
// to handle that type of input otherwise null
var URL_PARSE_FUNCTIONS = 
  [
    youtubeParser,
    tedParser,
    blipParser,
	huluParser,
	currentParser,
    vimeoParser,
	viddlerParser,
	dailymotionParser,
	veohParser,
    imageParser,
	stickgameParser,
    urlParser       // NEEDS TO ALWAYS BE LAST
  ];

var BEEING_XMLHTTP;

// Accepts a jquery object and parses the html 
function parseChatLogMessage(obj, url_teleports) {
  if (!url_teleports) {
    url_teleports = false;
  }
  obj.html(parseHyperlinks(jQuery.trim(obj.html()), url_teleports));
}

// formats a pickup url (the blue arrow)
function pickupLink(url) {
  return "<a href='" + url + "'><img src='http://www.beeing.biz/assets/link.png'/></a>"
}

// Parses a chat message in object form from the database
// depending on what type of message it is
function parseChatMessage(log, url_teleports, user_icons) {
  if (user_icons == null) {
    user_icons = false;
  }
  if (log.message_type == 'AVATAR_LEAVE') {
    return("<img src='http://www.beeing.biz/assets/teleport.png' class='teleport' />&nbsp;" + parseHyperlinks(log.target, url_teleports));
  } else {
    if (user_icons) {
      return("<img src='http://r.beeing.com/assets/images/" + log.user_name + ".png' style='height: 24px;width: 24px' />&nbsp;" + pickupLink(log.url) + "&nbsp;" + parseHyperlinks(log.text, url_teleports));
    } else {
      return(pickupLink(log.url) + "&nbsp;" + parseHyperlinks(log.text, url_teleports));
    }
  }
}

// Tests the text, the text has to conform to the following 
// conditions:
//  - must only be one url in the text
//  - text must consist of only one url
//  - returns the function that successfully parsed
//    the url
function testAutoRedirectUrl(text) {
  var _regexp = urlParsingRegExp();
  do {
    var result = _regexp.exec(text);
    if (result != null) {
      result = result.toString();
      if (result != text) {
        return(false);
      }

      for (var i = 0; i < URL_PARSE_FUNCTIONS.length; i++) {
        var fun = URL_PARSE_FUNCTIONS[i];
        var ret = fun(stripUrl(result), false);
        if (ret != null) {
          return(fun);
        }
      }
    }
  } while (result != null);
}


// Returns the regular expression used for finding urls in messages
function urlParsingRegExp() {
  // these are all of the url's we're matching against
  // pseudo code:
  //    [valid html character]+[\.]{1}[a-z]{2,}[valid html character]*
  // matches:
  //    www.url.com
  //    url.com
  //    http://url.com
  //    randomtext.url.com:3453/path?q=test%20string
  //  
  // All urls can have |__BEEING_URL_DATA_ tagged on the end from the database
  // if there is additional data for that url
  return (new RegExp("[\055\/\:\@\.\;\?\&\=a-z0-9\_\$\+\*\'\Õ\(\)\,\%\#\~\]{2,}[\.]{1}[a-z]{2,}[\055\/\:\@\.\;\?\&\=a-z0-9\_\$\+\*\'\Õ\(\)\,\%\#\~\\|]*", 'gi'));
}

// Strips 'http://' and 'www' from the url
// returns data in the following format:
//    { 
//      url: <original argument>,
//      stripped: <argument without 'http://' or 'www.'>,
//      stripped_lower: <lowercase version of stripped>
//    }
function stripUrl(url) {
  // create a stripped down url for testing 
  var stripped_lower = url.toLowerCase();
  var stripped = url;
  if (stripped_lower.indexOf("http://") == 0) {
    stripped_lower = stripped_lower.substring(7, stripped_lower.length);
    stripped = stripped.substring(7, stripped.length);
  }
  if (stripped_lower.indexOf("www.") == 0) {
    stripped_lower = stripped_lower.substring(4, stripped_lower.length);
    stripped = stripped.substring(4, stripped.length);
  }
  return({url: url, stripped: stripped, stripped_lower: stripped_lower});
}

// Parses the text in a chat message converting
// all hyperlinks into <a> tags that teleport the user.
function parseHyperlinks(message, url_teleports) {
  message = message.replace(/\</g, '&lt;');
  message = message.replace(/\>/g, '&gt;');
  if (url_teleports == null) {
    url_teleports = true;
  }

  for (var x = 0; x < GENERAL_PARSE_FUNCTIONS.length; x++) {
    var fun = GENERAL_PARSE_FUNCTIONS[x];
    message = fun(message);
  }
  var new_message = message;
  var _regexp = urlParsingRegExp();
  do {
    var result = _regexp.exec(message);
    if (result != null) {
      result = result.toString();
      var extra_data = false; 
      if (result.substring(result.length - 19) == '|__BEEING_URL_DATA_') {
        result = result.substring(0, result.length - 19);
        extra_data = true;
      }

      for (var i = 0; i < URL_PARSE_FUNCTIONS.length; i++) {
        var fun = URL_PARSE_FUNCTIONS[i];
        var data = stripUrl(result);
        var ret = fun(data, url_teleports);
        if (ret != null) {
          var extra_data_str = '';
          if (extra_data) {
            extra_data_str = "<a id='beeing_url_link_" + __BEEING_URL_COUNTER + "' onclick='beeingAddData(this, \"" + data.stripped + "\", " + url_teleports + ");return false;'><img src='http://www.beeing.biz/assets/add.png' /></a><script type='text/javascript'>$(document).ready(function() { beeingAddData(document.getElementById('beeing_url_link_" + __BEEING_URL_COUNTER + "'), \"" + data.stripped + "\", " + url_teleports + ");});</script>";
            __BEEING_URL_COUNTER++;
          } else {
            extra_data_str = "<a onclick='beeingAddData(this, \"" + data.stripped + "\", " + url_teleports + ");return false;'><img src='http://www.beeing.biz/assets/add-grey.png' /></a>";
          }
          new_message = new_message.replace(result, ret + extra_data_str);
          break;
        }
      }
    }
  } while (result != null);

  if (new_message) {
    new_message = new_message.replace('|__BEEING_URL_DATA_', '');
  }
  return(new_message);
}

// Matches youtube urls and converts them to videos
// youtube.com/v/ID&...
// youtube.com/watch?v=ID&...
function youtubeParser(data, url_teleports) {

  if (data.stripped_lower.indexOf("youtube.com/v/") == 0 || data.stripped_lower.indexOf("youtube.com/watch?v=") == 0) {
    var video_id = ""
    var amp_pos = data.stripped_lower.indexOf("&");
    if (amp_pos == -1) {
      amp_pos = data.stripped_lower.length;
    }

    if (data.stripped_lower.indexOf("youtube.com/v/") == 0) {
      video_id = data.stripped.substring(14, amp_pos);
    } else {
      // youtube.com/watch?v=
      video_id = data.stripped.substring(20, amp_pos);
    }
    var youtube_url = "http://www.youtube.com/v/" + video_id + "&hl=en&fs=1&rel=0"
    return('<object width="100%" height="385px"><param name="movie" value="' + youtube_url + '"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="' + youtube_url + '" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="100%" height="385px"></embed></object>')
  }
  return(null);
}

function tedParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("video.ted.com/") == 0) {
    return('<br><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=' + data.url + '&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=' + data.url + '"></embed></object>');
  }
  return(null);
}

function blipParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("blip.tv/play/") == 0) {
    return('<object><embed src="' + data.url + '" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="100%" height="405"></embed></object>');
  }
  return(null);
}

function huluParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("hulu.com/embed/") == 0) {
    return('<object width="100%" height="428px"><param name="movie" value=' + data.url + '"></param><param name="allowFullScreen" value="true"></param><embed src="' + data.url + '" type="application/x-shockwave-flash" allowFullScreen="true"  width="100%" height="428px"></embed></object>');
  }
  return(null);
}

function currentParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("current.com/e/") == 0) {
    return('<object width="100%" height="420" id="' + data.url + '" data="' + data.url + '"><param name="movie" value="' + data.url + '"></param><param name="wmode" value="transparent"></param><param name="allowfullscreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed type="application/x-shockwave-flash" src="' + data.url + '" width="100%" height="420" wmode="transparent" allowfullscreen="true" allowscriptaccess="always" ></embed></object>');
  }
  return(null);
}


function viddlerParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("viddler.com/player/") == 0) {
    return('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="420" id="viddler_1fcb8ae8"><param name="movie" value="' + data.url + '" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><embed src="' + data.url + '" width="100%" height="420" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true"></embed></object>');
  }
  return(null);
}

function dailymotionParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("dailymotion.com/swf/") == 0) {
    return('<div><object width="100%" height="420"><param name="movie" value="' + data.url + '"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="' + data.url + '" type="application/x-shockwave-flash" width="100%" height="420" allowfullscreen="true" allowscriptaccess="always"></embed></object></div>');
  }
  return(null);
}

function veohParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("veoh.com/collection/") == 0) {
    return('<iframe width="500" height="450" frameborder="0" marginheight="0" marginwidth="0" src="' + data.url + '/embedded/true"></iframe>');
  }
  return(null);
}

function stickgameParser(data, url_teleports) {
  if (data.stripped_lower.indexOf("farm.stickpage.com/") == 0) {
    return('<object width="725" height="578" data="' + data.url + '" type="application/x-shockwave-flash" id="play_file_flash_embed"></object>');
  }
  return(null);
}



function vimeoParser(data, url_teleports) {
  var clip_id = null;
  if (data.stripped_lower.indexOf('vimeo.com/moogaloop.swf?') == 0) {
    var clip_id_pos = data.stripped_lower.indexOf('clip_id=');
    if (clip_id_pos != -1) {
      var params = data.stripped_lower.substring(clip_id_pos + 8);
      var amp_pos = params.indexOf('&');
      clip_id = params.substring(0, amp_pos);
    }
  } else {
    var reg = new RegExp('vimeo.com\/([0-9]+$)');
    var result = reg.exec(data.stripped_lower);
    if (result) {
      clip_id = result[1];
    }
  }
  if (clip_id != null) {
      return('<br /><object width="100%" height="411"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=' + clip_id + '&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=ff0179&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=' + clip_id + '&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=ff0179&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="100%" height="411"></embed></object>');
  }
  return(null);
}


// Matches images 
// .jpg, .png, .gif, .jpeg, .bmp
function imageParser(data, url_teleports) {
  var tester_url = data.url.toLowerCase();
  var period = tester_url.lastIndexOf('.');
  var link = false;
  if (period != -1) {
    var extension = tester_url.substr(period).toLowerCase();

    // replace all images with a linked image
    if (extension == '.png' || extension == '.jpg' || extension == '.gif' || extension == '.jpeg' || extension == '.bmp') {
      if (url_teleports) {
        return("<br /><a onmouseover='this.style.cursor=\"pointer\"' onclick='teleport(\"" + data.url + "\")'>" + 
            "<img src='" + data.url + "' /></a><br />");
      } else {
        return("<br /><a href=\"" + data.url + "\"><img src='" + data.url + "' /></a><br />");
      }
    }
  }
  return(null);
}

// Converts all urls into hyperlinks teleporting the user to that url
// this should be called last because it always returns data,
// hence canceling all later parsers
function urlParser(data, url_teleports) {
  if (url_teleports) {
    return("<a onmouseover='this.style.cursor=\"pointer\"' onclick='teleport(\"" + data.url + "\")'>" + 
            data.url + "</a>");
  } else {
    return("<a href=\"http://" + data.stripped + "\">" + data.url + "</a>");
  }
}

// strips all <object></object> blocks, replacing it with 
// the url of the video
function objectParser(message) {
  var flashvars_reg = new RegExp("(&lt;object.*?flashvars=\"vu=)([\055\/\:\@\.\;\*\?\&\=a-z0-9\_\$\+\'\(\)\,\%\#\~\]*)(\".*?&lt;\/object&gt;)", "gi");
  var src_reg = new RegExp("(&lt;object.*?src=\")([\055\/\:\@\.\;\*\?\&\=a-z0-9\_\$\+\'\(\)\,\%\#\~\]*)(\".*?&lt;\/object&gt;)", "gi");
  var msg = message;
  // test flashvars first
  do {
    var result = flashvars_reg.exec(message);
    if (result != null) {
        msg = msg.replace(result[1]+result[2]+result[3], " " + result[2] + " ");
    }
  } while (result != null);
  message = msg;
  // test src
  do {
    var src_result = src_reg.exec(message);
    if (src_result != null) {
        msg = msg.replace(src_result[1]+src_result[2]+src_result[3], " " + src_result[2] + " ");
    }
  } while (src_result != null);
  return msg;
}

function beeingAddData(element, url, url_teleports) {
  if (!url_teleports) {
    url_teleports = false;
  }
  var cont = document.createElement('div');
  cont.setAttribute('class', 'beeing_url_content');
  __BEEING_URL_COUNTER++;
  cont.setAttribute('id', 'beeing_url_content_' + __BEEING_URL_COUNTER);
  cont.setAttribute('style', "display: inline; padding: 0px; background-color: white");
  cont.innerHTML = 'Loading Beeing ...';
  element.parentNode.appendChild(cont);
  element.parentNode.removeChild(element);

  var script = document.createElement('script');
  script.setAttribute('src', 'http://www.beeing.com/url_data?url=' + escape(url) + '&format=plugin&ut=' + url_teleports + '&container=beeing_url_content_' + __BEEING_URL_COUNTER + '&callback=beeingLoadURLData');
  script.setAttribute('type', 'text/javascript');
  document.body.appendChild(script);
}

function beeingLoadURLData(data) {
  document.getElementById(data.container).innerHTML = data.data;
  var elms = $('#' + data.container + ' .chat_log_message .body .message');
  for (var x = 0; x < elms.length; x++) {
    elms[x].innerHTML = parseHyperlinks(elms[x].innerHTML, data.url_teleports);
  }
}

function beeingAjaxStateChangedSubmit() {
  if (BEEING_XML_HTTP.readyState == 4) {
    var resp = BEEING_XML_HTTP.responseText;
    if (resp.substring(0, 7) == 'success') {
      var url = resp.substring(10);
      var elm = document.getElementById(__BEEING_SUBMIT_ID);
      beeingAddData(elm, url);
    } else {
      alert(resp.substring(8));
    }
  }
}

function beeingGetXmlHttpObject() {
  var xmlhttp;
  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xmlhttp;
}

function beeingChatSubmit(element) {
  var params = '';
  for (var x = 0; x < element.childNodes.length; x++) {
    var elm = element.childNodes[x];
    if (elm.tagName == 'INPUT' || elm.tagName == 'TEXTAREA') {
      if (elm.name == 'text' && elm.value == '') {
        alert('error - text can not be blank')
        return
      }
      if (params != '') {
        params += "&";
      }
      params += elm.name + "=" + escape(elm.value);
    }
  }
  if (params != '') {
    $('.bcomchat INPUT').attr('disabled', 'true');
    $('.bcomchat TEXTAREA').attr('disabled', 'true');
    $('.bcomprivatechat TEXTAREA').attr('disabled', 'true');
    BEEING_XML_HTTP = beeingGetXmlHttpObject();
    BEEING_XML_HTTP.onreadystatechange=beeingAjaxChatStateChangedSubmit;
    BEEING_XML_HTTP.open("POST",'http://www.beeing.com/r/chat_logs/chat', true);
    BEEING_XML_HTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    BEEING_XML_HTTP.setRequestHeader("Content-length", params.length);
    BEEING_XML_HTTP.setRequestHeader("Connection", "close");
    BEEING_XML_HTTP.send(params);
    __BEEING_SUBMIT_ID = element.id;
  }
}

function beeingAjaxUploadStateChangedSubmit() {
  if (BEEING_XML_HTTP.readyState == 4) {
    var resp = BEEING_XML_HTTP.responseText;
    if (resp.substring(0, 7) == 'success') {
      var elm = document.getElementById('bcomchat');
      elm.value = resp.substring(10);
    } else {
      alert(resp.substring(8));
    }
  }
}

function beeingUploadSubmit(element) {
  var params = '';
  for (var x = 0; x < element.childNodes.length; x++) {
    var elm = element.childNodes[x];
    if (elm.tagName == 'INPUT' || elm.tagName == 'TEXTAREA') {
      if (elm.name == 'file' && elm.value == '') {
        alert('error - file can not be blank')
        return
      }
      if (params != '') {
        params += "&";
      }
      params += elm.name + "=" + escape(elm.value);
    }
  }
  if (params != '') {
    BEEING_XML_HTTP = beeingGetXmlHttpObject();
    BEEING_XML_HTTP.onreadystatechange=beeingAjaxUploadStateChangedSubmit;
    BEEING_XML_HTTP.open("POST",'http://www.beeing.com/r/uploads', true);
    BEEING_XML_HTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    BEEING_XML_HTTP.setRequestHeader("Content-length", params.length);
    BEEING_XML_HTTP.setRequestHeader("Connection", "close");
    BEEING_XML_HTTP.send(params);
    __BEEING_SUBMIT_ID = element.id;
  }
}

function beeingPrivateChatSubmit(element) {
  var params = '';
  for (var x = 0; x < element.childNodes.length; x++) {
    var elm = element.childNodes[x];
    if (elm.tagName == 'INPUT' || elm.tagName == 'TEXTAREA') {
      if (elm.name == 'text' && elm.value == '') {
        alert('error - text can not be blank')
        return
      }
      if (params != '') {
        params += "&";
      }
      params += elm.name + "=" + escape(elm.value);
    }
  }
  if (params != '') {
    $('.bcomchat INPUT').attr('disabled', 'true');
    $('.bcomchat TEXTAREA').attr('disabled', 'true');
    $('.bcomprivatechat TEXTAREA').attr('disabled', 'true');
    BEEING_XML_HTTP = beeingGetXmlHttpObject();
    BEEING_XML_HTTP.onreadystatechange=beeingAjaxChatStateChangedSubmit;
    BEEING_XML_HTTP.open("POST",'http://www.beeing.com/r/chat_logs/private_chat', true);
    BEEING_XML_HTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    BEEING_XML_HTTP.setRequestHeader("Content-length", params.length);
    BEEING_XML_HTTP.setRequestHeader("Connection", "close");
    BEEING_XML_HTTP.send(params);
    __BEEING_SUBMIT_ID = element.id;
  }
}

function beeingAjaxChatStateChangedSubmit() {
  if (BEEING_XML_HTTP.readyState == 4) {
    var resp = BEEING_XML_HTTP.responseText;
    if (resp.substring(0, 7) == 'success') {
      window.location.href = window.location.href
    } else {
      alert(resp.substring(8));
      $('.bcomchat INPUT').attr('disabled', 'false');
      $('.bcomchat TEXTAREA').attr('disabled', 'false');
      $('.bcomprivatechat TEXTAREA').attr('disabled', 'false');
    }
  }
}

function beeingAddContentSubmit(element, url) {
  var params = '';
  for (var x = 0; x < element.parentNode.childNodes.length; x++) {
    var elm = element.parentNode.childNodes[x];
    if (elm.tagName == 'INPUT' || elm.tagName == 'TEXTAREA') {
      if (params != '') {
        params += "&";
      }
      params += elm.name + "=" + escape(elm.value);
    }
  }
  if (params != '') {
    params += "&url=" + escape(url);
    BEEING_XML_HTTP = beeingGetXmlHttpObject();
    BEEING_XML_HTTP.onreadystatechange=beeingAjaxStateChangedSubmit;
    BEEING_XML_HTTP.open("POST",'http://www.beeing.com/r/chat_logs/url_data', true);
    BEEING_XML_HTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    BEEING_XML_HTTP.setRequestHeader("Content-length", params.length);
    BEEING_XML_HTTP.setRequestHeader("Connection", "close");
    BEEING_XML_HTTP.send(params);
    __BEEING_SUBMIT_ID = element.parentNode.id;
  }
}
