<?php
// $Id: insertFrame.module,v 1.1.4.5.2.1.2.2 2011/01/26 20:34:32 marcelbichon Exp $
// Author: M. Morin

global $_frameNo;
function insertFrame_theme() {
  return array(
    'insertFrame_render_url' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_height' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_id' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_offset' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_classname' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_wrapper' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_wrapper_text' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_wrapper_html' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    ),
    'insertFrame_render_wrapper_htmlpage' => array(
      'variables' => array('value' => NULL,'params' =>NULL),
    )
  );
}

function insertFrame_init() {
	drupal_add_js(drupal_get_path('module', 'insertFrame') . '/insertFrame.js');
}
function insertFrame_filter_info() {
  $filters['insertFrame_filter'] = array(
    'title' => t('Include iFrame with auto-height feature'),
    'description' => t('Include iFrame with auto-height feature.'),
    'process callback' => '_insertFrame_filter_process',
    'settings callback' => '_insertFrame_filter_settings',
    'tips callback'  => '_insertFrame_filter_tips',
	'cache' => FALSE
  );
  return $filters;
}

// Filter callbacks.
function _insertFrame_filter_process($text, $filter) {
  $use_base_prefix = false;
	if ($filter->settings['insertframe_use_base_prefix']) {
    $use_base_prefix = $filter->settings['insertframe_use_base_prefix'];
  }
	$callback = create_function('$matches','$use_base_prefix = "' .$use_base_prefix .'";
return _insertFrame_replacer($matches, $use_base_prefix);'
);

	$text = preg_replace_callback("/\[\[\[(.*?)\]\]\]/", $callback, $text);
	return $text;
}

function _insertFrame_filter_settings($form, &$form_state, $filter, $format, $defaults, $filters) {
    $settings['insertframe_use_base_prefix'] = array(
      '#type' => 'checkbox',
      '#title' => t('Relative path is always relative to base path'),
	  '#description' => t("Clean urls change current path so relative path are relative to node path. Checking this options will always make relative path to base path."),
      '#default_value' => (array_key_exists('insertframe_use_base_prefix',$filter->settings) ? $filter->settings['insertframe_use_base_prefix'] : false)
    );
    $settings['insertframe_searchable'] = array(
      '#type' => 'checkbox',
      '#title' => t('Add content to search engine'),
	    '#description' => t("Add content to search engine. Note than only first page is indexed."),
      '#default_value' => (array_key_exists('insertframe_searchable',$filter->settings) ? $filter->settings['insertframe_searchable'] : false)
    );
    return $settings;
}

function _insertFrame_filter_tips($filter, $format, $long = false) {

	$helpText = "[[[&lt;url&gt; width=&lt;w&gt; height=&lt;h&gt; scrolling=&lt;yes|no|auto&gt; className=&lt;class&gt; ID=&lt;id&gt; offset=&lt;offset&gt;]]] - insert a frame with url as source. <br/>";
	if ($long) {
		$helpText .= "    width     ==> Size as css declaration (%,px,em)<br/>";
		$helpText .= "    height    ==> Height as css declaration (%,px,em)<br/>";
		$helpText .= "                  if height=100% and url is in the same domain as web site, the height will be ajusted to the real height of the 	source<br/>";
		$helpText .= "    scrolling ==> Scrollbar settings. Values from IFRAME tag.<br/>";
		$helpText .= "    className ==> Name of a CSS class<br/>";
		$helpText .= "    ID        ==> Id and name of the frame";
		$helpText .= "    offset    ==> A number to add to correct (if needed) auto calculated height";
	}
	return t($helpText);
}


function _insertFrame_replacer($matches, $use_base_prefix = FALSE) {
	return 	_insertFrame_getHTML(trim($matches[1]), $use_base_prefix);
}

function _insertFrame_getHTML($params, $use_base_prefix = FALSE) {
	global $_frameNo;
	$output = "";
	$_frameNo++;
	$aParams = explode(" ", $params);
	$params = array (
		"url" => "",
		'width' => "100%",
		"height" => "100%",
		"scrolling" => "no",
		"frameborder" => "0",
		"id" => "iframe$_frameNo",
		"offset" => "15",
		"wrapper" => "no",
		"usebaseprefix" => $use_base_prefix
	);
	for ($i = 0; $i < count($aParams); $i++) {
		if ($i == 0) {
			$params["url"] = $aParams[$i];
		} else {
			$param = explode("=", $aParams[$i]);
			if (count($param) == 2) {
				$params[strtolower($param[0])] = trim(urldecode($param[1]),"\"' ");
			}
		}
	}

	if ($params["url"] == "") {return t("URL not set");}
	if ($params["wrapper"] == "no") {
		unset($params["wrapper"]);
		foreach ($params as $tag => $value) {
			$output = $output . insertFrame_render_tag($tag, $value, $params) . " ";
		}	
		$output =  "<iframe $output></iframe>";
	}
	else {
		$output = theme("insertFrame_render_wrapper",array("value"=> $params["wrapper"],"params" => $params));
	}
	$code = $output;
	return "$code";
}


/* Rendering functions */

function insertFrame_render_tag($tag, $value, $params = NULL) {
	$output = $tag . '="' . $value . '"';
	if (insertFrame_is_themed($tag)) {
		$output = theme("insertFrame_render_" . $tag, array("value" => $value,"params" => $params));
	}
	else {
		if (function_exists("insertFrame_render_" . $tag)) {
			$function = "insertFrame_render_" . $tag;
			$output = $function($value,$params);
		}
	}
	return $output;
}

function insertFrame_is_themed($tag) {
	return function_exists("theme_insertFrame_render_" . strtolower($tag));
}


function theme_insertFrame_render_url($vars) {
	$url = $vars['value'];
	if (function_exists("token_replace")) {
		$url = token_replace($url);
	}
  
  
  
  if (substr($url,0,4) != "http") {
	  if ($vars['params']['usebaseprefix'] == true ) {
		
		  if (substr($url,0,1) == "/" || strpos("//", $url) > 0) {
		  }
		  else {
			  $url = base_path() . $url;
		  }
	  }
  }
	return 'src="' . $url . '"';
}

function theme_insertFrame_render_id($vars) {
	return 'id="' . $vars["value"] . '" name="' . $vars["value"] .'"' ;
}

function theme_insertFrame_render_offset($vars) {
	return "";
}


function theme_insertFrame_render_classname($vars) {
	return 'class="' . $vars["value"] .'"';
}


function theme_insertFrame_render_wrapper($vars) {
	$output="";
	$content = file_get_contents($vars["params"]["url"]);
	if ($content === FALSE) {
		drupal_set_message(t("File %file% not found",array("%file%"=>$vars["params"]["url"])) ,"error");
	}
	else {
		$code = utf8_encode($content);
		$function =  "insertFrame_render_wrapper_" . $vars["value"];
		$output = insertFrame_render_tag("wrapper_" . $vars["value"],$code, $vars["params"]);
	}
	return $output;
}

function theme_insertFrame_render_wrapper_text($vars) {
	return "<pre>" . $vars["value"] . "</pre>";
}

function theme_insertFrame_render_wrapper_htmlpage($vars) {
	preg_match('`<body[^>]*>(.*)</body[^>]*>`isU', $vars["value"], $matches);
	return  $matches[1];
}

function theme_insertFrame_render_wrapper_html($vars) {
	return $vars["value"];
}


function theme_insertFrame_render_height($vars) {
	$output = 'height="' . $vars["value"] . '"';
	if ($vars["value"] == '100%') {
		$output .= " onload='adjustHeight(this," . $vars["params"]["offset"] . ")'";
	}
	return $output;
}

function insertFrame_render_usebaseprefix($vars) {
	return "";
}


function insertFrame_node_update_index($node) {
   $text = '';
   
   if (isset($node->body)) {
     $body = $node->body['und'][0]['value']; 
     $filters = filter_list_format( $node->body['und'][0]['format']);
     $filter = $filters['insertFrame_filter']; 
     $settings = $filter->settings; 
     if (array_key_exists("insertframe_searchable",$settings)  && $settings['insertframe_searchable'] && strpos($body,"[[[") !== FALSE) {
         $body = str_replace("]]]"," wrapper=html]]]",$body);
         $text = _insertFrame_filter_process($body, $filters['insertFrame_filter']);
      }
   }
   return $text;

}